6

我正在使用 PDFClown java 库创建 PDF 文件。

有时,使用 Adob​​e Acrobat Reader 打开这些文件时,我会收到著名的错误消息:

“此页面存在错误。Acrobat 可能无法正确显示该页面。请与创建 PDF 文档的人员联系以更正问题。”

只有在向下滚动到第 8 页,然后再向上滚动到第 3 页时,才会在读取(使用 Adob​​e)附件时显示错误。或者,缩小到 33.3% 也会产生消息。

只是为了记录,福昕阅读器可以完美地阅读文件,以及其他 PDF 阅读器(如浏览器)。

我的问题是:

  1. 我的文件有什么问题??(文件附后

  2. 我怎样才能发现它有什么问题?是否有工具可以告诉您错误在哪里

谢谢!

4

3 回答 3

5

好吧,这并不容易——

由于 PDFClown 中的错误,我在 PDF 页面中的主要信息流已损坏。在它结束后,它有一个过去实例的副本。这导致部分文本部分没有起始命令“BT” - 在流的末尾留下一个没有“BT”的“ET”。

一旦我纠正了这个,它运行得很好。

谢谢大家的帮助。如果没有@Bruno 建议的工具 RUPS,我将很难调试它。

编辑:

该错误在 Buffer.java:clone() 中(第 217 行)

而不是行:

克隆.追加(数据);

需要是:

clone.append(data, 0, this.length);

如果不进行此更正,它将克隆整个数据缓冲区,并将克隆缓冲区的长度设置为 data[].length。如果 Buffer.length 小于 data[].length,这是非常有问题的。在我的情况下,结果是在流的末端有垃圾。

于 2013-09-20T19:53:57.433 回答
4

只有在向下滚动到第 8 页,然后再向上滚动到第 3 页时,才会在读取(使用 Adob​​e)附件时显示错误。或者,缩小到 33.3% 也会产生消息。

好吧,我变得更容易了,我只需打开 PDF 并使用光标键向下滚动。一旦出现第 3 页顶部 2 厘米,就会出现消息。

我的文件有什么问题??

第1页和第2页的内容看起来还可以,那么我们来看第3页的内容。

正如 Stefano Chizzolini 指出的那样,我最初将此问题归因于在文本对象之外使用特定于文本的操作(尤其是TfTw )是错误的:确实允许在文本对象之外进行一些与文本相关的操作,即文本状态操作,参见。图 9 来自 PDF 规范:

图形对象

因此,虽然不太常见,但页面描述级别的文本状态操作是完全可以的。

在我错误地试图解释这个问题之后,OP自己的回答表明

PDF 页面中的主要信息流已损坏。在它结束后,它有一个过去实例的副本。这导致部分文本部分没有起始命令“BT” - 在流的末尾留下一个没有“BT”的“ET”。

没有先前BTET确实是一个错误,并且很可能会伴随错误级别的操作......但是,检查第三页(本期的重点页面)的流内容,我不能找到任何不匹配的ET。但是,在检查过程中,我发现内容流包含超过 2000 个尾随 0 字节!Adobe Reader 似乎无法处理这些 0 字节。

OP发现的错误可以解释这个问题:

在 Buffer.java 中:(clone()第 217 行)

而不是行:

clone.append(data);

需要是:

clone.append(data, 0, this.length);

如果没有这个更正,它会克隆整个数据缓冲区,并将克隆Buffer的 'slength设置为data[].length. 如果 Buffer.length`` 小于data[].length.

尾随 0 字节可能是此类缓冲区复制错误的影响。

此外,OP 发现的症状(在它结束后它有一个过去实例的副本)也可能是这种错误的影响。所以我假设 OP 在不同的页面上发现了这些症状,而不是第 3 页,但修复错误治愈了所有症状。

我怎样才能发现它有什么问题?是否有工具可以告诉您错误在哪里?

有 PDF 语法检查器,例如 Adob​​e Acrobat 中包含的 Preflight 工具。但即使在你的文件上也失败了。

因此,基本上您必须提取页面内容(使用 PDF 浏览器,例如RUPS)并在另一个屏幕上手动检查 PDF 规范。

于 2013-09-16T14:21:13.103 回答
1

关于调试 pdf 的一般帖子可能也有帮助,因为那里提到了 rups / pdfstreamdump 等如何调试 PDF 文件?

于 2014-09-03T13:39:16.200 回答