【问题标题】:How to fix broken/'nonconformance to standards' PDFs如何修复损坏/“不符合标准”的 PDF
【发布时间】:2015-02-25 15:01:54
【问题描述】:

我正在使用 Perl 构建一个 Web 应用程序。用户向我发送一个 XML 文件,其中包含对许多 PDF 文档的引用。我使用 XSLT 将 XML 转换为 XHTML,然后使用 PrinceXML 从 XHTML 创建 PDF 文档。此 PDF 为将包含的附件​​保留带有页眉和页脚的空白页面。

获得 PDF 后,我使用 PDF::API2 Perl 模块一个一个打开 XML 中引用的 PDF 文档,根据需要缩放和旋转页面,然后将它们包含在我创建的 PDF 文档中.

我的问题是用户提交的许多 PDF 文件都以某种方式损坏。即,它们不符合 Adob​​e 的 PDF 规范,并且 PDF::API2 不知道如何操作它们。 PDF::API2 文档建议使用 pdftk 来修复损坏的 PDF,但这通常需要很长时间并且在很多情况下并不成功。

修复此类损坏的 PDF 的最佳方法是什么?

【问题讨论】:

    标签: perl pdf


    【解决方案1】:

    您在这里所提倡的有时称为'重新煎炸 PDF':转换为 PostScript 并返回 PDF。

    但是,虽然这可能会解决一些其他方法可能无法轻松解决的问题,但您也应该注意此路径中经常存在的问题和缺点:

    • PostScript 的图形功能比 PDF 更受限制。 PDF 添加了对真实透明度、更多色彩空间、ICC 颜色配置文件和更多字体类型的支持——这些功能在 PostScript 中不可用。 (事实上​​,将这些功能添加到原始 PostScript 图形模型的需要是 Adob​​e 开始开发 PDF 文件格式的动机之一!)

    • 因此,从 PDF 转换为 PostScript 必然会导致质量下降,而在转换回 PDF 时将无法恢复。

    但是,您可以尝试另一种替代方法,避免重复油炸的弯路:

    • 在 Ghostscript 的帮助下直接转换 PDF -> PDF:

      gs                        \
        -o output.pdf           \
        -dPDFSETTINGS=/prepress \
        -sDEVICE=pdfwrite       \
         input.pdf
      

    请使用可用的最新 Ghostscript 版本。

    Ghostscript 有很多选项可用于控制 PDF 修复过程的各个方面。在不知道您的具体问题的情况下,我不能在这里更具体。

    但在过去的 10 年中,我没有遇到过多少 Ghostscript 无法修复的 PDF 问题,而通过 Acroread 重新煎炸可以解决(尽管有一些)。 OTOH,我有更多的例子,A​​croread 的重炸没有成功,而 Ghostscript 的 PDF -> PDF 做到了......

    【讨论】:

    • Kurt,感谢您提供完整的答案和信息。我将在我的解决方案中测试这种方法。
    • 我现在已经将这个解决方案整合到我的应用程序中,它就像一个魅力。
    【解决方案2】:

    我回答这个问题是为了分享我在构建这个工具时找到的答案。

    如问题中所述,我首先尝试使用 Linux 命令行工具 pdftk 修复损坏的 PDF。这在某些情况下有效,但大多数损坏的 PDF 仍然无法修复,而且此工具通常需要很长时间。

    然后我想到将 PDF 转换为 PostScript,然后再转换回 PDF。我使用 pdf2ps 和 ps2pdf 进行转换。这两个工具都是 ghostscript 的包装器。这种方法获得了更高的命中率,但仍然有不少损坏的 PDF 无法转换为 PostScript 文件。

    然后我尝试使用 Adob​​e 的 PDF 阅读器 acroread 将 PDF 转换为 PostScript,而不是 pdf2ps。事实证明,这是一个非常好的解决方案,几乎可以修复所有 PDF。我仍然使用 ps2pdf 将文件转换回 PDF。

    我使用的acroread命令是:

    acroread -toPostScript -choosePaperByPDFPageSize -pairs input.pdf output.ps
    

    更新(2015 年 2 月 25 日):我遵循 Kurt Pfeifle 的建议并将其纳入我的流程。这比 'refrying' 慢(见 Kurt 的帖子),但成功率更高。有趣的是,在极少数情况下它不起作用,而 'refrying' 起作用,所以这成了我的后备方案。

    【讨论】:

    • 鉴于您对 mine 的评论(日期为 2012 年 9 月 27 日 13:12),您不认为这个答案值得更新吗?
    猜你喜欢
    • 2011-11-22
    • 1970-01-01
    • 2011-09-04
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2010-09-25
    相关资源
    最近更新 更多