【发布时间】:2026-01-14 19:25:01
【问题描述】:
我无法在 acrobat 阅读器上打开 this pdf file,它告诉我错误(法语)而没有代码错误。在 acrobat 阅读器中打开 pdf 文件时,如何获取有关错误警报的更多信息,是否有显示更多错误信息的快捷方式,因为目前它只用法语表示:
"读取文件发生错误,可能已损坏且无法修复 修好了”
在 chrome pdf 查看器中,我可以打开这个 error-original.pdf
PS:这是另一个ok-original.pdf,在使用 acrobat 阅读器打开时可以使用。
我在 windows10,acrobat reader 版本:19.10.20098.316574
我无法解释为什么我的文件 error-original.pdf 可能在使用 pdfbox 进行一些操作后损坏但无法重现。我的问题是如何获取有关此错误的更多错误信息。
更新 #1(更多信息)
这是我用来准备/处理我的 original.pdf 的代码 这段代码做了 4 件事: 1.设置字段的partialName(与当前字段值相同) 2.删除页面中的所有链接 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 的消息:相信我,我没有在这里告诉您的方法损坏文件之一,并且我知道您的压缩是针对合并文件的,不要担心,我肯定会以错误的方式做事并尝试找出问题,感谢理解)
更新 #2(奇怪的结果)
我遇到了奇怪的事情:只需在 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 reader 时出现另一个错误:“此页面有错误,acrobat reader 无法显示此页面。请联系 pdf 作者解决问题”,当我关闭 error-alert-popup 我可以继续滚动并阅读我的 pdf。 你可以试试用acrobat reader打开这个error-on-scroll.pdf
ps:给@acrobatreader 的消息:问题是我是PDF AUTHOR,我不知道如何解决(笑话)
@KenS 能否请您提供一些输入,似乎错误在第 2 页上
【问题讨论】:
-
A) 请分享原始 PDF。 B) 此外,您说代码有时只会损坏 PDF。这通常意味着您还没有确定另一个外部因素。例如。在运行代码时,您是否有时仍会在其他程序中打开文件?
-
C) 这个奇怪的事情毕竟不是那么奇怪:PDFBox 在加载文档时遇到了与 Adobe Reader 类似的问题,但是然后尝试以不同的方式读取文件,忽略交叉引用流,而是搜索对象。保存它时,就外部参照开始位置而言,它会正确保存。因此,Adobe Reader 可以加载输出。但不幸的是,文件中的其他内容已损坏,以至于 Adobe Reader 稍后会遇到不同的错误。
-
A) 工作文件在上面列出你是ok-original.pdf B) 你是对的我无法识别问题来重现并理解为什么在我的文件夹中打开文件时遇到错误。而且我认为没有文件未打开,因为当我打开它时,我无法将 pddocument.save() 设置为相同的文件名(通过替换,因为文件已打开)
-
error-on-scroll-acrobatreader.pdf 第 2 页的内容流具有标记 7.3roce77。这不是一个有效的数字,不是名称,也不是 PDF 运算符,因此 PDF 消费者可能会忽略它并希望没有任何问题。我想这就是 Acrobat 所抱怨的。文件中还有一个zlib错误解压对象70。(无效距离,太远)注意;那是第 2 页的 Flate 压缩内容流,所以它可能是相关的。如果我理解正确,那么我同意 mkl,编辑损坏的文件只会让事情变得更糟。
-
bee:啊,ok-original.pdf 是您开始使用的文件吗?好的。尽管如此,作为@KenS 回答的必然结果,很明显(至少是最严重的)损坏发生在 文件已被 PDFBox 和处理之后> 由 Adobe Acrobat 提供。我将在答案中解释(它不适合 cmets),但您可以开始查看您的 PDF 处理器设置,该处理器在 PDFBox 和 Adobe Acrobat 之后处理 PDF。