我知道这是许多论坛和博客上已知的话题。我读了很多文章,其中很多都很有启发性。但对我来说,似乎需要新的方法来完成这个任务。
我正在寻找在服务器端打印HTML的解决方案。但是在尝试了许多选项之后,我意识到我们
还尝试使用Crystal Report(但如何动态传递HTML内容给它,即使它不支持许多标签),itextsharp,ssrs,pdfsharp等等,但它们都不支持许多HTML标记和W3C标准。因此,我最终只能生成PDF。只有wkhtmltopdf完美地将HTML转换为PDF。与我的经验相比,它支持每个HTML标记,不像任何其他标记。但是,打印PDf是我多年来的问题。
但现在我甚至面临着使用GhostScript(我正在使用版本9.05)的问题。在localhost上,我可以完美地使用它。我可以在服务器端静默地打印来自UI的任何打印机名称。但是使用IP地址或计算机名称时,它不起作用。我甚至实现了模拟。即使在调用GhostScript时,该进程也会挂起。
现在我想要澄清的是:
提前感谢您。
问候, Pavan N
在使用Lau的建议后,我能够在命令提示符中完成操作(意味着cmd.exe在我的帐户下运行)。但是我的应用程序将在网络服务下运行。 现在我遇到了一些问题,就像这个ACCESS Denied一样。
是的。最终我能够启动该进程。我能够看到我的gswin32c.exe进程在任务管理器中以我的域凭据运行。代码如下:
我正在寻找在服务器端打印HTML的解决方案。但是在尝试了许多选项之后,我意识到我们
- 不能给出打印机名称或
- 它会像txt文件一样打印HTML原始内容
还尝试使用Crystal Report(但如何动态传递HTML内容给它,即使它不支持许多标签),itextsharp,ssrs,pdfsharp等等,但它们都不支持许多HTML标记和W3C标准。因此,我最终只能生成PDF。只有wkhtmltopdf完美地将HTML转换为PDF。与我的经验相比,它支持每个HTML标记,不像任何其他标记。但是,打印PDf是我多年来的问题。
但现在我甚至面临着使用GhostScript(我正在使用版本9.05)的问题。在localhost上,我可以完美地使用它。我可以在服务器端静默地打印来自UI的任何打印机名称。但是使用IP地址或计算机名称时,它不起作用。我甚至实现了模拟。即使在调用GhostScript时,该进程也会挂起。
现在我想要澄清的是:
- 是否可能在服务器端打印HTML或PDF(实际内容)?
- 是否有任何开源工具可以实现这一点?
- 我想动态传递打印机名称。
提前感谢您。
问候, Pavan N
在使用Lau的建议后,我能够在命令提示符中完成操作(意味着cmd.exe在我的帐户下运行)。但是我的应用程序将在网络服务下运行。 现在我遇到了一些问题,就像这个ACCESS Denied一样。
是的。最终我能够启动该进程。我能够看到我的gswin32c.exe进程在任务管理器中以我的域凭据运行。代码如下:
public bool PrintVSPDF(string ghostScriptPath, int numberOfCopies, string printerName, string pdfFileName)
{
Logger.AddToLog("printerName", printerName);
string impersonationUsername = "";
string impersonationDomain = "";
string impersonationPWD = "";
if (ConfigurationManager.AppSettings["UName"] != null)
{
impersonationUsername = Encryption.Decrypt(ConfigurationManager.AppSettings["UName"].ToString(), Encryption.DEFAULT_KEY, Encryption.DEFAULT_SEED);
impersonationDomain = impersonationUsername.Split('\\').Count() > 1 ? impersonationUsername.Split('\\')[0] : "";
impersonationUsername = impersonationUsername.Split('\\').Count() > 1 ? impersonationUsername.Split('\\')[1] : impersonationUsername.Split('\\')[0];
}
if (ConfigurationManager.AppSettings["PD"] != null)
{
impersonationPWD = Encryption.Decrypt(ConfigurationManager.AppSettings["PD"].ToString(), Encryption.DEFAULT_KEY, Encryption.DEFAULT_SEED);
}
using (Impersonation imp = new Impersonation(impersonationUsername, impersonationDomain, impersonationPWD))
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.Arguments = "-dPrinted -dNoCancel -dNOPAUSE -dBATCH -dNumCopies=" + Convert.ToString(numberOfCopies) + " -sDEVICE=mswinpr2 -sOutputFile=%printer%\"" + printerName + "\" \"" + pdfFileName + "\" ";
startInfo.FileName = ghostScriptPath;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
//startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardOutput = true;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.UserName = impersonationUsername;
startInfo.Domain = impersonationDomain;
SecureString ss = new SecureString();
for (int i = 0; i < impersonationPWD.Length; i++)
{
ss.AppendChar(impersonationPWD[i]);
}
startInfo.Password = ss;
Process process = null;
try
{
process = Process.Start(startInfo);
//Logger.AddToLog("Error VS", process.StandardError.ReadToEnd());
//Logger.AddToLog("Output VS", process.StandardOutput.ReadToEnd());
//Logger.AddToLog(process.StartInfo.Arguments.ToString(), "VS Print Arguments");
//Console.WriteLine(process.StandardError.ReadToEnd() + process.StandardOutput.ReadToEnd());
//Logger.AddToLog(process.StartInfo.FileName.ToString(), "VS Print file name");
process.WaitForExit(30000);
if (process.HasExited == false)
process.Kill();
int exitcode = process.ExitCode;
process.Close();
return exitcode == 0;
}
catch (Exception ex)
{
Logger.AddToLog(ex);
return false;
}
}
}
但是在本地主机的5030端口上运行,该过程完美执行。但是使用IP地址或机器名称时,它会卡住并抛出此错误。
对于Adobe Reader、Foxit等软件也发生了同样的情况。
( Process must exit before requested information can be determined. : at System.Diagnostics.Process.EnsureState(State state)
at System.Diagnostics.Process.get_ExitCode() )