WebBrowser控件无法从C#打印

4
我在WinForms应用程序中使用了WebBrowser控件,它正在加载转换为HTML/CSS的XML。如果我只想在那里或常规浏览器中查看它,它看起来很漂亮。
当表单加载时,它应该导航到文件,然后在OnDocumentCompleted事件触发时,应该在注册表中设置标题、页脚和默认打印机名称,然后根据用户指定的份数调用Print()方法。
我已经通过调试器运行了它,并且在OnDocumentCompleted事件中正确地调用了webBrowser.Print()方法多次。没有任何东西是null的,Visible属性在WebBrowser控件上为true,AllowNavigation也为true。是的,打印机已经开启并且可以通过网络访问。完全相同的代码在项目的其他地方工作正常,但在这里不行。
还有什么可能会导致这个可怕的控件忽略我的打印命令吗?
理想情况下,我希望整个控件都隐藏在屏幕外,因为这是使用Windows Scheduler运行,用户不应该看到它。我已经阅读过控件需要可见,所以在解决这个问题之前,可以等待一段时间。
编辑:我的OnDocumentCompleted事件处理程序的最后两行将DialogResult设置为OK并关闭了表单。删除对Close()的调用后,它可以打印,所以我猜在表单关闭和WebBrowser控件被释放之前,它没有到达打印池。
除了设置一个任意的时间限制来等待关闭之外,还有没有其他方法来判断打印何时完成?
3个回答

4

原来是一个时间问题,表单在将文档发送到打印池之前就关闭了。我最终在表单中添加了一个计时器,设置为30秒,并使其Tick()事件关闭表单。在以前关闭表单的地方,现在只需调用closeTimer.Start()。


1
这取决于作业到达 spooler 的时间长短,这假设您不需要处理大型作业并且打印系统的可用性高。如果您必须走这条路,您可以只将线程休眠30,然后关闭表单。更好的做法是基于打印作业状态的高级控制,以确保作业被打印。 - Yuan

3

试试这个:

mshtml.IHTMLDocument2 doc;
doc = oWeb.Document;        
doc.execCommand("Print", True, Nothing);

来自编辑:

可以使用SHELL命令来检查打印队列中作业的状态。


无法将webBrowser.Document(HTMLDocument)转换为任何IHTMLDocument *接口之一。 HTMLDocument确实具有自己的ExecCommand,我使用了您的建议进行调用。无论我将showUI设置为true还是false,都没有任何反应。 - Chris Doggett
你可能需要使用“(IHTMLDocument2)oWeb.Document;”显式地将Document对象转换为IHTMLDocument2对象。另外,请确保在你的项目中引用了MSHTML dll。无论如何,这就是我打印浏览器控件内容的方式。 - Stephen Wrighton

0

这是我发现的从字符串打印HTML的最佳方法

void PrintString(string strHTMLText)
{
    WebBrowser wbPrintString = new WebBrowser() { DocumentText = string.Empty };
    wbPrintString.Document.Write(strHTMLText);
    wbPrintString.Document.Title = "Type The Header You Want Here";
    Microsoft.Win32.RegistryKey rgkySetting = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Internet Explorer\\PageSetup", true);
    rgkySetting.SetValue("footer", "Type THe Footer You Want Here");
    rgkySetting.Close();
    wbPrintString.Parent = this;
    wbPrintString.ShowPrintPreviewDialog();
    wbPrintString.Dispose();

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接