我想从 C# Web 服务打印 HTML。 Web 浏览器控制是多余的,在服务环境中不能很好地运行,在安全约束非常严格的系统上也不能很好地运行。是否有任何类型的免费 .NET 库可以支持基本 HTML 页面的打印?这是我到目前为止的代码,它不能正常运行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public void PrintThing(string document)
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
Thread thread =
new Thread((ThreadStart) delegate { PrintDocument(document); });
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
else
{
PrintDocument(document);
}
}
protected void PrintDocument(string document)
{
WebBrowser browser = new WebBrowser();
browser.DocumentText = document;
while (browser.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
browser.Print();
} |
当从 UI 类型的线程调用时,这工作正常,但从服务类型的线程调用时没有任何反应。将 Print() 更改为 ShowPrintPreviewDialog() 会产生以下 IE 脚本错误:
Error: dialogArguments.___IE_PrintType is null or not an object.
URL: res://ieframe.dll/preview.dlg
然后会出现一个小的空白打印预览对话框。
您可以使用以下命令从命令行打印:
rundll32.exe
%WINDIR%\\System32\\mshtml.dll,PrintHTML
"%1"
其中 %1 是要打印的 HTML 文件的文件路径。
如果您不需要从内存中打印(或者可以在临时文件中写入磁盘),您可以使用:
1 2 3 4 5 6 7 8
| using (Process printProcess = new Process())
{
string systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System);
printProcess.StartInfo.FileName = systemPath + @"\
undll32.exe";
printProcess.StartInfo.Arguments = systemPath + @"\\mshtml.dll,PrintHTML""" + fileToPrint + @"""";
printProcess.Start();
} |
注意我认为这只适用于 Windows 2000 及更高版本。
我知道 Visual Studio 本身(至少在 2003 版本中)直接引用 IE dll 来呈现"设计视图"。
这可能值得研究。
否则,我想不出除了 Web Browser 控件之外的任何东西。
简单!将您的问题分成两个更简单的部分:
将 HTML 呈现为 PDF
打印 PDF (SumatraPDF)
-
-print-to-default $file.pdf prints a PDF file on a default printer
-
-print-to $printer_name $file.pdf prints a PDF on a given printer
如果您有预算(约 3000 美元),请查看 PrinceXML。
它将 HTML 呈现为 PDF,在服务环境中运行良好,并支持高级功能,例如在表格单元格中间不破坏页面(许多浏览器目前不支持)。
对我来说效果很好的工具是 HiQPdf。 https://www.hiqpdf.com/
价格合理(245 美元起),它可以将 HTML 渲染为 PDF,还可以直接管理 PDF 文件的打印。
也许这会有所帮助。 http://www.codeproject.com/KB/printing/printhml.aspx
也不确定您尝试从哪个线程访问浏览器控件,但它需要是 STA
注意 - 链接中提到的项目确实允许您导航到页面并执行打印而不显示打印对话框。
我不知道具体的工具,但是有一些工具可以记录/重放点击。换句话说,您可以自动执行打印对话框上的"点击"。 (我知道这是一个 hack,但是当所有其他方法都失败时......)