C#C#将.spl剥离成.emf文件格式

本文转发自 星球大战紫辉
http://www.cppblog.com/rawdata/archive/2009/02/23/74653.html

但C#代码达成为自家原创。https://github.com/SnailDev/SnailDev.EmfParser
欢迎star或fork

C#,重在字: 打字与印刷 SPL EMF 文件格式

Windows的假脱机打字与印刷会在Windows\System32\spool\PKoleosINE昂CoraS目录下生成.spl和.shd文件,在那之中的打印内容存贮在.spl文件中,不过.spl文件格式就好像未公开,那么怎么样才能将未知的.spl文件剥离成.emf文件呢?

率先,让我们理解一下Windows打字与印刷机制,那是微软的官网的一副打字与印刷流程图片:

C# 1

中间ISV是利用软件接口,IHV是硬件接口,左侧是XP的打字与印刷模型,左边是Vista最新的XPS打印模型,但双方能够并行转换,具有优异的包容性。可是,那里权且只关心XP系统的打字与印刷进度。

网络打字与印刷进度图:

C# 2

而是这几个图就好像还不够详细,那么请看下边一副:(摘录于诗歌:《基于关键字十二分的打字与印刷数据截获系统》):

C# 3

 

主导的思路是:
打字与印刷进度爆发时,GDI模块和打字与印刷驱动(由打印机厂商提供)举办基本的数据调换,在假脱机设置环境下,生成打字与印刷机命令文件:.spl或.emf文件,作为贰个打字与印刷池的学业,然后Windows后台打字与印刷线程处理打字与印刷作业,将数据文件送至打印机打字与印刷,打字与印刷完删除该打字与印刷文件。
好,今后赶回正题:.spl文件该怎么退出成.emf呢?看八个例证:
在WinHex中开拓3个.spl文件:
C# 4

参考:  http://www.undocprint.org/formats/winspool/spl
中部分打字与印刷结构的定义。
首先,.spl文件都以以0x00010000签名开头,然后贰个DWOPAJEROD
是emf相关区的文本偏移,第四个DWOMuranoD是文书档案描述字符串(UNICODE)的公文偏移,第八个DWO奥迪Q3D
描述的是端口表达字符串(UNICODE)。大概结构如下:
C# 5

文本尾就是其一样子:
C# 6

当定位到0x50的公文地点,读取1个DWOTiguanD数据今后,正是.emf文件初叶了。.emf文件格式是当众的,而且万分不难,是一种类EM宝马X5_XXX开口结构的严密排列,日常以EM奥德赛_HEADER(0x01)开头,以EMR_EOF(0x0E)结尾。其实大家一直未曾须要去解析.emf文件格式,Windows 
SDK有专门展现.emf文件的API,一个函数就解决:
                      HENHMETAFILE hEMF =
GetEnhMetaFile(“EMF_DumpOK.emf”);
                      PlayEnhMetaFile (dc.m_hDC, hEMF, &rc) ; 
                      DeleteEnhMetaFile (hEMF) ;
然后.spl文件还有部分事物,未来还不曾解析出来,不过.emf文件已经淡出出去了,前面包车型大巴可以先不理它。

**代码见自个儿github仓库
https://github.com/SnailDev/SnailDev.EmfParser**

相关文章