如何将PDF文档中的PDF转换为图像? [或:GoogleDocs' PDF输出很糟糕!]

时间:2014-11-24 16:26:24

标签: pdf imagemagick google-docs

我将Google文档中的文档以PDF格式导出(只是简单的页面和一个预定义的主题),就像我通常一样,我使用了ImageMagick的 convert 将页面转换为图像,但失败(即使使用最新版本)并且没有显示任何错误。 GhostScript也失败了。 其他工具(例如 pdfinfo mutool qpdf 不会报告任何错误,即使应用了rebuildclean命令,它仍然会失败。

只有 pdfimages 投诉并给我Syntax Error: Missing or invalid Coords in shading dictionary

1 个答案:

答案 0 :(得分:1)

好的,我尝试使用Google幻灯片重现一些错误。

但是, 我的 错误与 你的 不同。请继续阅读以获取一些细节...

Google Docs确实创造了一种可怕的PDF语法。我说'今天' ,因为我多年前放弃了Google Docs。原因是:过去对我来说总是很不稳定。 GoogleDocs'开发人员似乎一直在为用户更改他们激活的代码,为我调试创建的PDF始终是一个不断变化的目标。

当我导出PDF格式时,我创建了幻灯片,然后运行了你提到的工具,......

...我在20分钟内得到了4个不同的结果!

在一个案例中,Mac OS X的 Preview.app 除了3个白页外无法呈现任何其他内容,而Adobe的 Acrobat Pro 渲染它(没有错误信息)以某种方式出现乱码,与GoogleDocs网页预览不同。

在另一个案例中,Acrobat Pro显示3个白页,而Preview.app以乱码方式呈现它!

不幸的是,我没有保存不同版本以进行更仔细的检查。我分析的最新PDF文件给出了以下细节。

的Ghostscript:

pdfkungfoo@mbp:> gs -o PDFExportBug-%03d.jpg -sDEVICE=jpeg PDFExportBug.pdf
  GPL Ghostscript 9.10 (2013-08-30)
  Copyright (C) 2013 Artifex Software, Inc.  All rights reserved.
  This software comes with NO WARRANTY: see the file PUBLIC for details.
  Processing pages 1 through 3.
  Page 1
     **** Error reading a content stream. The page may be incomplete.
     **** File did not complete the page properly and may be damaged.
  Page 2
     **** Error reading a content stream. The page may be incomplete.
     **** File did not complete the page properly and may be damaged.
  Page 3
     **** Error reading a content stream. The page may be incomplete.
     **** File did not complete the page properly and may be damaged.

     **** This file had errors that were repaired or ignored.
     **** Please notify the author of the software that produced this
     **** file that it does not conform to Adobe's published PDF
     **** specification.

ImageMagick的:

convert从PDF页面创建纯白图像。

(这并不奇怪,因为它不会直接处理PDF,而是使用Ghostscript作为委托来首先将PDF转换为栅格格式,然后熟悉的ImageMagick继续处理...... 您可以通过将-verbose添加到ImageMagick命令行来查看此过程的详细信息。

qpdf

使用qpdf --check会产生以下结果:

pdfkungfoo@mbp:> qpdf --check PDFExportBug.pdf
 qpdf --check PDFExportBug.pdf
 checking GoogleSlidesPDFExportBug.pdf
 PDF Version: 1.4
 File is not encrypted
 File is not linearized
 PDFExportBug.pdf (file position 9269):
      unknown token while reading object (0.0000-11728996)

pdfimages

与您发现的不同,我的错误信息是:

pdfkungfoo@mbp:> pdfimages -list PDFExportBug.pdf
page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
Syntax Warning (9276): Badly formatted number
Syntax Warning (9292): Badly formatted number
Syntax Warning (9592): Badly formatted number
Syntax Warning (9608): Badly formatted number
Syntax Warning (4907): Badly formatted number
Syntax Warning (4907): Badly formatted number
Syntax Warning (9908): Badly formatted number
Syntax Warning (9924): Badly formatted number
Syntax Warning (8212): Badly formatted number
Syntax Warning (8212): Badly formatted number

当我使用文本编辑器检查数字的92769292,... 8212的文件偏移时,我确实在PDF代码中找到以下行:

  • 第412行:0.0000-11728996
  • 第413行:0.0000-11728996
  • 第466行:0.0000-11728996
  • 第467行:0.0000-11728996
  • 第522行:0.0000-11728996
  • 第523行:0.0000-11728996

文本编辑器中的PDF代码:

查看这些行的上下文,可以看到以下内容:

32
0
obj
<<
/ShadingType
2
/ColorSpace
/DeviceRGB
/Function
<<
/FunctionType
2
/Domain
[
0
1
]
/Range
[
0
1
0
1
0
1
]
/C0
[
0.5882353
0.05882353
0.05882353
]
/C1
[
0.78431374
0.1254902
0.03529412
]
/N
1
>>
/Coords
[
0.000000000000053689468
0.0000
-11728996
0.0000
-11728996
26.832815
]
/Extend
[
true
true
]
>>
endobj

这是真的! GoogleDocs给了我一张PDF,在每个令牌后创建了换行符!

PDF代码,如果谷歌的格式不那么糟糕:

这些行是 的代码段的一部分,如果Google PDF导出并不像实际上那样可怕:

32 0 obj
  <<
    /ShadingType    2    
    /ColorSpace     /DeviceRGB
    /Function       <<  /FunctionType   2
                        /Domain         [ 0 1 ]
                        /Range          [ 0 1 0 1 0 1 ]
                        /C0             [ 0.5882353 0.05882353 0.05882353 ]
                        /C1             [ 0.78431374 0.1254902 0.03529412 ]
                        /N              1    
                    >>   
    /Coords         [ 0.000000000000053689468 0.0000 -11728996 0.0000 -11728996 26.832815 ]
    /Extend         [ true true ]
  >>
endobj

PDF代码与PDF规范相比:

因此GoogleDoc的PDF使用/ShadingType 2(用于轴向着色)。此着色类型需要&#39;着色字典&#39; ,其中包含/Coords键的条目,该条目的值应为4个数字[x0 y0 x1 y1]的数组。这些数字将指定轴的起始坐标和结束坐标(以阴影的目标坐标空间表示)。

但是,它使用 6 之一而不是 4 数字的/Coords数组数字:[0.000000000000053689468 0.0000 -11728996 0.0000 -11728996 26.832815]

/ShadingType 3(径向着色)将使用带有6个数字的Coords数组。

根据ISO 32000,<6>数字[x0 y0 r0 x1 y1 r1]代表

  

&#34; [...]起点和终点圆的中心和半径,以阴影的目标坐标空间表示。半径r0和r1都应大于或等于0.如果一个半径为0,则相应的圆应视为一个点;如果两者都是0,则不得涂漆。&#34;

15分钟后,我再次导出了PDF,但现在我得到了这些内容:

/Coords
[
0.000000000000053689468
0.0000-11728996
0.0000-11728996
26.832815
]

正如您所注意到的,现在确实/Coords数组有4个条目 - 但0.0000-11728996不是有效数字!

在任何情况下,我的对象32,33和34中的特定数字看起来都很有趣:

  1. 他们要么是6个数字:
    [0.000000000000053689468 0.0000 -11728996 0.0000 -11728996 26.832815]
    1. 然后它们只能用于/ShadingType 3(径向着色)
    2. 但是在/ShadingType 2(轴向阴影)
    3. 的背景下注明了它们
  2. 或者它们是4个数字:
    [0.000000000000053689468 0.0000-11728996 0.0000-11728996 26.832815]
    1. 然后0.0000-11728996不是有效数字。
  3. 修复

    所以修复可能在......

    1. ...将/ShadingType 2更改为/ShadingType 3并保留6个数字的数组
    2. ...或保留/ShadingType 2并丢弃6个数字中的2个以仅保留4个(但是哪个?)
    3. 我决定(任意,偶然)首先尝试使用ShadingType 2并删除这两个数字:-11728996 0.0000

      我很幸运:PDF现在允许convert将PDF页面处理成JPEG格式(这意味着由convert调用的Ghostscript命令也正常工作)。

      祝你在创建PDF时继续使用GoogleDocs好运......

      ......但是不要指望我进去!


      更新

      Here 是GoogleDoc的链接,目前正在展示上述错误变体之一:

      GoogleDocs PDF exporting bug

      要查看错误,请将其另存为PDF。然后在文本编辑器中打开它。

      如果来自此链接的文档停止导出错误的PDF并停止展示我上面描述的其中一个细节,那么Google已经应用了修复...(直到他们再次破坏它?! ?