PDF文件中的图片导出
2018-01-16 19:27
399 查看
最近要做一个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可以以后再慢慢处理。
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可以以后再慢慢处理。
相关文章推荐
- pdf文件是怎么导出图片的
- java 使用itext导出PDF文件,图片文字左右布局
- 快速导出PDF文件中所有图片(使用Adobe Acrobat 10 )
- 教你怎样无损导出pdf文件中的图片
- mupdf将pdf文件中的某页导出成图片
- Java解析PDF文件(PDFBOX、itext解析PDF)导出PDF中的子图片,去除PDF中的水印
- java导出pdf文件(插入图片及信息)
- Java解析PDF文件(PDFBOX、itext解析PDF)导出PDF中的子图片,去除PDF中的水印
- java导出pdf文件(插入图片及信息)
- Java 实现 FusionCharts 图表导出图片或PDF文件功能
- 支持导出PDF文件并转换成图片格式的PDF查看控件Spire.PDFViewer
- Linux 下 将PDF文件中的文本,图片导出的方法。
- 大体积、多数量excel文件排版转换为印刷版:pdf文件中标志图片模糊问题的解决
- 如何将PDF文件页面转换为图片
- 如何把图片转换成一个PDF格式文件
- PADS导出贴片图全过程 ----输出PDF格式文件
- 关于使用Eclipse导出jar文件时图片不能显示的问题
- itext生成pdf文件---图片插入
- 将图片和文字写到pdf文件中
- ORCAD导出文件【PDF原理图】