1.1 PDF 文件图像分类

PDF 文件中的图像分为两类:①图像外部对象(XObject):在内容流 (content stream) 之外定义的一个有名字的被引用对象。一个XObject的内部阐述依赖于它的类型;②内嵌图像(in-line image):直接把图像属性和数据嵌在一个内容流里的小图像。能用这种方式呈现的图像种类是有限的,通常该图像大小在 4 KB 之内。

2 从 PDF 文件中提取可供识别的图像2.1 处理流程      PDF 文件中识别图像的关键是定位图像在 PDF 文件中具体位置,定位的步骤分为独立的6层,层与层之间相互联系,      图 3 从 PDF 文件中找到要处理的图像信息的流程2.2 处理 PDF 文件      处理 PDF 文件的步骤如下:      步骤 1 处理文件头,获得版本信息,判断是否是程序支持的版本。      步骤 2 处理交叉引用表和追踪部分。      步骤 3 处理目录对象。      步骤4 处理页树,用已读出的页根对象标志查对象信息记录表,获得页根对象的偏移,从而在文件中找到页根对象。由页根对象的Count项得到文档中现有页的总数,为页记录表分配空间。页记录表用于在程序中依次记录文档现存各页对应的页对象标志。从页根开始用递归的方法遍历页树并填写页记录如图 4 所示。    步骤5 建立图像对象记录表,图像对象记录表用于在程序中按照图像在文件被浏览时出现的先后顺序记录图像XObject(不包括非识别的缩略图、备用图像或图像遮罩) 的对象标志信息。建立图像对象记录表过程如下:    ?用这个对象标志查对象信息记录表,获得页对象的偏移,从而在文件中找到这个页对象;    ?查看这个页对象中是否写出了资源项;    ?如果写出了资源项,则在资源字典中查看是否有XObject 项,如果存在,查看 XObject 流中是否提及图像对象,并依次把图像对象间接引用中的对象标志填入图像对象的记录表中。    资源项是一个页对象必须具有的,是可以继承的。但这里只在页对象中查找资源项,查找资源项只是为获得一个页中的XObject(一个可选项),而一个页的资源中如果有XObject,这种资源应该是这页独有的资源,不应是继承过来的。PDF文件中若存在缩略图、备用图像或图像遮罩,也可以用图像XObject 描述。这几类图像不是图像识别时所要处理的,所以不应把对应图像 XObject 的对象标志信息存入图像对象记录表。在页对象的资源字典中 XObject 流里列出的 XObject 间接引用里,并不包括对它们的间接引用,所以按所述方法填写图像对象记录表是不会填入图像标志信息的。图像信息表里的图像标志信息,是按浏览器打开文件后,图像在文档中出现的顺序填入。    步骤 6 定位图像,步骤如下:    ?读图像 Xobject;    ?读图象内容,记录图像相关属性 (也包括流数据的长度)、图像数据在 PDF 文件中的偏移量以及所使用的过滤器,如果过滤器有参数,也记录相应的参数。通常,流数据在这里不涉及外部文件;    ?对找到的图像是否能够识别的判断,通常,图像识别对图像的大小有一定的要求,图像的宽、高都要在一定范围内。    对不符合要求的图像不做进一步的处理。有些图像流数据使用的过滤器可能对应声明了版权的压缩和解压缩算法,对于这种情况涉及的图像也不做进一步的处理。

3 图像识别后的处理3.1 转化出可供识别的图像文件    目前,多数图像识别软件可以识别的图像格式有 BITMAP、TIFF 和 JPEG。  (1)如果一个图像 XObject 没有使用过滤器,那么就利用记录的图像对象的属性填写要输出的BITMAP文件的头信息,然后直接把没有经过编码的图像流数据填写到要输出的BIT-MAP 文件中相应的图像数据区域。  (2)如果图像 XObject 使用了过滤器,那么输出可供识别的图像文件有两种途径:    ?全解码法:利用记录的图像对象的属性填写要输出的BITMAP文件的头信息,用过滤器所指定的解码算法把图像数据流解码,用解码后的图像流数据填写输出文件中的图像数据区;    ?选择解码法:有些过滤器对应于图像识别软件所能识别的图像格式所采用的压缩算法。    如果图像对象使用的是这种过滤器时,可不做数据解码。根据这种过滤器的类型,决定输出文件类型,利用记录的图像信息,填写这种格式输出文件的头和涉及的其它信息表,将没有经过解码的图像流数据,直接填写到输出图像文件数据区中。如果过滤器不对应于识别软件所能识别的文件压缩算法,那么就采取解码输出 BITMAP 的方式。3.2 可供识别的图像文件的制作过程    本示例 将要讲述 当一个 要处理的 图像 XObject 使 用CCITTFaxDecode作为过滤器时如何制作可供识别的输出文件。    PDF 中使用的 CCITTFaxDecode 过滤器对应于用 Group 3或 Group 4 CCITT 编码的数据。这些标准恰好包括在 TIFF 格式图像文件所采用的压缩算法中。对于这种情况既可以采取完全解码法,又可以采取选择解码法。本示例采用选择解码法对输出图像文件进行制作,其中涉及到 TIFF 6.0 图像文件的格式。3.3 制作可供识别的输出文件    制作可供识别的输出文件,步骤如下:    步骤 1    写文件头。①写 49H 49H 42H 00H 到第 0~3 字节,表示采用低位字节在前的方式写 TIFF 文件,并与以前版本兼容。②下 4 个字节写 IFD 的偏移量,其值可用下面的式子指定:    IFD 的偏移量 = 8 + 图像流数据长) + 1)>> 1 << 1                    ((    其中的移位运算是为了保证 IFD 开始于字边界。    步骤 2 写图像数据。把 PDF 中图像流数据写到输出文件中(从第 8 个字节处开始写)。    步骤 3 填写 IFD。根据 IFD 偏移量,把输出文件的读写指针移动到 IFD 的开始位置。在开始的两个字节写入一个hort 型的 B,表示要写 11 个标签。TIFF 中有很多种标签,但是写入这里所列出的 11 个标签就可以正确显示出图像。要根据已记录的图像属性及过滤器参数填写如下标签    ImageWidth ImageLength Compression PhotometricInterpre-ation StripOffsets RowsPerStrip StripByteCounts XResolutionYresolution T4Options 或 T6Options) ResolutionUnit 注意,写                    (                              (入 4 个字节的 0 表示没有下一个 IFD。              )

4 结束语    PDF 文件中可以使用多种过滤器,但是有些过滤器的编码解码算法涉及版权,比如 LZWDecode。所以对于使用这类过滤器的图像就无法通过解码的方式来提取出可供识别的图像文件。    虽然 PDF 文件允许使用多种过滤器,但实际上各种过滤器通常有比较固定的应用场合,有些过滤器很少用于处理图像流数据。通常情况下使用 CCITTFaxDecode 或 DCTDecode两种过滤器处理来图像流数据。

这应该是《 PDF 文件中可识别图像的提取(Extraction of recognizable images from PDF file)》书中的。

PDF 中图片的提取相关推荐

  1. python 两种提取pdf中图片的包

    项目需求,提取pdf中图片,找半天的结果 1.fitz (我没找到元素定位的方法) pip install pymupdf import fitzdef extract_pic_from_pdf(pd ...

  2. 在线提取PDF中图片和文字

    无需下载软件,你就可以在线提取PDF中图片和文字,http://www.extractpdf.com/不仅可以获取本地PDF文档的图片和文字,还能获取远程PDF文档的图片和文字. 结果本人测试,该工具 ...

  3. pdf中矢量图提取出来,插入visio 或者 word,保持矢量图特性,十分清晰;

    文章目录 裁剪pdf 设置裁剪框 提取,选择对应裁剪的页提取 另存为为.eps 在线工具eps->转换svg svg 直接拖进visio即可 visio 中取消组合后就可以编辑了 最后想复制进w ...

  4. ITEXT-定位PDF中图片的坐标与页码

    问题场景: 用itext自动生成PDF的过程中,想要在PDF中的某一页加入水印,这个水印图片的页码不固定,所以不能直接用'sealStamperUnder = stamp.getUnderConten ...

  5. PDF中图片表格可以转成Excel表格吗?

    对于PDF的修改和使用大部分人都不太熟悉,特别是PDF文档中的内容全部都是图片更无法直接编辑,如果需要使用到PDF中的表格时,就比较麻烦了,那么能不能将PDF中的图片转换成表格呢?这样直接修改表格不就 ...

  6. java设置pdf不可编辑_禁止编辑,但允许在Java iText / PDF中进行页面提取

    我正在使用iText生成PDF文件 . 我想禁止编辑PDF,但允许读者提取页面 . 这是我设置加密的代码: writer.setEncryption(null, null, 0xffffffff, P ...

  7. java读取图片、PDF中图片上的文字

    读取图片上的文字 提示:本文是基于tess4j 文章目录 读取图片上的文字 前言 一.tess4j是什么? 二.使用步骤 1.POM引入库 2.实例代码 总结 前言 总是有一些与众不同的需求在等着研发 ...

  8. 正则表达式提取markdown中图片链接(提取图片链接作为文章首图)

    网上搜使用正则表达式提取md中的图片链接作为文章首图 没找到好用的 只好自己写了一个 最大缺点 要自己去除括号 只能获取最后一个的url 以后有空再搞 let url = markdown.repla ...

  9. java tika pdf转图片,TIKA提取图像文件

    下面给出的该程序是从一个JPEG图像中提取的内容和元数据. importjava.io.File;importjava.io.FileInputStream;importjava.io.IOExcep ...

最新文章

  1. NSight Compute 用户手册(上)
  2. Alpha 冲刺 (8/10)
  3. 第12天续,CSS基础
  4. XSuperTooltip - Office 2007 Super Tooltip class
  5. yum源 php7.2,云服务器:CentOS7 yum安装PHP7.2的操作方法
  6. 一个口罩引发的老黄牛
  7. 李航老师亲自推荐的《统计学习方法》课件下载
  8. 2019年Java程序设计讲课笔记目录
  9. 深度学习系列(一)【人类语言处理--引言】
  10. 到底什么才是自动化巡检?
  11. excel中如何设置单元格以万为单位显示
  12. “collect2: error: ld returned 1 exit status“解决方法
  13. linux vi dd命令详解,Linux dd命令详解:数据备份,并在备份过程中进行格式转换...
  14. TFP与TFTP的联系与区别
  15. 电脑键盘上各个按键功能详解
  16. android 接入百度地图sdk
  17. pool(二)——动手入门
  18. 关于排版的小软件的实现
  19. 很多男性的瘦腰细腿比女性更骨感?原因告诉你,或许他们真没减肥
  20. 如何在HTML中引用jQuery函数库

热门文章

  1. ei指什么_SCI、EI 、SSCI 、CSSCI这些到底是指什么?
  2. 专科学校查重严格还是不严格?
  3. 《惢客创业日记》2021.07.09-14(周五)惢客未来会有哪些风险?
  4. 1017 非常可乐
  5. 动漫人物头发怎么画(头发画法步骤)
  6. 苍蓝誓约服务器维护什么时候结束,苍蓝誓约手游2021年7月15日停服维护公告
  7. 帝都程序猿996摸鱼求生指南
  8. H3C 交换机 OpenFlow 配置指南
  9. 【C# 基础】— 解决 winForm 引用 Adobe PDF Reader控件不显示pdf 文件 问题
  10. 小米扫地机器人 设置虚拟墙_米家扫地机器人可以设置虚拟墙吗