只有在向下滚动到第 8 页,然后再向上滚动到第 3 页时,才会在读取(使用 Adobe)附件时显示错误。或者,缩小到 33.3% 也会产生消息。
好吧,我变得更容易了,我只需打开 PDF 并使用光标键向下滚动。一旦出现第 3 页顶部 2 厘米,就会出现消息。
我的文件有什么问题??
第1页和第2页的内容看起来还可以,那么我们来看第3页的内容。
正如 Stefano Chizzolini 指出的那样,我最初将此问题归因于在文本对象之外使用特定于文本的操作(尤其是Tf和Tw )是错误的:确实允许在文本对象之外进行一些与文本相关的操作,即文本状态操作,参见。图 9 来自 PDF 规范:
因此,虽然不太常见,但页面描述级别的文本状态操作是完全可以的。
在我错误地试图解释这个问题之后,OP自己的回答表明
PDF 页面中的主要信息流已损坏。在它结束后,它有一个过去实例的副本。这导致部分文本部分没有起始命令“BT” - 在流的末尾留下一个没有“BT”的“ET”。
没有先前BT的ET确实是一个错误,并且很可能会伴随错误级别的操作......但是,检查第三页(本期的重点页面)的流内容,我不能找到任何不匹配的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 语法检查器,例如 Adobe Acrobat 中包含的 Preflight 工具。但即使在你的文件上也失败了。
因此,基本上您必须提取页面内容(使用 PDF 浏览器,例如RUPS)并在另一个屏幕上手动检查 PDF 规范。