我正在用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的最佳方法是什么?
您在此提倡的内容有时被称为"重新煎炸 PDF":转换为PostScript并返回PDF.
然而,虽然这可能解决了一些其他方法可能无法解决的问题,但您也应该了解这条路径中经常出现的问题和缺点:
PostScript的图形功能比PDF更受限制.PDF增加了对真实透明度,更多色彩空间,ICC颜色配置文件和更多字体类型的支持 - 这些功能在PostScript中不可用.(实际上,需要将这些功能添加到原始的PostScript图形模型中,这是Adobe开始开发PDF文件格式的激励之一!)
因此,从PDF到PostScript必然会有松散的质量,在转换回PDF时你不会得到回报.
但是,您可以尝试另一种方法,避免重新油炸绕道:
在Ghostscript的帮助下直接转换PDF - > PDF:
gs \
-o output.pdf \
-dPDFSETTINGS=/prepress \
-sDEVICE=pdfwrite \
input.pdf
Run Code Online (Sandbox Code Playgroud)请使用最新的Ghostscript版本.
Ghostscript有很多选项可用于控制PDF修复过程的各个方面.在不知道具体问题的情况下,我不能在这里具体说明.
但是在过去的10年里,我没有遇到很多Ghostscript无法修复的PDF问题,而通过Acroread重新煎炸可以做到(虽然有一些).OTOH,我有更多的例子,其中Acroread的重新煎炸没有成功,而Ghostscript的PDF - > PDF确实......