基于IE内核的一个WEB打印实现方案

本文介绍了如何在基于IE内核的环境中实现自定义打印,包括利用IE的ExecWB接口控制打印,解决打印提示对话框和文件保存对话框,以及通过自定义打印模板设置页眉页脚、页边距等。通过API拦截和模板配置,成功实现了不受限制的WEB打印功能。
摘要由CSDN通过智能技术生成

工作需要实现一个基于IE内核的打印方案。本文将对于此方案的进行一个整体解析。由于此方案涉及自己以前未涉及的很多方面,在研究过程中学习了很多,因此在此也是做一次总结。

本文主要分为以下几个部分:

(一) 整体方案方案分析

(二) 技术难点方案解析:

1. 如何解决发起打印请求时自动跳出的打印提示对话框;

2. 如何通过自定义打印模板配置打印页眉页脚、页边距、打印纸张方向等;

3. 如何解决发起打印请求时自动跳出的打印文件保存对话框。


(一) 整体方案方案分析

目前web打印主要有以下几种方案:

1. 使用通用报表组件来完成打印。但是很多都是商用付费。

2. 使用IE自带的打印功能,加上CSS的支持。功能太弱,不支持自定义配置。需要用户手动选择打印配置。

3. 使用第三方的打印组件。免费组件比较少,而且实现不透明。对于我们来说打印组件是黑盒的。

4. 生成PDF文件。相关的库都是商用付费的。

综上几种方案都不适用于本项目,因此需要自己动手了。我们的主要需求在于可以控制页边距、页面布局(横向、纵向)、页眉页脚以及支持打印背景颜色和图像。

后来通过在msdn上找到两篇文章,《Beyond Print Preview: Print Customization for Internet Explorer 5.5》、《Print Preview 2: The Continuing Adventures of Internet Explorer 5.5 Print Customization》。经过艰难的努力,才终于解决所有的需求。


首先我们看一下IE的架构:

IExplore.exe位于最上层,当IE装载时被实例化。这个EXE使用IE的各种组件来执行HTML解析和渲染,以及其他相关功能,同时为独立的浏览器提供工具栏和框架。IExplore.exeShdocvw.dll组件的直接宿主。

Shdocvw.dll依次寄宿Mshtml.dll,当有其他的活动文档组件(例如MS Office应用),当用户导航到这些特定的文档时,可以就地装入浏览器。Shdocvw.dll提供这些和导航联系在一起的功能:就地链接、收藏夹和历史记录管理、PICS支持。改动态连接库也想宿主暴露了一些接口,以允许这些宿主可以把它当作ActiveX控件来分别寄宿。

Shdocvw.dll中有一个接口叫做IWebBrowser2,我们所见到的IE,其实上就是对该接口的一个封装。他有一个很重要的成员函数“ExecWB”,其原型如下

通过这个函数不同cmdID和cmdexecopt指定不同的值,我们可以做IE界面上几乎所有的事。其中就有我们需要的XPS文件生成功能。我们的主要方案就是利用这个接口来实现我们的打印功能。

ExecWB方法实际上是调用IOleCommandTarget接口的Exec函数,其函数原型如下:


首先,我们需要一个MicroSoft XPS document Writer,并将其设置为操作系统的默认打印机。这个xps虚拟打印机在win7之后会默认安装。

其次我们需要实现一个HTMLView对象,并通过打印命令调用ExecWB接口。MFC提供了一个CHtmlView的类,我们可以继承这个类,然后调用其ExecWB方法通过XPS虚拟打印机生成一个个XPS打印文件。

最后将生成的XPS打印文件发往真实打印机,即可实现打印。

 

但是实际运用时,会发现,调用接口后跳出一个打印页面提示对话框,然后跳出xps文件保存对话框。

此外,我们还需要想办法控制打印配置,以实现我们自己的打印页边距等需求。


(页面提示对话框以及文件保存对话框)

因此我们需要解决的就是以上三个难点。


(二) 技术难点方案分析

1. 如何解决发起打印请求时自动跳出的打印提示对话框。接下来我们仔细观察了execWB这个接口的各个参数。

第一个参数cmdID,表示执行的命令。可以在MSDN上搜索MSHTML Command Identifiers来查阅这些命令。我们在这里需要的命令参数是 IDM_PRINT——使用默认打印模板或者自定义打印模板来打印当前文档内容。我们稍后来解释打印模板。

第二个参数是命令选项,在MSDN搜索OLECMDEXECOPT可以查阅。它是一个枚举,包括以下几个值:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值