如何提取PDF提取的图像旋转/转换信息(即观众怎么知道旋转180)

问题描述 投票:1回答:2

我使用的是ScanSnap的扫描仪生成PDF-1.3在那里将自动纠正方向扫描文档的时候PDF是Adobe阅读器中查看(旋转0度或180度)。 OCR通过​​扫描软件来完成我假设的方位确定,然后和编码成PDF。

请注意,我知道我可以使用正方体或其他OCR工具,以确定是否需要轮换,但我不想把它作为扫描仪软件似乎已经确定了它,如果需要旋转(或没有)告诉PDF观众。

当我使用图像提取工具(如xpdf的pdfimages,Python库)不能正确旋转JPEG图像180度(如果需要)。

NB:pdfimages从PDF文件中提取的原始图像数据,而无需执行任何附加的变换。任何旋转,裁剪,颜色反转等由PDF内容流做被忽略。

我已经扫描的文档两次旋转(0度和180度)。我似乎无法进行反向工程观看时是什么告诉的Adobe /福昕旋转(或没有)的图像。我已经看了看PDF-1.3规范文档,并进行比较的PDF二进制数据的方向校正和无修正。我不能确定是什么修正方向是什么?

  • 否/页/旋转(默认为0)PDF
  • 在JPEG无EXIF方向
  • 我没有看到任何PDF转换矩阵(厘米运营商)

在这两种情况下,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规范方面的专家。但我希望有人可能已经找到了解决这一问题。

pdf rotation transformation rotatetransform image-extraction
2个回答
3
投票

在“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')
>> 

正如我们看到的,是没有旋转项存在。因此,我们必须要看看网页内容流。据页字典它在对象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
[...]

而这确实是第二种技术的应用,将厘米指令适用的旋转和DO指令与旋转活跃绘制图像!

详细地说,指令厘米应用于由矩阵表示的仿射变换

-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媒体框。


0
投票

MKL回答了这个问题做正确所有的辛勤工作为我解码PDF。

我以为我会加入我的Python(PyPDF2)代码搜索发现旋转状态的情况下,它可以帮助别人。

    input1 = PyPDF2.PdfFileReader(open(filepath, "rb"))
    totalPages = input1.getNumPages()
    for pgNum in range(0,totalPages):
        page0 = input1.getPage(pgNum)

        # Lets look to see if the page contains a transformation matrix to rotate it 180 degress 
        # (ScanScap iX500 encoded the PDF with a cm transformation matrix to rotate 180 degrees in PDF viewers
        # @see https://stackoverflow.com/questions/54483013/how-to-extract-rotation-transformation-information-for-pdf-extracted-images-i-e
        # @see 'PDF 1.3 Reference Manual March 11, 1999' Section 3.10 Transformation matrices which is applied to the scanned image
        #                                          [[a b 0]
        #                                           [c d 0]
        #                                           [e f 1]] 
        isPageRotated180 = False
        pgContent = page0['/Contents'].getData().decode('utf-8')
        FLOAT_REG = '([-+]?\d*\.\d+|\d+)'
        m = re.search( '{} {} {} {} {} {} cm'.format(FLOAT_REG,FLOAT_REG,FLOAT_REG,FLOAT_REG,FLOAT_REG,FLOAT_REG), pgContent )
        if m:
            (a,b,c,d,e,f) = list(map(float,m.groups()))
            isPageRotated180 = (a == -e and d == -f)   
© www.soinside.com 2019 - 2024. All rights reserved.