虚拟打印机方案1实现笔记.(printer process)

1.下载一个打印驱动.并修改里面的INF文件.

2.修改DDK 里面的例子 genprint, 并使用ddk里的build命令直接build.
  (顺带说一下,执行build程序要先执行Windows XP Checked Build Environment 这样的环境设置BAT)
  修改的地方是:winprint.c 里的 PrintDocumentOnPrintProcessor 函数,将其中 调用PrintEMFJob的地方更改为我们处理的函数.
  一般会将这个函数放在另一个DLL中.
  
3.更改注册表,使其spl文件名根据job id生成.这样我们通过其JOB ID就可以得到相应的SPL文件.
  参考:http://www.undocprint.org/winspool/spool_files#reading_job_data 里面的 Force JobID in Spoolfile names

4.通过spl文件结构,获取EMF文件。

5.把EMF文件转换为其它图片文件。

  
QA:
Q:如何修改打印驱动?我对里面的驱动格式一点都不熟悉。
A:不用改了,我用的是HP LaserJet 4驱动,下载地址:
  http://h50176.www5.hp.com/support/C2001A/more_info_soar_lj631sc.html
   
  以下是inf内容:
/inf start///
;Hewlett-Packard LaserJet combined printer driver INF file for Windows XP and 2000
;Copyright Hewlett-Packard 2001
; List of supported printers, manufacturers
[Version]
Signature="$Windows NT$"
Provider=%虚拟打印%
ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318}
Class=Printer
DriverVer=1/18/2002,02.00.12.02
; Manufacturer section.
;
; This section lists all of the manufacturers
; that we will display in the Dialog box
[Manufacturer]
%虚拟打印%=DefaultInstall

;
; MS Driver Core installs
;
; These sections are used by Printer OEMs to install MS provided drivers
; Installer Sections
;
; These sections control file installation, and reference all files that
; need to be copied. The section name will be assumed to be the driver
; file, unless there is an explicit DriverFile section listed.
;
; Note: Pulling HPLJ4.GPD via Needs= directive to get pcl5eres.dll from XP
;       drivers.cab file due to XP defect whereby this file wasn't listed
;       This also takes care of pjlmon.dll, ttfsub.gpd, UNIDRV sections
;       but unavoidably brings with it the unneeded hplj4.gpd file.
;      
;   In the case of the LJ4 install does Needs=HPLJ4.GPD overwrite the
;   just copied newer version of hplj4.gpd??? In this case perhaps, use
;   Needs=HPLJ4L.GPD to avoid this issue?
;
; Phase II GPDs
[DefaultInstall]
"虚拟打印机"                 = HPLJ4L.GPD.XP        ,Hewlett-PackardLaserC029,HP_LaserJet_4L
;Hewlett-PackardLaserC029是设备的ID
;
; XP
;Old CopyFiles statement before use of Includes= & Needs= ...
;CopyFiles=HPPRPROC,UI,RENDER,@HPLJ4.GPD,@hpc02.ini,RES_COMMON,HELP,UNIDRV,PJLMON.DLL,@TTFSUB.GPD
[HPLJ4L.GPD.XP]
CopyFiles=HPPRPROC,@HPLJ4L.GPD,@hpcstr02.dll
Include=NTPRINT.INF
Needs=HPLJ4.GPD
DataSection=HP_UNIDRV_BIDI_DATA
DataFile=HPLJ4L.GPD
PrintProcessor=%PRINT_PROCESSOR%

; Copy Sections
;
; Lists of files that are actually copied. These sections are referenced
; from the installer sections, above. Only create a section if it contains
; two or more files (if we only copy a single file, identify it in the
; installer section, using the @filename notation) or if it's a color
; profile (since the DestinationDirs can only handle sections, and not
; individual files).

[RES_COMMON]
pcl5eres.dll
hpcstr02.dll

[HPPRPROC]
genprint.dll,,,0x00000020

;
; Data Sections
;
[HP_UNIDRV_DATA]
DriverFile=UNIDRV.DLL
ConfigFile=UNIDRVUI.DLL
HelpFile=UNIDRV.HLP
; Data section that attaches PJLMON as the driver Lang Monitor
[HP_UNIDRV_BIDI_DATA]
DriverFile=UNIDRV.DLL
ConfigFile=UNIDRVUI.DLL
HelpFile=UNIDRV.HLP
LanguageMonitor=%PJL_MONITOR%

;
; Call SetupSetDirectoryId with 66000 to set the target directory at runtime
; (depending on which environment drivers are getting installed)
;
[DestinationDirs]
DefaultDestDir=66000
HPPRPROC=66001
PJLMON.DLL=66002
;
; Control Flags
;
[ControlFlags]
ExcludeFromSelect = HWP20D0, HWP21A0, HWP2140, HWP20F0
;
;  Source Disk Section
;  This was added to enable Web Point&Print.
;  All files added to this must also be added to Layout.INF
;
[SourceDisksNames]
1=%DiskID1%,,,""
[SourceDisksFiles]
;
; MS Files
;
PCL5ERES.DLL = 1
UNIDRV.DLL   = 1
UNIRES.DLL   = 1
UNIDRVUI.DLL = 1
STDNAMES.GPD = 1
UNIDRV.HLP   = 1
TTFSUB.GPD   = 1
;
; Phase II
;
HPCUI02.DLL  = 1
HPCRD02.DLL  = 1
HPCFNT02.DLL = 1
HPCSTR02.DLL = 1
genprint.dll  = 1
HPCLJX02.HLP = 1
HPC02.INI    = 1
HPOEMUI.DLL  = 1
HPCMBOX.INI  = 1
HPLJ4L.GPD   = 1
;
; Localizable Strings
;
[Strings]
PrinterClassName="Printers"
DiskID1="虚拟打印安装盘"
PJL_MONITOR="PJL Language Monitor,PJLMON.DLL"
;PRINT_PROCESSOR="HPPRN02,hpprn02.dll"
PRINT_PROCESSOR="Vprint,genprint.dll"
虚拟打印="虚拟打印"

//inf end//




Q:为什么我在打印的时候, PrintDocumentOnPrintProcessor 没有被调用?
A:可能是因为在你的虚拟打印机设了脱机的原故,当时我就碰到了.
  

Q:如何方便调试.
A:因为genprint.dll是被Print服务占用的,因此,替换的时候需要停止改服务.
  Net Start "Print Spooler"
  Copy file file
  Net Stop  "Print Spooler"

Q:从SPL中分离出EMF文件需要注意什么吗?
A:一定会用到的三个结构 SPL_HEADER(SPL头)、SMR(SPL记录)、ENHMETAHEADER(EMF头).

Q:我不能用acdsee等软件打开分离出的EMF,但为什么用IE是可以打得开的?
  也许你用的是SMR::nSize 来做为EMF的write size
  而不是使用ENHMETAHEADER::nBytes 来做为EMF的write size
  
Q:我想通过GDI+把EMF文件转为BMP,为什么文字部份显视黑屏?
A:不知道,我是用IPicture 读取,并且Render到DC后再保存为BMP的,这样也不行,在Render内存的时候就不行了。
   最后我用的是CXImage 这个库做的转换.

Q:最后我的OFFICE 2007里面的文字打印出来被挤得变形了。
A:嘿嘿嘿,其实我已经放弃了这个方案了。使用OEMDLL里面的Bitmap例子来实现了。

网上的资料:
http://www.undocprint.org                               95%以上的资料来源.
http://www.microsoft.com/india/msdn/articles/130.aspx   有个专门的函数取得相关的SPL文件名.
http://fxh7622.blog.51cto.com/63841/d-3                 最先找到的网址,里面的例子部分是用DELPHI的,我的INF文件就是从这里拷的


posted on 2008-12-22 18:03  鹿哥 阅读(1390)  评论(2)   编辑  收藏  引用

FeedBack:
#  re: 虚拟打印机方案1实现笔记.(printer process) 2009-10-17 21:44  codewarrior
vista下可用么?   回复   更多评论
  
#  re: 虚拟打印机方案1实现笔记.(printer process)  2009-10-20 17:55  silekey
@codewarrior
没试过,后面我是直接通过DDK里的Bitmap例子来做的,不过我想应该可以吧.   回复   更多评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Foxit PDF Printer是一种虚拟打印机,它可以帮助用户将任何形式的文档转换成PDF格式的文件。用户可以将文件直接打印到Foxit PDF打印机上,然后选择输出路径和文件名,就可以将文档以PDF格式保存到电脑上。这种虚拟打印机非常方便,对于需要频繁转换文件格式的用户来说,效率非常高,并且在转换后的PDF文件中保留了原始文件的格式和排版,使得PDF文件更清晰易读。 在使用Foxit PDF Printer时,用户可以选择不同的输出质量、压缩比例等选项,以满足不同的需求。同时,它还支持密码保护、水印等功能,可以保护PDF文件的安全和私密性。这种虚拟打印机比其他在线PDF转换工具更加稳定可靠,因为它完全在本地电脑上运行,不需要联网或上传文件到云端。 总之,Foxit PDF Printer是一款功能强大的虚拟打印机,可以帮助用户将各种文档格式转换成PDF格式,非常方便实用。它对于需要频繁转换文件格式的个人用户、企业用户等都非常适用。 ### 回答2: Foxit PDF Printer虚拟打印机是一款能够将各种文档转换成PDF格式的软件工具。它类似于一台打印机,可以在计算机上创建一个虚拟打印机设备,用来生成PDF文件。使用此打印机打印的任何文件都会被默认转换成PDF格式,可以将其保存到本地计算机的任意文件夹内。 此虚拟打印机具有很多优点。首先,它可以简化文件格式转换的过程,使得用户能够更容易地将不同类型的文件转换成PDF。其次,使用此软件工具可以保证生成的PDF文件具有较高的质量和可读性。此外,使用此虚拟打印机无需安装任何Adobe Acrobat等第三方软件,使用便捷简单。 总的来说,Foxit PDF Printer虚拟打印机是一款非常实用的软件工具,特别是在需要将文件转换成PDF格式的时候。相比其他类型的PDF转换工具,此虚拟打印机更加简便易用,而且具有高性能和出色的可靠性。如果你需要把文件转换成PDF格式,建议你考虑使用此虚拟打印机软件。 ### 回答3: Foxit PDF Printer 是一款虚拟打印机,能够将任何电脑上的文档或文件转换成 PDF 格式,具有可靠和高效的转换功能。在使用 Foxit PDF Printer 之前,先要将其安装在计算机上,然后在文档需要打印成 PDF 格式时,选择 Foxit PDF Printer 作为打印机即可。 与传统打印机不同的是,Foxit PDF Printer 不需要额外的硬件,只需要在计算机上安装相应的软件即可。将文档打印成 PDF 格式后,可以在任何设备上进行查看和打印,并且不会改变文件的布局和格式。因此,Foxit PDF Printer 是非常便捷和实用的软件。 在实际应用中,Foxit PDF Printer 能够为用户节省时间和纸张成本,也可以提高效率和安全性。例如,可以用 Foxit PDF Printer 快速地将多个文档合并成一个 PDF 文件,也可以将重要的电子文件进行加密和保护。 总之,Foxit PDF Printer 是一款功能强大的虚拟打印机,能够帮助用户实现各种 PDF 转换和处理操作,同时还具有便捷、实用和高效的特点,很值得用户使用和推荐。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值