使用损坏的外部参照表修复 pdf
Posted
技术标签:
【中文标题】使用损坏的外部参照表修复 pdf【英文标题】:Repairing pdfs with damaged xref table 【发布时间】:2017-03-31 20:42:53 【问题描述】:是否有任何解决方案(最好在 Python 中)可以修复带有损坏的外部参照表的 pdf?
我有一个 pdf,我尝试在 Ghostscript 中转换为 png 并收到以下错误:
**** 错误:读取外部参照表时出错。 **** 文件已损坏。这可能是由于 **** 转换或传输文件时出现问题。
但是,我可以在 Mac 上的 Preview 中打开 pdf,当我使用 Preview 导出 pdf 时,我可以转换导出的 pdf。
有什么方法可以修复 pdf 而无需手动打开并导出它们?
【问题讨论】:
根据损坏的类型,pdfrw 可能能够修复它。 (我是pdfrw作者。) 感谢您的建议。我刚刚尝试使用 pdfrw 读取 pdf,但得到一个“PdfParseError:预期的“外部参照”关键字或外部参照流对象”。我正在尝试修复此 pdf:here 谢谢!我将不得不分析为什么 pdfrw 不起作用。同时,我发现 pdftk 会修复它,例如pdftk srcfile output dstfile
.
【参考方案1】:
如果文件在 Ghostscript 中按预期呈现,那么您可以通过 GS 将其运行到 pdfwrite 设备并创建一个不会损坏的新 PDF 文件。
预览版(就像 Acrobat 一样)几乎可以肯定地在后台默默地修复问题。 Ghostscript 也会这样做,但与其他应用程序不同,我们认为您需要知道该文件有问题。首先让您知道它已损坏,其次如果文件在 Ghostscript(或者实际上是其他应用程序)中呈现不正确,您就会知道原因。
请注意,外部参照损坏有两个主要原因;首先,应用程序的开发人员没有仔细阅读规范,外部参照中的文件偏移量是正确的,但格式不正确(这种情况并不少见,GS 修复将是无害的),其次文件真正已经在运输过程中损坏,或因编辑而损坏。
在后一种情况下,可能还有其他问题,Ghostscript 也会尝试警告您这些问题。如果您没有收到任何其他警告或错误,则可能只是格式错误的外部参照表。
【讨论】:
感谢您的回复。不幸的是,Ghostscript 无法处理/修复 pdf。但是,预览可以。我正在通过一个已知会返回损坏的 pdf 的 API 提取 pdf。所以我只是在寻找一种以自动化方式修复这些 pdf 的方法,因为我正在处理大量它们。 我很想看到这样的 PDF 文件,我们会在可能的情况下尝试修复 PDF。你能制造一个你可以公开的吗? Here 你去吧。 有趣。我不认为它是错误的外部参照(尽管这是错误的),它似乎是一个损坏的图像。我会进一步戳它,谢谢分享。 有趣。该文件有一个图像,它将其长度声明为间接对象(它以这种方式处理所有页面以及所有图像)。间接对象声明长度为 0 ......所以 Ghostscript 合理地抱怨图像没有足够的数据。顺便说一句,Acrobat 提供在退出时保存文件,这几乎证明它已损坏,即使它读取它也可以。如果这是由较新版本的 libtiff 生成的,您可能应该向 libtiff 开发人员提出错误报告。 (或者如果有更新的版本,则升级,看起来有)以上是关于使用损坏的外部参照表修复 pdf的主要内容,如果未能解决你的问题,请参考以下文章