在没有DocumentViewer的情况下显示HTML文档的打印预览 [英] Displaying Print Preview of HTML Document without DocumentViewer

查看:345
本文介绍了在没有DocumentViewer的情况下显示HTML文档的打印预览的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个C#/WPF应用程序,其中需要显示HTML文档的打印预览-基本上就像在Firefox或IE中查看打印预览时看到的一样.我了解DocumentViewer,但是,我试图远离使用DocumentViewer控件,因为它似乎非常慢,并且我需要显示的某些文档可能超过450页,并且我想尽快加载预览尽可能.有人知道做这样的事情的优雅方法吗?我开始假设我需要创建自己的控件,但是我真的对从哪里开始感到迷茫.

I have a C#/WPF application in which I need to display a print preview for an HTML document -- essentially just like what one would see if looking at a print preview in Firefox or even IE. I know about DocumentViewer, however, I am trying to stay away from using a DocumentViewer control as it seems to be pretty slow and some of the documents I need to display can be upwards of 450+ pages and I want to load the preview as quickly as possible. Does anyone know of an elegant way of doing something like this? I'm starting to assume I'll need to create my own control, but I'm really at a loss for where to get started.

感谢您提供任何有关此类操作的建议或技巧!

Thank you for any advice or tips you can provide for doing something like this!

推荐答案

您可能想使用WebBrowser控件并使用此处提供的示例对其进行扩展:

You might want to use the WebBrowser control and extend it using the example provided here: http://www.codeproject.com/KB/miscctrl/wbp.aspx

[更新了答案,以说明如何使用WPF WebBrowser控件(System.Windows.Controls.WebBrowser)实现相同的操作

[ updated the answer to illustrate how to accomplish the same using the WPF WebBrowser control (System.Windows.Controls.WebBrowser)]

底层控件是相同的-它是SHDocVw.dll中的ActiveX组件.

The underlying control is the same - it's the ActiveX component in SHDocVw.dll.

我为您整理了一些更好的参考URL.事实证明,从MSDN文档中为控件做类似的事情有一个很好的线索: http://msdn.microsoft.com/zh-CN/library/system.windows.controls.webbrowser(v=vs.90).aspx#4 还有一个: http://support.microsoft.com/kb/329014 .

I pulled together some better reference URL's for you. Turns out there's a pretty good lead on doing something similar from the MSDN documentation for the control: http://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser(v=vs.90).aspx#4 There's also this: http://support.microsoft.com/kb/329014.

您需要添加对SHDocVw的引用,该引用在COM引用列表下为"Microsoft Internet Controls".

You'll need to add a reference to SHDocVw, which is under the COM reference list as "Microsoft Internet Controls"

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("6d5140c1-7436-11ce-8034-00aa006009fa")]
internal interface IServiceProvider
{
    [return: MarshalAs(UnmanagedType.IUnknown)]
    object QueryService(ref Guid guidService, ref Guid riid);
}
static readonly Guid SID_SWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");

void webBrowser_LoadCompleted(object sender, NavigationEventArgs e)
{
    IServiceProvider serviceProvider = null;
    if (webBrowser.Document != null)
    {
        serviceProvider = (IServiceProvider)webBrowser.Document;
    }

    Guid serviceGuid = SID_SWebBrowserApp;
    Guid iid = typeof(SHDocVw.IWebBrowser2).GUID;

    object NullValue = null;

    SHDocVw.IWebBrowser2 target = (SHDocVw.IWebBrowser2)serviceProvider.QueryService(ref serviceGuid, ref iid);
    target.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINTPREVIEW, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref NullValue, ref NullValue);
}

XAML:

<Window x:Class="StackOverflowWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
    <Grid>
        <DockPanel LastChildFill="True">
            <WebBrowser Name="webBrowser"  Source="http://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser.aspx" LoadCompleted="webBrowser_LoadCompleted">
            </WebBrowser>
        </DockPanel>
    </Grid>
</Window>

对WinForms控件版本(System.Windows.Forms.WebBrowser)感兴趣的任何人都可以跳过所有IServiceProvider包,而仅使用ActiveXInstance属性(WPF控件不会公开此属性:

Anyone interested in the WinForms control version (System.Windows.Forms.WebBrowser) can skip all the IServiceProvider baggage and just use the ActiveXInstance property (which the WPF control doesn't expose:

SHDocVw.WebBrowser target = webBrowser.ActiveXInstance as SHDocVw.WebBrowser;
target.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINTPREVIEW, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, null, null);

这篇关于在没有DocumentViewer的情况下显示HTML文档的打印预览的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆