我想从C#Web服务打印HTML。 Web浏览器控件过于苛刻,在服务环境中无法正常运行,也无法在安全性受到严格限制的系统上正常运行。是否有任何类型的免费.NET
库将支持打印基本HTML页面?这是我到目前为止的代码,它运行不正常。
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脚本错误:
错误:
dialogArguments.___IE_PrintType
为空或不是对象。网址:
res://ieframe.dll/preview.dlg
出现一个小的空打印预览对话框。
答案 0 :(得分:30)
您可以使用以下命令从命令行进行打印:
RUNDLL32.EXE %WINDIR%\ SYSTEM32 \ Mshtml.dll中,PrintHTML “%1”
其中%1是要打印的html文件的文件路径。
如果您不需要从内存中打印(或者能够在临时文件中写入磁盘),您可以使用:
using (Process printProcess = new Process())
{
string systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System);
printProcess.StartInfo.FileName = systemPath + @"\rundll32.exe";
printProcess.StartInfo.Arguments = systemPath + @"\mshtml.dll,PrintHTML """ + fileToPrint + @"""";
printProcess.Start();
}
N.B。这仅适用于Windows 2000及以上版本。
答案 1 :(得分:4)
我知道Visual Studio本身(至少在2003版本中)直接引用IE dll来呈现“设计视图”。
可能值得研究。
否则,除了Web浏览器控件之外,我无法想到任何事情。
答案 2 :(得分:4)
轻松!将您的问题分成两个更简单的部分:
-print-to-default $file.pdf
在默认打印机上打印PDF文件-print-to $printer_name $file.pdf
在给定的打印机上打印PDF
答案 3 :(得分:3)
如果您已在预算中获得(〜$ 3000),请查看PrinceXML。
它将HTML呈现为PDF,在服务环境中运行良好,并支持高级功能,例如不会破坏表格单元格中间的页面(很多浏览器目前不支持)。
答案 4 :(得分:0)
也许这会有所帮助。 http://www.codeproject.com/KB/printing/printhml.aspx 还不确定您尝试从哪个线程访问浏览器控件,但它需要是STA
注意 - 链接中引用的项目允许您导航到页面并执行打印而不显示打印对话框。
答案 5 :(得分:0)
我最适合我的工具是HiQPdf。 https://www.hiqpdf.com/
价格合理(起价245美元),它可以将HTML呈现为PDF,还可以直接管理PDF文件的打印。
答案 6 :(得分:-1)
我不知道具体的工具,但有一些实用程序记录/重播点击。换句话说,您可以在打印对话框上自动“单击”。 (我知道这是一个黑客,但当其他一切都失败了......)