PDF文件中的图片导出

最近要做一个PDF盖章程序,研究了一下PDF,也在网上找了不少关于PDF的工具,发现都是使用已有的iSharepText或者PDFCreater做PDF处理,于是研究了一下PDF的格式文档,其实如果只导出PDF图片还是比较简单的。

PDF文档说明中有体现了PDF是由多个PDFObject组成,再通过RootObject作为文档根节点处理页面。而图片也都是PDFObject的结构,所以只要导出所有图片类型的Object就可以了。

通过文档可以知道PDFObject都有类型标记,而图片的类型就是Image,所以只要找到所有Image类型的PDFObject就可以了。

PDF文档结尾处有个固定结构的标记,叫startxref,用来标记xref表所在的字节位置,而这个xref就是所有PDFObject的起始字节位置的表,所以只要分析出每个Object起点,再找到/Type和/Image作为标记的Object,把Object对应Stream导出就可以了。

Image对应的Stream有不同编码方式,目前已知的有/CCITTFaxDecode模式和/DCTDecode模式,分别对应了CCIT4和JPG的编码,不过对于/CCITTFaxDecode模式只有数据,需要自己给流结构增加Tiff文件头和文件结尾,再保存就可以识别为tiff,而DCTDecode是可以直接保存为jpg文件的。

xref在PDF1.4版本是使用了一个固定格式的文本来表示,第一行表示起始对象编号和对象数量,第二行开始为对象起始字节位置,对象子版本号,对象是否有效三个部分总共20个字节,用空格分开的。而到了PDF1.5xref就可以用一个PDFObject来表示,这个PDFObject可以用一个压缩流和一个编码来处理一个Stream,处理时根据PDFObject的DcodeParams 来设立解码的参数,处理结束的Stream转成字节组后根据/Index和/W来获取xref表的数据。W表示了每组xref数据的字节数,比如[1 2 0]表示第一个字段一个字节,第二个字段2个字节,第三个字段0字节,再根据第一个字段的内容来确认后面的字节如何表示数据起点,第一个字段只有3中数据,0表示未使用的PDFObject,1表示在使用的PDFObject,2表示压缩的对象编号而非对象起始位置。后面的字节根据w设置的字节数表示一个地址数字,高位在前,地位在后的字节组。

通过这些设置就可以分析出所有PDFObject,再根据Image对应的编码模式判断是否需要增加tiff文件头来保存流。如果只是为了导出Image这些就够了,至于写PDF可以以后再慢慢处理。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页