2010-09-09 63 views
5

我试图使用一个不可见的WebBrowser控件来打印一个非常简单的HTML文档。我们的应用程序要求我们能够以这种方式打印多个文档,并且它们都可以发送到不同的打印机。不幸的是,我并没有很成功地将输出转移到正确的打印机上。以编程方式更改WinForms WebBrowser控件的目标打印机

它现在的工作方式是在打印文档之前,应用程序确定要接收它的打印机,并相应地设置默认打印机。为此,它使用从WinSpool.drv导入的SetDefaultPrinter()。如果我在调试模式下执行代码,我可以清楚地看到默认打印机发生变化(并且此更改反映在控制面板用户界面中),但WebBrowser仍坚持使用原始默认打印机。

从我看到的MSDN文档中,并没有真正为这种情况提供解决方案。我将非常感谢一些关于如何以编程方式完成此任务的输入。

+0

出于好奇:你接受了我的答案,但我做了大约6不同的建议。你选择了哪种解决方案:哪一个适合你? – ChrisW 2010-09-13 12:26:42

+1

@ChrisW:抱歉,不清楚这一点。使用ActiveX APIs最终解决了这个问题。基本上,我抓住WebBrowser.ActiveXInstance对象,为PrintTemplateTeardown事件注册一个处理程序,并等待它发生,然后再考虑打印页面。有趣的是,这解决了我们使用托管WebBrowser包装控件的所有打印目标问题。感谢您的建议! – 2010-09-15 15:26:53

回答

1

鉴于您所说的,也许如果您重新启动包含Web浏览器控件的过程(或其中为网页浏览器控件的过程),在更改默认打印机后?例如,这是the kind of thing I see happening here


我想这将有可能到餐桌关闭后台进程来完成实际的打印,但我真的希望有一个简单的解决方案。

分叉我首先想到的可能是最简单的解决方案。

其他一些替代方案如下。

1)。 IE浏览器控件正在封装,通过ActiveX公开API。其中一个/这些API可能允许您指定目标打印机。 2)。一些可执行文件(我不知道IE)在注册表中有printto条目。例如,Acrobat Reader软件有其值如下条目:这是用于指定命令行,你可以用它来打印并指定(非默认)打印机的语法

""C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe"" /t "%1" "%2" "%3" "%4" 

。您也可以通过Google查询printto,参见PrintTo command in the ShellExecute。 3)。我已经实现了我自己的HTML control for .NET,这不依赖于IE。你说你的HTML(和我设想的CSS)很简单,或许是I can render it,无论是开箱即用,还是只需要额外的开发工作。我不支持打印,但打印对于用户控制来说非常容易实现。让我为你实现这个目标会花费你几百美元,但是,谁知道呢,也许这对你是值得的。这将是一个相当轻量级的解决方案,也许得到了很好的支持。如果你想进一步讨论,你可以给我发电子邮件。 4)。你也可能会发现其他控件,类似于我的,或多或少有名气/昂贵;或其他应用程序,例如OpenOffice等等。

5)。您可以考虑将HTML(以某种方式)转换为其他格式(例如PDF),为此您可以使用应用程序,从而为您提供更好的打印支持。

+0

不幸的是,有问题的应用程序是一个关键业务服务器,每次需要打印文档时都不能重新启动它。我想这将有可能摆脱后台进程的实际打印,但我真的希望有一个更简单的解决方案。 – 2010-09-09 10:13:13

+0

@MartinTörnwall - 我为我的答案添加了其他可能的解决方案。 – ChrisW 2010-09-09 10:41:06

+0

也许这篇文章可能有用: http://stackoverflow.com/questions/714507/how-do-i-programatically-change-printer-settings-with-the-webbrowser-control – 2010-09-09 10:41:47

0

我已经有完全相同的问题,并纳入this control而不是标准的.NET WebBrowser来解决它。

-1

这适用于.NET 3.5,如果不是之前

this.webBrowser1.ShowPrintDialog();