如何在PHP中修复没有外部参照的pdf文件?

时间:2016-07-22 13:30:17

标签: php pdf

我有没有外部参照表的pdf文件,这个pdf是由3d边服务生成的

是否有任何库\解决方案修复此pdf文件而不在adobe acrobat中打开它?错误是Unable to find xref table

4 个答案:

答案 0 :(得分:4)

为从未有过的pdf创建外部参照表不应该太难(不太可能涉及线性化或增量保存),因此您不得不怀疑PDF生产者生成的PDF的质量。 / p>

获取PDF(v1.7)参考的副本;您需要引用的部分是3.2.9和3.4(特别是3.4.3和3.4.4),并在十六进制编辑器中打开您的文件。

滚动到文件的最底部。 该文件应以“%% EOF”结尾;紧接在它之前应该是'startxref'[\ r \ n]后跟一个数字,它是'xref'部分开始的字节偏移量。根据您的错误消息,此号码可能会丢失或关闭。外部参照部分通常位于最后一个endobj之后但位于尾部部分之上,尾部本身位于startxref部分之上。在您写完“外部参照”部分后,您需要保留预告片的副本。

要创建外部参照部分,您需要扫描PDF的正文以查找包含以下内容的行:IDNumber GenNumber'obj'\ r \ n。在最简单的情况下,GenNumber将始终为0,并且当您从上到下移动时,IDNumber将始终按顺序递增。 (如果GenNumber永远不为零,那么您正在处理已逐步保存的文件;这是您不想处理的复杂问题)。跟踪每条线的偏移量以及IDNumber和GenNumber。 在外部参照中写出第一行,包括第一个IDNumber和找到的间接对象的数量(假设它们都按顺序排列)。然后,为每个间接对象写出偏移量(填充到10位),空格,GenNumber(00000),空格,'n',eol(\ r \ n)。然后,添加之前保存的预告片,startxref部分和'%% EOF'行。保存文件,看看是否能修复文件的问题。

答案 1 :(得分:2)

文件的实际问题

检查了file provided by the OP后发现基本问题不是缺少的交叉引用表。相反,问题最终是文件实际上是两个完整PDF文件的组合,第一个是93863字节,第二个是112857字节。

两者都显示相同的形式,唯一的区别是第二个在底部添加了六个QR码。

可能有人试图合并这两个PDF(这种方式根本不起作用),或者可能完全是偶然发生的。

因此,OP实际需要的是一个工具,将文件分割成93863字节,就在%PDF-1.4文件头之前。

为什么会出现此错误消息

如果您想知道为什么某个程序声称Unable to find xref table - 在PDF的末尾有这样的行:

startxref
111945
%%EOF 

该数字表示交叉引用所在的文件开头的偏移量

因此,如果您的文件中连续有两个PDF,则此偏移量会被伪造(因为偏移量从文件的最开头计算)并指向现在没有交叉引用的文件

在这种情况下,某些程序会尝试修复文件,重建交叉引用表,而其他程序则会因错误而失败。 Adobe Reader属于前者类型,OP试图运行后者。

答案 2 :(得分:0)

也许:

http://www.verypdf.com/wordpress/201302/how-to-repair-pdfs-corrupted-xref-table-and-stream-lengths-34784.html

如果你(非常!)熟悉PDF格式,你可以自己解决它:) PDF是内部文本..好吧,除了流和嵌入对象

答案 3 :(得分:-1)

PDF的提供者是HP产品(设备)