打印WPF WebBrowser的内容

3

我正在尝试打印WPF WebBrowser控件的内容,以便不显示打印对话框,但是一直没有成功。

我已经尝试了以下方法,并确信它曾经起作用:

PrintDialog printDialog = new PrintDialog();
printDialog.PrintDocument(((IDocumentPaginatorSource)browser.Document).DocumentPaginator, "My App");

但出现了以下异常情况:

无法将类型为'mshtml.HTMLDocumentClass'的COM对象强制转换为接口类型'System.Windows.Documents.IDocumentPaginatorSource'。此操作失败,因为针对具有IID '{2C0C27DF-282F-3225-ADCD-CEC68F890EEB}'的接口的COM组件上的QueryInterface调用失败,原因是发生以下错误:不支持这样的接口(HRESULT为0x80004002(E_NOINTERFACE))。

我唯一能想到的电脑变化就是我最近安装了IE8,但这真的会导致程序出错吗?

3个回答

7

3

要进行无需对话框的静默打印,请使用以下代码:

private void PrintCurrentPage()
{
    // document must be loaded for this to work
    IOleServiceProvider sp = WebBrowser1.Document as IOleServiceProvider;
    if (sp != null)
    {
        Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
        Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E");
        const int OLECMDID_PRINT = 6;
        const int OLECMDEXECOPT_DONTPROMPTUSER = 2;

        dynamic wb; // should be of IWebBrowser2 type
        sp.QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, out wb);
        if (wb != null)
        {
            // this will send to the default printer
            wb.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, null, null);
        }
    }
}
[ComImport, Guid("6D5140C1-7436-11CE-8034-00AA006009FA"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
private interface IOleServiceProvider
{
    [PreserveSig]
    int QueryService([MarshalAs(UnmanagedType.LPStruct)] Guid guidService, [MarshalAs(UnmanagedType.LPStruct)]  Guid riid, [MarshalAs(UnmanagedType.IDispatch)] out object ppvObject);
}

WebBrowser silent printing


2
为了避免依赖于MSHTML,你可以简单地执行以下操作:
browser.InvokeScript("execScript", new object[] { "window.print();", "JavaScript" });

当我遇到一个WPF项目从.Net Framework迁移到.Net Core 3时,使用Tony的答案涉及到MSHTML参考时,我想出了上述解决方案。在.Net Core中引用MSHTML并不是非常直观(请参见此GitHub问题)。


非常感谢。这很棒。这个也可以用来保存页面吗? - Kingpin
这个翻译很优雅,但没有提供问题中关键的“不显示打印对话框”的部分。 - Zeus

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