我正在使用PDFClown Java库创建PDF文件。
有时,当使用Adobe Acrobat Reader打开这些文件时,我会收到著名的错误消息:
“此页面存在错误。Acrobat可能无法正确显示该页面。请与创建PDF文档的人员联系以更正此问题。”
当读取(使用Adobe)附加文件时,只有向下滚动到第8页,然后向上滚动到3'td页时才显示错误。或者,缩小到33.3%也会产生消息。
只是为了记录,Foxit reader读取html" target="_blank">文件是完美无缺的,以及其他类似浏览器的PDF阅读器。
我的问题是:
>
我的文件有什么问题??(档案附后)
我怎么才能发现它有什么问题?是否有一种工具可以告诉您错误所在?
谢谢!
当读取(使用Adobe)附加文件时,只有向下滚动到第8页,然后向上滚动到3'td页时才显示错误。或者,缩小到33.3%也会产生消息。
好吧,我变得更容易,我只需要打开PDF并使用光标键向下滚动。第3页的顶部2厘米一出现,消息就出现了。
我的档案怎么了??
第1页和第2页的内容看起来还可以,那么我们来看看第3页的内容。
我最初将问题归因于在文本对象外部使用特定于文本的操作(特别是Tf和Tw)是错误的,正如Stefano Chizzolini所指出的:在文本对象外部确实允许一些与文本相关的操作,即文本状态操作,cf。图9来自PDF规范:
因此,虽然不太常见,但页面描述级别的文本状态操作是完全可以的。
在我错误地试图解释这个问题之后,OP自己的回答表明
PDF页面中的主要信息流已损坏。在它结束后,它有一个它的过去实例的副本。这导致部分文本部分没有启动命令“bt”--这在流的末尾留下了一个没有“bt”的“et”。
一个没有事先BT的ET确实是一个错误,而且很可能伴随着错误级别的操作。但是,在检查第三个页面(本期的重点页面)的流内容时,我找不到任何不匹配的ET。但是,在检查过程中,我发现内容流包含2000多个尾随的0字节!Adobe Reader似乎无法处理这0个字节。
OP发现的bug可以解释问题:
在buffer.java中:clone()
(第217行)
而不是行:
clone.append(data);
需要:
clone.append(data, 0, this.length);
如果不进行此更正,它将克隆整个数据缓冲区,并将克隆的缓冲区
的长度
设置为数据[].length
。如果buffer.length``小于data[].lengts
,这就很有问题了。
尾随0字节可能是这种缓冲区复制错误的影响。
此外,由OP发现的症状(在它结束后,它有一个它的过去实例的副本)也可能是这样一个bug的影响。所以我假设OP在不同的页面上发现了这些症状,而不是第3页,但是修复bug可以治愈所有症状。
我怎么才能发现它有什么问题?有没有一个工具可以告诉你错误在哪里?
有PDF语法检查器,例如Adobe Acrobat中包含的预飞行工具。但即使在你的档案上也失败了。
因此,基本上您必须提取页面内容(使用PDF浏览器,例如RUPS),并手动检查另一个屏幕上的PDF规范。
好吧,这不容易-
由于PDFClown中的一个错误,我在PDF页面中的主要信息流已被破坏。在它结束后,它有一个它的过去实例的副本。这导致部分文本部分没有启动命令“bt”--这在流的末尾留下了一个没有“bt”的“et”。
一旦我纠正了这一点,它运行得很好。
谢谢大家的帮助。如果没有@Bruno建议的工具RUPS,我将会有更多的困难来调试它。
编辑:
bug在buffer.java:clone()(第217行)中
而不是行:
clone.append(数据);
需要:
clone.append(data,0,this.length);
如果不进行此更正,它将克隆整个数据缓冲区,并将克隆缓冲区的长度设置为data[].length。如果buffer.length小于data[].length,这就很有问题了。在我的例子中,结果是在小溪的末端有垃圾。
路径是正确的,所以我不知道是怎么回事。此外,如果我查看pdDocument.decrypt(String pw)方法,我会发现:这将解密一个文档。提供此方法仅出于兼容性原因。用户应该使用新的安全层,特别是openProtection方法。 这是什么意思?谁能给出一个如何用PDFBOX正确解密PDF文档的例子吗?
在程序运行过程中,总会遇到各种各样的错误。 有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误我们通常称之为bug,bug是必须修复的。 有的错误是用户输入造成的,比如让用户输入email地址,结果得到一个空字符串,这种错误可以通过检查用户输入来做相应的处理。 还有一类错误是完全无法在程序运行过程中预测的,比如写入文件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网
在程序运行过程中,总会遇到各种各样的错误。 有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误我们通常称之为bug,bug是必须修复的。 有的错误是用户输入造成的,比如让用户输入email地址,结果得到一个空字符串,这种错误可以通过检查用户输入来做相应的处理。 还有一类错误是完全无法在程序运行过程中预测的,比如写入文件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网
#include <stdio.h> int func(void) { int i = 0; i += 2; i *= 10; return i; } int main(void) { int a = 0; a = func(); printf("%d\n", a); return 0; } 技巧 当单步调试一个函数时,如
我对Android Studio有意见。我启动调试,并看到以下错误:
error 获得最后一个执行的错误.error()Return: [array] 返回错误的数组代码输出值为数组 $database->select("bccount", [ "user_name", "email"], [ "user_id[ 20]);var_dump($database->error());// array(3) { [0]=> string(5) "42S