如何修复损坏/“不符合标准”的PDF

时间:2012-09-06 19:40:02

标签: perl pdf

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

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

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

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

2 个答案:

答案 0 :(得分:5)

您在此提倡的内容有时被称为“重新油炸 PDF”:转换为PostScript并返回PDF。

然而,虽然这可能解决一些可能无法用其他方法轻易解决的问题,但你也应该意识到这条道路上经常存在的问题和缺点:

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

  • 因此,从PDF到PostScript必然会导致质量下降,转换回PDF时您将无法获得质量。

但是,您可以尝试另一种方法,避免重新油炸:

  • 转换PDF - > PDF直接借助Ghostscript:

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

请使用最新的Ghostscript版本。

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

但是在过去的10年里,我没有遇到很多Ghostscript无法修复的PDF问题,而通过Acroread重新煎炸可以做到(虽然有一些)。 OTOH,我有更多的例子,其中Acroread的重新煎炸没有成功,而Ghostscript的PDF - > PDF确实......

答案 1 :(得分:3)

我正在回答这个问题,以分享我在构建此工具时找到的答案。

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

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

然后我尝试使用acroread,Adobe的PDF阅读器将PDF转换为PostScript,而不是pdf2ps。这是一个非常好的解决方案,并修复了几乎所有的PDF。我仍然使用ps2pdf将文件转换回PDF。

我使用的acroread命令是:

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

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