2

我正在用 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 的最佳方法是什么?

4

2 回答 2

5

您在这里所提倡的有时被称为“重新煎炸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 做到了......

于 2012-09-06T20:32:28.237 回答
3

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

如问题中所述,我首先尝试使用 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 的帖子),但成功率更高。有趣的是,在极少数情况下它不起作用,而“重炸”起作用,所以这成为了我的后备方案。

于 2012-09-06T19:56:07.937 回答