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

如何在php中修复没有外部参照的pdf文件?,php,pdf,Php,Pdf,我有一个没有外部参照表的pdf文件,这个pdf是由3d side service生成的 是否有任何库\解决方案可以修复此pdf文件而不在adobe acrobat中打开它?错误是找不到外部参照表可能是: 如果您(非常!)熟悉PDF格式,您可以自己修复它:) PDF是内部文本。。嗯,除了流和嵌入对象之外,可能: 如果您(非常!)熟悉PDF格式,您可以自己修复它:) PDF是内部文本。。嗯,除了流和嵌入对象之外,为从未有过外部参照表的pdf创建外部参照表应该不会太难(不太可能涉及线性化或增量保存

我有一个没有外部参照表的pdf文件,这个pdf是由3d side service生成的

是否有任何库\解决方案可以修复此pdf文件而不在adobe acrobat中打开它?错误是
找不到外部参照表

可能是:

如果您(非常!)熟悉PDF格式,您可以自己修复它:) PDF是内部文本。。嗯,除了流和嵌入对象之外,可能:

如果您(非常!)熟悉PDF格式,您可以自己修复它:)
PDF是内部文本。。嗯,除了流和嵌入对象之外,为从未有过外部参照表的pdf创建外部参照表应该不会太难(不太可能涉及线性化或增量保存),因此您必须对该pdf制作者生成的pdf的质量感到惊讶

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

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

要创建外部参照节,您需要扫描PDF正文中的以下行:IDNumber GENUMBER“obj”\r\n。在最简单的情况下,GenNumber将始终为0,而IDNumber将始终按照从上到下的顺序递增。(如果GenNumber不为零,那么您正在处理一个增量保存的文件;这是一个您不想处理的复杂问题)。跟踪每条线的偏移量以及IDNumber和GenNumber。
写出外部参照中的第一行,包括第一个IDNumber和找到的间接对象数(假设它们都按顺序排列)。然后,为每个间接对象写出偏移量(填充到10位)、空格、GenNumber(00000)、空格、'n',eol(\r\n)。然后,固定先前保存的拖车、startxref部分和“%%EOF”行。保存您的文件,看看这是否解决了文件的问题。

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

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

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

要创建外部参照节,您需要扫描PDF正文中的以下行:IDNumber GENUMBER“obj”\r\n。在最简单的情况下,GenNumber将始终为0,而IDNumber将始终按照从上到下的顺序递增。(如果GenNumber不为零,那么您正在处理一个增量保存的文件;这是一个您不想处理的复杂问题)。跟踪每条线的偏移量以及IDNumber和GenNumber。 写出外部参照中的第一行,包括第一个IDNumber和找到的间接对象数(假设它们都按顺序排列)。然后,为每个间接对象写出偏移量(填充到10位)、空格、GenNumber(00000)、空格、'n',eol(\r\n)。然后,固定先前保存的拖车、startxref部分和“%%EOF”行。保存您的文件,看看这是否解决了文件的问题。

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

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

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

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

为什么会显示此错误消息 如果您想知道为什么某些程序声称
找不到外部参照表
——在PDF的末尾有如下几行:

startxref
111945
%%EOF 
该数字指示交叉引用位于从文件开头算起的偏移量

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

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

文件的实际问题 检查了表之后,发现基本问题不是缺少交叉引用表。相反,问题最终在于该文件实际上是一个co