【问题标题】:acrobat reader get error while reading document, it might be corrupted and can't be repairedacrobat reader 在阅读文档时出错,可能已损坏且无法修复
【发布时间】: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();

使用方法:

removeLinksInPages(...)

removeField(...)

注意我无法确认此代码总是输出损坏的文件,因为它不会,但有时如果我用 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 在加载文档时遇到了与 Adob​​e Reader 类似的问题,但是然后尝试以不同的方式读取文件,忽略交叉引用流,而是搜索对象。保存它时,就外部参照开始位置而言,它会正确保存。因此,Adobe Reader 可以加载输出。但不幸的是,文件中的其他内容已损坏,以至于 Adob​​e 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 处理之后> 由 Adob​​e Acrobat 提供。我将在答案中解释(它不适合 cmets),但您可以开始查看您的 PDF 处理器设置,该处理器在 PDFBox 和 Adob​​e Acrobat 之后处理 PDF。

标签: pdf pdfbox acrobat


【解决方案1】:

当 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 条目,它应该指向前一个外部参照,相反,它再次指向外部参照流的字典的一部分。纠正这一点,然后它指向一个预告片字典,该字典再次有一个不正确的 /Prev 条目。

无论你用什么来编辑这个文件,它都会以同样的方式不断地破坏它。

我可以修复这些偏移,从而允许 Ghostscript 打开和读取文件(MuPDF 甚至能够修复原始文件)。它仍然抱怨外部参照无效,并尝试修复。修复过程中发现部分PDF对象的对象号和代号相同,应该不是这样。

由于 Acrobat 不会打开修复后的文件,可能这也是 Acrobat 所抱怨的。似乎在两次编辑文件时,它都包含了对象 4、5 和 10 的新定义,但没有增加它们的代号,使它们保持在 0,因此彼此重复。

基本上,如果 Acrobat 无法打开您的文件,您应该将其视为完全损坏。

【讨论】:

  • 谢谢你的回答,这对我来说似乎有点技术性。您如何分析此 pdf 以获取此信息?我想了解发生了什么,但对我来说似乎超出了范围,我什至不能说我是如何制作这个文件的。我尝试在 acrobat 阅读器中编辑 ok-original.pdf(更新字段值然后重新保存/替换)它总是有效。
  • 我使用了许多不同的工具,还简单地在十六进制编辑器中打开 PDF 文件并查看内容,通过查看十六进制值计算 /Prev 和 startxref 值的正确偏移量文件中的偏移量。鉴于对 PDF 规范的足够熟悉,它很乏味但并不难找出问题所在。既然你说你正在使用 pdfbox,你可能应该在那里报告问题。
  • 如果您可以检查,我更新了我的问题...我还用“pdfbox”标记了我的问题,您是否建议我删除标签 pdf 和 acrobat,然后将 pdfbox 留在这里?
  • 我会留下所有的标签,它们在我看来都是合理的
【解决方案2】:

Ken's answer 的推论...

您的文件中有三个修订版(即您的文件有一个初始版本和两个增量更新)。由于您的 PDFBox 代码仅保存为全新文件,而不是使用增量更新,因此您的 PDFBox 代码的最终结果已经在第一个版本中。

此外,您的原始文件“ok-original.pdf”使用交叉引用表保存,而结果文件中的所有修订版仅使用交叉引用流。

由于您的 PDFBox 代码使用与加载文件时相同的交叉引用技术保存文件(PDFBox 默认),这意味着即使是第一个修订版本也不是 PDFBox 的立即输出,而是由其他一些文件再次加载和存储的输出程序,可能是 Adob​​e Acrobat,它改变了技术。

因此,您再也看不到确切的 PDFBox 输出了,即使在最初的修订版中也看不到,而只能看到下一个程序用它制作的内容。因此,特别是 PDFBox 不负责在交叉引用流中构建交叉引用偏移量,也不负责这些交叉引用流本身的偏移量。

正如 KenS 在他的回答中已经解释的那样,startxrefPrev 条目中的交叉引用流对象的偏移量太大;更准确地说,它们对于初始修订版来说太大了 116,对于第二个修订版来说太大了 122,对于最后一个完整的 PDF,它们太大了 131。

PDFBox(见上文)没有创建这些交叉引用流,更不用说它们的偏移值了。因此,您的 PDFBox 代码不对错误的偏移量负责!

如果 Adob​​e Acrobat 是生成这三个修订的程序,我也怀疑 Adob​​e Acrobat 导致了错误的偏移。

在我看来,之后文件已被某个程序或通过某个通道复制或传输,该通道从文件中删除了一些字节,第一个版本为 116 个字节,第二个版本为 6 个字节,第三个版本为 9 个字节.

(这种丢弃也可能是由于将多个字节合并为更少的字节...)

【讨论】:

  • 您希望我接受您的回答吗?因为即使它对我来说太技术性了,但这并不意味着你和 KenS 是错的。顺便了解一下修订、版本、增量更新、交叉引用表、流和偏移量等概念; sratrtxref 和 Prev... 你的 mkl 和 @KenS 推荐什么来学习这个?你有一些好的资源视频吗?教程?开始?我更喜欢避免从不容易开始的 pdf 规范文档开始。找到一些 pdf-under-the-hood 教程会很棒 ^^ 为我的无知道歉并感谢您的帮助
  • 你可以接受任何一个,KenS 做了第一个分析,我为你做了解释。顺便问一下,您确定是哪款软件最终损坏了您的文件吗?
  • 我没有也无法重现我能说的我使用 pdfbox、acrobat reader dc(更新字段值后替换/保存)除此之外我使用 pdfescape(免费在线 webapp)解锁字段和移动调整大小更改部分名称然后下载文件。这是我用来操作这个 original.pdf 的完整场景。希望找到错误或重现它。顺便说一句,在阅读了*上的内容后,我了解到没有视频课程可以深入学习 pdf 结构,唯一存在的就是 ISO 之上的 pdf 规范?损坏我无法在网上轻松找到其他教程,例如 java 学习
  • @bee 关于教程...网上到处都有。例如。这些是 idr 解决方案here 的博客中的一些内容。但是,要真正了解其内部结构,您必须研究 pdf 规范以及从中引用的许多其他规范。
  • @bee 啊,idr解决方案PDF教程的实际主索引是thislink given above 只是“错误、陷阱和提示”小节...
【解决方案3】:

也许error-original.pdf pdf 有/Prev 除了ok-original.pdf

但我复制并找到了解决方案: 这里的问题是 GIT,在我的项目中,当从远程获取文件时,似乎将 pdf 文件视​​为文本而不是二进制文件。只需添加内容为*.pdf binary 的.gitattributes 文件即可解决问题。 所以继续:

  1. Pdf 作者(在他的本地机器上)有工作的 pdf。

  2. pdf 作者提交 + 推送到远程。

  3. 另一个用户从远程拉取更改并尝试打开 pdf:导致“文件损坏”。

  4. 在 .gitignore 级别添加 .gittattributes 修复问题。

PS:但是@mkl 和 Kens 上面所说的所有内容也都是正确的。

【讨论】:

    最近更新 更多