基于组件模型的虚拟打印系统的研究与实现

时间:2022-10-13 05:04:12

基于组件模型的虚拟打印系统的研究与实现

摘 要:为了在第三方系统中可以方便地使用虚拟打印,在研究虚拟打印技术的基础上,按照组件模型标准提供了丰富的二次开发接口,包括安装、卸载虚拟打印机等。为快速将文档转换成图形文件,该系统采用重写Print Processor方式实现虚拟打印。目前该系统已经在多个第三方系统中得到初步的应用。

关键词:虚拟打印;打印处理机;组件模型;广播消息

中图分类号:TP271文献标识码:B

文章编号:1004-373X(2008)06-171-03オ

Research and Realization of Virtual Printer Based on Component Object Model

YI Yun

(Gannan Normal University,Ganzhou,341000,China)オ

Abstract:Base on the research of virtual printer technology,the virtual printer system provides abundant secondary exploitation interface according to COM standard,in order to conveniently use virtual printer in third party system.The interfaces include install,uninstall virtual printer etc.In order to convert document into image file quickly,the system uses rewriting Print Processor to realize virtual printer.Now there are several third party systems that use the virtual printer system.

Keywords:virtual printer;print processor;component object model;broadcast message

虚拟打印是利用某种方式截获操作系统的打印任务,将打印任务转换为图像文件并保存在指定目录的系统。通过虚拟打印系统,用户可以将任意可打印的文档转换为统一的图像文件,由一种应用程序进行浏览。因此在Web环境、多客户端情况下,客户端不需要为浏览多种应用程序的文件而安装多种应用程序,便于实现瘦客户端和降低系统的软件成本。本文通过研究比较现有的虚拟打印系统,提出建立基于组件模型的虚拟打印系统,主要介绍的技术包括:虚拟打印机的实现、虚拟打印机的安装卸载、系统二次开发接口等。

1 Windows打印系统结构

虚拟打印基于Windows打印体系,是对Windows打印系统的一种应用及拓展。微软的Windows NT系列打印体系结构由打印假脱机和一套打印驱动程序组成。

应用程序对Win32 GDI函数的调用传送到GDI图形引擎,GDI图形引擎可以将绘制指令假脱到一个EMF文件中,或者与打印驱动程序连接,向假脱机绘制一个可打印的图像。假脱机组件解释EMF文件,他们可以在数据流中插入页面布局信息以及作业控制指令。然后假脱机将数据流发送给具有目标打印机I/O端口的串行、并行或网络端口的驱动程序。其体系结构如图1所示。

2 虚拟打印系统的研究

按照获取打印任务方式的不同,可以将虚拟打印系统分为3种类型:重写Print Processor,在假托模块中实现转换,例如Mabuse.De的VPrinter;采用回调机制在打印任务发送到Spooler之前获取打印数据流,例如Northeast Data 公司的Image Printer Driver;通过监视Port Monitor获取打印任务数据,例如Adobe公司的Adobe Acrobat Writer。

图1 Windows打印体系结构

目前绝大部分虚拟打印系统都是独立的系统,使用各自的文件格式来保存打印结果,很少以组件的方式提供二次开发接口,使得上述虚拟打印系统很难与其他应用系统进行集成。本文研发的基于组件模型的虚拟打印系统,采用重写Print Processor方式实现打印任务的获取。该系统提供了丰富的二次开发接口,可以按照应用系统集成商的要求提供文档转换功能,最大限度地降低了应用系统的成本。

3 虚拟打印系统的实现

基于组件模型的虚拟打印系统主要包括2部分:打印机驱动程序模块和二次开发接口模块。其体系结构如图2所示:

图2 虚拟打印体系结构

3.1 获取打印任务

打印任务的截取,是整个虚拟打印系统的关键部分。从图1中可以看出,Print Processor负责将打印任务处理后发送到Port Monitor,Print Processor是一个可替换的DLL,安装DDK中的约定,实现以下6个函数,就可以自定义一个Print Processor。

(1) EnumPrintProcessorDatatypes,该函数主要处理并返回打印处理器所能处理的数据类型;

(2) ControlPrintProcessor,该函数主要提供方法供用户控制打印处理器,如停止、删除、重新开始打印任务等;

(3) GetPrintProcessorCapabilities,该函数主要供Windows系统获取针对某种输入数据的处理能力;

(4) OpenPrintProcessor,返回该打印处理器的句柄给系统;

(5) PrintDocumentOnPrintProcessor,处理打印任务,将处理后的数据发送到Port Monitor或者转换为图像文件等;

(6) ClosePrintProcessor,关闭打印处理器。

图3详细说明在PrintDocumentOnPrintProcessor中如何将打印任务转换为图像文件的过程。

3.2 生成指定格式、大小的图像

虚拟打印系统获取的打印页面原始数据是EMF矢量图形文件。如果转换前的文档中没有大量的图片信息,那么转换后的EMF文件是比较小的,一般1页Word转换后在20~50 k大小。因此本系统提供了配置接口供用户选择最终保存的图像格式,目前支持JPG,GIF,PNG等常用的图像格式。可以按照如下方式修改图像的格式和大小:

[ImageInfo]

ImageWidth = 1024

ImageHeight = 768

ImageType = JPG

图3 打印任务转换过程

以上信息设定后,转换生成的图片为JPG格式文件,图片宽为1 024 pixel,高为768 pixel。

3.3 封装组件,提供二次开发接口

二次开发接口是虚拟打印系统提供给第三方应用系统调用或设置的方法。良好丰富的二次开发接口,使得本系统可以快速便捷的与第三方应用系统进行集成,大大提高系统的应用范围。按照组件模型的思想,本系统中将二次开发接口封装成Activex组件,使得用户可以通过简单的JavaScript调用接口方法。

3.3.1 安装、卸载打印机接口

一般采用由最终用户通过在控制面板中选择添加打印机的方式来安装打印机。这种方法对最终用户要求比较高,不适合大规模的应用。因此,封装了一个Acitvex实现打印机的安装和卸载,使得第三方应用系统可以非常方便地安装、卸载虚拟打印机。该Activex提供以下2个方法:

(1) InstallVirtualPrint,实现安装打印机,关键部分解释如下:

bool flag;

DRIVER_INFO_3 DriverInfo3;

……………………

//添加打印驱动程序

flag=AddPrinterDriver(NULL,3,&DriverInfo3);

……………………

PRINTER_INFO_2 pPrinter;

HANDLE pHand;

……………………

//添加虚拟打印机

pHand=AddPrinter(NULL,2,(LPBYTE)&pPrinter);

if (pHand == 0)

{

//如果添加失败,返回出错代码

ClosePrinter(pHand);

return GetLastError();}

ClosePrinter(pHand);

(2) UnInstallVirtualPrint,实现卸载打印机,关键部分解释如下:

//删除打印处理器

DeletePrintProcessor(NULL,L"Windows NT x86",L"VPrint");

……………………

LPTSTR Env;

Env= L"Windows NT x86";

//删除打印驱动

DeletePrinterDriver(NULL,Env,L"VPrinter Driver");

……………………

PRINTER_DEFAULTS pd;

HANDLE hp;

ZeroMemory(&pd,sizeof(PRINTER_DEFAULTS));

pd.DesiredAccess=PRINTER_ALL_ACCESS;

if (OpenPrinter("VPrinter",&hp,&pd))

{ //删除打印机

if (false==DeletePrinter(hp))

{ //如果失败,返回出错代码

return GetLastError(); } }

3.3.2 打印机信息设置接口

为了方便第三方系统集成,打印机基本信息存储在系统INI文件中。集成用户按照标准可以非常方便地修改打印机的相关信息,例如:转换后图像文件的保存路径,当前文件的前缀等。

[FileInfo]

Directory = c:\\123

Prefix = 123

以上信息设定后,转换生成的图像文件就保存在c:\\123目录下,文件名称按以下规则形成“123_页码”。第三方系统也可以通过编程的方式动态修改配置文件。

3.3.3 图像生成事件通知接口

在第三方系统集成时,希望实时知道什么时候转换完成,什么时候转换了某一页。因此本系统采用Windows广播消息的方式来通知集成系统。广播消息是Windows系统中,不同进程之间通信最实时、最快捷的方式。广播消息分为2个步骤:利用RegisterWindowMessage函数向Windows系统注册消息句柄;利用PostMessage函数寄送消息,需要注意的是第一个参数必须为HWND_BROADCAST。集成系统可以在消息循环中获取广播的消息,以VC开发工具为例,如下过程就可以获取广播的消息:利用RegisterWindowMessage注册同一消息句柄;利用ON_REGISTERED_MESSAGE宏,映射消息句柄到消息处理函数。

4 结 语

在研究现有虚拟打印系统的基础上,指出这些系统存在的问题,研究并实现基于组件模型的虚拟打印系统。该系统具有转换快速、二次开发接口丰富等特点,并且已经应用在第三方系统中,如:iWebOffice网络文档、iSignature GDF电子签章系统。

参 考 文 献

[1]\[美\]Art Baker,Jerry Lozano.Windows2000设备驱动程序设计指南\[M\].北京:机械工业出版社,2001.

[2]\[美\]David J Kruglinski.Visual C++技术内幕\[M\].北京:清华大学出版社,2001.

[3]Documentation of Driver Development Kit (DDK) for Microsoft.Windows,2000.

作者简介 易 云 男,1983年出生,硕士。主要研究方向为网络信息安全等。

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文

上一篇:基于VB多线程技术的FTP的实现 下一篇:数字无线网络技术在实时无损检测系统中的应用