我无法在acrobat阅读器上打开this pdf file它告诉我错误(法语)没有代码错误。如何在acrobat pdf文件中获取有关错误警报的更多信息,是否有快捷方式显示有关错误的更多信息,因为目前只能用法语说:
“阅读文档时出错,可能已损坏,无法修复”
在chrome pdf viewer中,我可以打开这个error-original.pdf
PS:这是另一个用acrobat阅读器打开的ok-original.pdf。
我在windows10上,acrobat reader版本:19.10.20098.316574
我无法解释为什么我的文件error-original.pdf被破坏可能是在使用pdfbox进行一些操作但无法重现之后。我的问题是如何获得有关此错误的更多错误信息。
这是我用来准备/操作我的original.pdf的代码。这段代码做了4件事:1。设置字段的partialName(与当前字段值相同)2。删除第3页中的所有链接3.删除字段为空||空白值4.临时压缩尝试使用@mkl方法OptimizeAfterMerge.java偶然获得一些八位字节
Document pdfOriginal = PDDocument.load(f.toFile());
//1.set field partialName like his current value
pdfOriginal.getDocumentCatalog().getAcroForm().getFields().forEach(field -> {
if (field instanceof PDTextField && !field.getValueAsString().contains("--")
&& !field.getValueAsString().isBlank() && !field.getValueAsString().isEmpty()) {
field.setPartialName(field.getValueAsString());
}
});
//2.remove all link in document
removeLinksInPages(pdfOriginal);
//3.remove field with empty||blank value
pdfOriginal.getDocumentCatalog().getAcroForm().getFields().forEach(field -> {
if (field instanceof PDTextField
&& (field.getValueAsString().isBlank() || field.getValueAsString().isEmpty())) {
try {
removeField(pdfOriginal, field.getPartialName());
} catch (IOException e) {
e.printStackTrace();
}
}
});
pdfOriginal.save(new File(f.toAbsolutePath().toString()));
pdfOriginal.close();
//4.try to compress to gain some octets
PDDocument compress = PDDocument.load(f.toFile());
OptimizePdfDocument.optimize(compress);
compress.save(new File(f.toAbsolutePath().toString()));
compress.close();
使用方法:
注:我无法确认此代码总是输出损坏的文件,因为它不会,但有时如果我用acrobat reader打开文件它无法读取。
(给@mkl的消息:相信我,我不在这里告诉你的一个方法损坏的文件,并且我意识到你的压缩是为了合并文件不要担心,我当然以错误的方式做事并尝试找到问题,谢谢理解)
我遇到了奇怪的事情:只需在the above corrupted file error-original.pdf上运行这个pdfbox代码:
PDDocument pdfOriginal = PDDocument.load(new File(".../error-original.pdf"));
pdfOriginal.save(new File(".../error-original.pdf"));
pdfOriginal.close();
Acrobat Reader能够打开输出(未触动的pdf文件)但滚动acrobat阅读器时会出现另一个错误:“此页面有错误,acrobat reader无法显示此页面。请联系pdf作者解决问题”,当我关闭错误时 - alert-popup我可以继续滚动并阅读我的pdf。您可以尝试使用acrobat reader打开这个error-on-scroll.pdf
ps:给@acrobatreader的消息:问题是我是PDF AUTHOR而且我不知道如何解决(笑话)
@KenS你能不能给出一些输入,看来错误就在第2页
当Acrobat显示错误时,您可以尝试按住控制键(在Windows上),同时单击“确定”按钮。这有时会为您提供更多信息。
在这种情况下,它没有。该文件严重破坏。它已被编辑至少两次,并且编辑看起来已经破坏了文件而不是简单的修复。该文件包含:
startxref
81612
它应该指向外部参照表的开始(它包含所有对象的文件中的偏移量)。而是文件偏移指向:
C89E1E8B69>]/Index[4 2 10 1 156 2]/Info 5 0 R/Length 31/Prev 77185/Root 1 0 R/Size 158/Type/XRef/W[1 3 0]>>stream
这是通过交叉引用流的一部分。预告片字典包含/ Prev条目,该条目应该指向先前的外部参照,相反,它再次指向xref流的分区。更正它,然后它指向一个预告片字典,它再次有一个/ Prev条目不正确。
无论您使用什么来编辑此文件,它都会以相同的方式继续破坏它。
我可以修复这些偏移,这允许Ghostscript打开并读取文件(MuPDF甚至可以修复原始文件)。它仍然抱怨外部参照无效,并尝试修复。在修复过程中,它发现某些PDF对象具有相同的对象编号和世代号,但情况并非如此。
由于Acrobat不会打开已修复的文件,因此可能是Acrobat也在抱怨这一点。似乎文件编辑的两次都包括对象4,5和10的新定义,但是没有增加它们的生成数,使它们保持为0,因此彼此重复。
从根本上说,如果Acrobat无法打开您的文件,您应该将其视为完全损坏。
Ken's answer的必然结果......
您的文件中有三个修订版(即您的文件具有初始版本和两个增量更新)。由于您的PDFBox代码仅保存为完全新的文件,而不是使用增量更新,因此PDFBox代码的最终结果已经在第一个修订版中。
此外,原始文件“ok-original.pdf”使用交叉引用表保存,而结果文件中的所有修订仅使用交叉引用流。
由于您的PDFBox代码使用与加载它们相同的交叉引用技术(PDFBox默认值)来保存文件,这意味着即使是第一个修订版也不是PDFBox的直接输出,但是该输出由其他程序再次加载和存储,可能Adobe Acrobat,它改变了这项技术。
因此,您不再看到确切的PDFBox输出,即使在初始版本中也没有,但只看到下一个程序的输出。因此,特别是PDFBox不负责在交叉引用流中构建交叉引用偏移,也不负责这些交叉引用流本身的偏移。
正如KenS已经在他的回答中解释的那样,startxref和Prev条目中的交叉引用流对象的偏移量太大;更准确地说,它们在初始修订时太大了116,第二个修改为122,最后一个修改为131,完整的PDF。
PDFBox(见上文)没有创建这些交叉引用流,更不用说它们的偏移值了。因此,您的PDFBox代码不对错误的偏移负责!
如果Adobe Acrobat是生成这三个修订版的程序,我也会怀疑Adobe Acrobat是否导致了错误的偏移。
对我来说,似乎之后文件已被某些程序或通过某些从文件中删除一些字节的通道复制或传输,第一次修订中包含116个字节,第二个修订版中包含6个字节,第三个修订版中包含9个字节。
(由于将多个字节合并为更少的字节,这种情况也可能发生了......)
也许error-original.pdf
pdf除了ok-original.pdf
之外还有/ Prev
但我转载并找到了解决方案:这里的问题是GIT,在我的项目中从远程获取文件时,似乎将pdf文件视为文本而不是二进制文件。只需添加内容为*.pdf binary
的.gitattributes文件即可解决问题。所以要恢复:
PS:但是@mkl和Kens所说的所有事情都保持正确。