Web Services 如何从Web服务打印HTML文档?

aor9mmx1  于 2023-04-12  发布在  其他
关注(0)|答案(6)|浏览(211)

我想从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
并出现一个小的空打印预览对话框。

7fyelxc5

7fyelxc51#

可以使用以下命令从命令行打印:
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();
}

我想这只适用于Windows 2000及以上版本。

ktecyv1j

ktecyv1j2#

我知道Visual Studio本身(至少在2003年版本中)直接引用IE dll来呈现“设计视图”。
也许值得调查一下。
否则,我想不出Web浏览器控件之外的任何东西。

qlvxas9a

qlvxas9a3#

简单!把你的问题分成两个简单的部分:

  1. render the HTML to PDF
    1.打印PDF(SumatraPDF)
  • -print-to-default $file.pdf在默认打印机上打印PDF文件
  • -print-to $printer_name $file.pdf在给定打印机上打印PDF
chhkpiq4

chhkpiq44#

如果你的预算是3000美元左右,那么请查看PrinceXML
它可以将HTML渲染成PDF,在服务环境中运行良好,并支持高级功能,例如不会在表格单元格中间断开页面(目前许多浏览器都不支持)。

lndjwyie

lndjwyie5#

我的工具,工程非常适合我是HiQPdf. https://www.hiqpdf.com/
价格是合理的(起价245美元),它可以将HTML渲染为PDF,也可以直接管理PDF文件的打印。

rekjcdws

rekjcdws6#

也许这会有帮助。http://www.codeproject.com/KB/printing/printhml.aspx也不确定你试图从哪个线程访问浏览器控件,但它需要是STA
注意-链接中引用的项目允许您导航到页面并执行打印,而不显示打印对话框。

相关问题