读取MS Office生成的PDF文件时出错

读取MS Office生成的PDF文件时出错,pdf,itext,ms-office,itext7,Pdf,Itext,Ms Office,Itext7,每当我尝试读取Office生成的PDF文件时,似乎都会出现错误: com.itextpdf.kernel.PdfException: Append mode requires a document without errors, even if recovery is possible. at com.itextpdf.kernel.pdf.PdfDocument.open 有问题的文件示例:以及我用来打开它的代码片段。我的目标是做一个分离的签名,只要不是由MS Office生成的,这

每当我尝试读取Office生成的PDF文件时,似乎都会出现错误:

com.itextpdf.kernel.PdfException: Append mode requires a document without errors, even if recovery is possible.
    at com.itextpdf.kernel.pdf.PdfDocument.open
有问题的文件示例:以及我用来打开它的代码片段。我的目标是做一个分离的签名,只要不是由MS Office生成的,这对每个文件都很有效

PdfReader reader = new PdfReader(docPath);
StampingProperties properties = new StampingProperties();
        properties.useAppendMode();

//This is where the error is thrown.
PdfSigner signer = new PdfSigner(reader, new FileOutputStream(outputPath), properties);
我读过这个问题,基本上是相同的问题:,尝试了Lowagie关于删除字节的建议

xref
0 24
0000000000 65535 f 
0000011981 00000 n 
0000000239 00000 n 
0000003212 00000 n 
0000000022 00000 n 
0000000220 00000 n 
0000000343 00000 n 
0000003176 00000 n 
0000000000 00000 n 
0000003345 00000 n 
0000000440 00000 n 
0000003155 00000 n 
0000003295 00000 n 
0000003863 00000 n 
0000003519 00000 n 
0000003843 00000 n 
0000004099 00000 n 
0000011737 00000 n 
0000011758 00000 n 
0000011803 00000 n 
0000011877 00000 n 
0000011900 00000 n 
0000011942 00000 n 
0000011961 00000 n 
trailer
<< /Size 24 /Root 12 0 R /Info 1 0 R /ID [ <8e4b8658dd1d1f745bdf99a0eb05bb97>
<8e4b8658dd1d1f745bdf99a0eb05bb97> ] >>
startxref
12125
%%EOF
xref
0 24
0000000000 65535 f
0000011981 00000N
0000000 239 00000 n
000000 32120百万新西兰元
00000000200000N
0000000 220百万n
0000000343000000N
000000 3176 00000 n
0000000000百万元
000000 3345 00000 n
0000000440000000 n
000000 31550百万新西兰元
000000329500000N
000000 3863 00000 n
000000 3519 00000 n
000000 3843 00000 n
000000 4099 00000 n
0000011737 00000N
000001175800000N
0000011803 00000N
000001187700000N
000001190000000N
0000011942 00000N
000001196100000N
拖车
>
起始外部参照
12125
%%EOF
但我的PDF文件抱怨并停止工作,也尝试离开%%EOF,但得到了相同的结果

所以有两件事:

1) Lowagie和MKL讨论的bug是否有修复方法

2) 这个问题的解决方法是什么?

首先,它不是关于基本相同的问题,您只会收到相同的错误消息。有问题的PDF有一个混合参考PDF,而您的文件不是:您的文件只有一个交叉参考表和一个尾部,而混合参考PDF(至少)有两个交叉参考表,每个表后面都有一个尾部,后一个尾部有一个指向交叉参考流的XRefStm条目。混合参考PDF是有效的,iText 7以前在这类PDF中存在问题,这是一个bug

另一方面,您的PDF文件本身实际上有一个错误:交叉引用表声明对象8位于文件偏移量0处

xref
0 24
...
0000000000百万元
这不可能是真的,因为在文件的开头有PDF标题。此外,随后出现的第一个物体是物体4,因此我们也不能说偏移后的第一个物体是指

iText 7仅在源文件中未发现问题时才允许追加模式。这是合理的

因此,如果您以可复制的方式获得该错误,您应该向PDF制作者提交一个bug

您声称PDF文件是由MS Office生成的。另一方面,PDF的元数据表明,虽然MS Word是文档的创建者,但PDF的实际生产者是Quartz PDFContext。您可能需要为Quartz PDFContext提交一个问题

您的一个解决方法是捕获此异常并在没有附加模式的情况下重试

或者,如果您确实需要在附加模式下处理这些损坏的文件,您可以通过使用始终返回
false
的方法覆盖
hasrubiltxref
,例如通过替换

PdfReader reader = new PdfReader(SOURCE);

(测试
testAppendTest


但是,请注意,结果PDF仍然包含原始文件中标识的错误iText。因此,任何进一步处理您的PDF的PDF处理程序也可能会遇到问题,或者与iText最初的处理方式相同,或者以其他一些可能非常壮观的方式

你真的需要追加模式吗?如果文档还没有包含任何签名,那么我不清楚您为什么需要使用它。你能详细说明一下吗?
PdfReader reader = new PdfReader(SOURCE) {
    @Override
    public boolean hasRebuiltXref() {
        return false;
    }
};