pdf - 如何提取 PDF 提取图像的旋转/变换信息(即查看者如何知道旋转 180 )

标签 pdf rotation transformation rotatetransform image-extraction

我正在使用生成 PDF-1.3 的 ScanSnap 扫描仪,当在 Adob​​e Reader 中查看 PDF 时,它会自动更正扫描文档的方向(旋转 0 或 180 度)。 OCR 由扫描软件完成,我假设方向已确定并编码到 PDF 中。

请注意,我知道我可以使用 Tesseract 或其他 OCR 工具来确定是否需要旋转,但我不想使用它,因为扫描仪软件似乎已经确定了它并告诉 PDF 查看器是否需要旋转(或不是)。

当我使用图像提取工具(如 xpdf pdfimages、python 库)时,它无法将 jpeg 图像正确旋转 180 度(如果需要)。

NB: pdfimages extracts the raw image data from the PDF file, without performing any additional transforms. Any rotation, clipping, color inversion, etc. done by the PDF content stream is ignored.

我旋转扫描了文档两次(0 度和 180 度)。 我似乎无法对告诉 Adob​​e/Foxit 在查看时旋转(或不旋转)图像的内容进行逆向工程。我查看了 PDF-1.3 规范文档,并比较了方向校正和未校正的 PDF 二进制数据。我无法确定是什么在纠正方向?

  • PDF 中没有/Page/Rotate(默认为 0)
  • JPEG 中没有 EXIF 方向
  • 我在 PDF 中没有看到任何转换矩阵(cm 运算符)

在这两种情况下,PDF 二进制文件如下所示(停在 JPEG 流数据处)

更新: PDF 文件的链接 rotated-180 rotated-0

%PDF-1.3
%âãÏÓ
1 0 obj
<</Metadata 20 0 R/Pages 2 0 R/Type/Catalog>>
endobj
2 0 obj
<</MediaBox[0.0 0.0 606.6 794.88]/Count 1/Type/Pages/Kids[4 0 R]>>
endobj
4 0 obj
<</Parent 2 0 R/Contents 18 0 R/PieceInfo<</PSL<</Private<</V(3.2.9)>>/LastModified(D:20190201125524-00'00')>>>>/MediaBox[0.0 0.0 606.6 794.88]/Resources<</XObject<</Im0 5 0 R>>/Font<</C0_0 11 0 R/T1_0 16 0 R>>/ProcSet[/PDF/Text/ImageC]>>/Type/Page/LastModified(D:20190201085524-04'00')>>
endobj
5 0 obj
<</Subtype/Image/Length 433576/Filter/DCTDecode/Name/X/BitsPerComponent 8/ColorSpace/DeviceRGB/Width 1685/Height 2208/Type/XObject>>stream

有谁知道 PDF 查看器如何知道将图像旋转 180 度(或不旋转)。它是 PDF 或 JPEG 图像中可以提取的元数据吗?Adobe 和其他查看器是否会在打开文档时动态执行某些操作以确定是否需要方向校正?

我不是 PDF 规范方面的专家。但我希望有人可能已经找到了解决这个问题的方法。

最佳答案

“internetfile-180.pdf”中页面资源中的图片im0没有旋转:

internetfile-180.pdf image

但是“internetfile.pdf”中页面资源中的图片Im0被旋转了:

enter image description here

在查看器中两者看起来都是直立的,因此在“internetfile.pdf”中必须使用旋转图像的技术。

有两种主要的技术:

  • 相应地设置页面的旋转属性,即这里设置为 180。
  • 对页面内容流中的当前变换矩阵应用旋转变换。

我们先看一下页面字典,打印得有点漂亮:

4 0 obj
<<
  /Parent 2 0 R
  /Contents 13 0 R
  /PieceInfo
  <<
    /PSL
    <<
      /Private <</V (3.2.9)>>
      /LastModified (D:20190204142537-00'00')
    >>
  >>
  /MediaBox [0.0 0.0 608.64 792.24]
  /Resources
  <<
    /XObject <</Im0 5 0 R>>
    /Font <</T1_0 11 0 R>>
    /ProcSet [/PDF /Text /ImageC]
  >>
  /Type /Page
  /LastModified (D:20190204102537-04'00')
>> 

如我们所见,不存在Rotate 条目。因此,我们必须查看页面内容流。根据页面字典,它位于对象 13,第 0 代。

该对象是一个带有压缩流数据的流对象:

13 0 obj
<<
  /Length 4014
  /Filter /FlateDecode
>>
stream
H‰”WÛŽÛF}Ÿ¯Ð[lÀÓÓ÷˾e½
[...]
ÿüòÛÿ ´ß
endstream
endobj 

在膨胀流数据之后,它们开始是这样的:

q
-608.3999939 0 0 -792.9600067 608.3999939 792.9600067 cm
/Im0 Do
Q
[...]

这确实是第二种技术的应用,cm 指令应用旋转,Do 指令在旋转激活的情况下绘制图像!

具体来说,cm指令应用了矩阵表示的仿射变换

-608.3999939    0            0
   0         -792.9600067    0
 608.3999939  792.9600067    1

换句话说:

x' = -608.3999939 * x + 608.3999939
y' = -792.9600067 * y + 792.9600067

这个变换实际上是旋转180°,水平缩放608.3999939,垂直缩放792.9600067,水平平移608.3999939,垂直平移792.9600067的组合。

Do 指令现在绘制图像。这里需要知道的是,该指令首先将图像缩放到原点处的1×1正方形单元,然后应用当前变换矩阵。

因此,绘制的图像旋转了 180°,有效地填充了整个 608.64×792.24 MediaBox 页面。

关于pdf - 如何提取 PDF 提取图像的旋转/变换信息(即查看者如何知道旋转 180 ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54483013/

相关文章:

javascript - THREE.js OrbitControls 不工作

three.js - 使用四元数进行旋转会使我的对象以特定角度缩放

Javascript 对象转换

c# - 使用 C# 从 SQL Server 数据库显示 PDF

python - 在Python中保存绘图仅创建一个空的pdf文档

c++ - 使用 glm 的旋转功能时预期的旋转方向是什么?

c# - 是否有使用 .NET 的转换引擎或库?

python - 不同特征的数据预处理步骤

javascript - 我们可以将 PDF 文件从 AngularJS 客户端发送到 NodeJS 服务器吗

pdf - 具有矩阵和列表的SSRS 2005在打印或导出为PDF时在每个数据页之间显示空白页