拆分/合并时有关某些 PDF 的间接对象错误
Error about indirect object with some PDF when splitting / merging
我需要拆分或合并一些 pdf,并且我有一些罕见的 pdf 会创建以下异常。
com.itextpdf.kernel.PdfException: Pdf indirect object belongs to other PDF document. Copy object to current pdf document.at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:216)
at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:206)
at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:112)
at com.itextpdf.kernel.pdf.PdfWriter.writeToBody(PdfWriter.java:393)
at com.itextpdf.kernel.pdf.PdfWriter.flushObject(PdfWriter.java:301)
at com.itextpdf.kernel.pdf.PdfDocument.flushObject(PdfDocument.java:1743)
at com.itextpdf.kernel.pdf.PdfObject.flush(PdfObject.java:183)
at com.itextpdf.kernel.pdf.PdfObject.flush(PdfObject.java:152)
at com.itextpdf.kernel.pdf.PdfObjectWrapper.flush(PdfObjectWrapper.java:94)
at com.itextpdf.kernel.pdf.PdfPage.flush(PdfPage.java:505)
at com.itextpdf.kernel.pdf.PdfPage.flush(PdfPage.java:462)
at com.itextpdf.kernel.pdf.PdfDocument.close(PdfDocument.java:847)
at testPDF.PDF.splitByPage(PDF.java:564)
at testPDF.Main.main(Main.java:153)
经过一番搜索,我发现了这个 post 关于类似的问题:
在我的例子中,我只是拆分和合并pdf,我没有触及pdf的内容,所以我不知道为什么会出现这种异常。 (据我了解,异常来自复制某些字体时出现的问题)。
我的代码如下:
public static void splitByPage(File pdfToSplit, int nbPageByPDF){
try {
// Open the document in reading mode
PdfDocument pdfDoc = new PdfDocument(new PdfReader(pdfToSplit));
List<PdfDocument> splitDocuments = new PdfSplitter(pdfDoc) {
int partNumber = 1;
@Override
protected PdfWriter getNextPdfWriter(PageRange documentPageRange) {
try {
return new PdfWriter(pdfToSplit.getAbsolutePath()
.substring(0,
pdfToSplit.getAbsolutePath()
.lastIndexOf(".")
)
+ "splitPage_part"
+ String.valueOf(partNumber++)
+ ".pdf");
} catch (FileNotFoundException e) {
throw new RuntimeException();
}
}
}.splitByPageCount(nbPageByPDF);
// Close all the part created
for (PdfDocument doc : splitDocuments) {
doc.close(); // exception throws at the first closing
}
// Close the initial pdf to split
pdfDoc.close();
}
这段代码的灵感来自于这个例子:https://developers.itextpdf.com/examples/stamping-content-existing-pdfs/clone-splitting-pdf-file
对于合并,当我尝试关闭新的 pdf 时会发生同样的错误,我附加了导致异常的 pdf。 (但我可以用另一种方式做到这一点。我可以将另一个 pdf(没有这个问题)附加到有问题的 pdf)。
我认为我需要找到将字体直接从初始 pdf 复制到我创建的每个 pdf 的方法,但我找不到方法。
如果需要,我可以私下向您发送发生错误的 pdf,因为此 pdf 有点机密。
在此先感谢您的帮助或建议。
该问题在目前的7.1.3-SNAPSHOT开发版状态下已经修复。更确切地说,在解决问题 DEVSIX-1913(修复继承页面条目的复制)的过程中,它已在日期为 2018-04-23 13:46:25 的提交 251606e55768a47cb68eb8c58f2f5fe36324d85b 中得到修复。
原因是在 PdfPage.copyInheritedProperties(PdfPage, PdfDocument)
中,某些属性的值是按原样添加到目标文档中的。
这对于直接宾语是可以的;因为在大多数 PDF 中,这些属性的值是直接对象,这在很长一段时间内都没有引起注意。
有问题的页面 属性 是 CropBox,在您的示例文档中,它恰好是从页面树的根部继承的,并且具有间接值。
因此,您可以
- 等待 7.1.3 版本,或者
- 使用 7.1.3-SNAPSHOT,或者
向后移植您的 iText 版本的修复程序。在这种情况下,您只需替换
copyPdfPage.put(PdfName.CropBox, cropBox);
来自
copyPdfPage.put(PdfName.CropBox, cropBox.copyTo(pdfDocument));
在 PdfPage.copyInheritedProperties(PdfPage, PdfDocument)
.
我需要拆分或合并一些 pdf,并且我有一些罕见的 pdf 会创建以下异常。
com.itextpdf.kernel.PdfException: Pdf indirect object belongs to other PDF document. Copy object to current pdf document.at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:216)
at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:206)
at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:112)
at com.itextpdf.kernel.pdf.PdfWriter.writeToBody(PdfWriter.java:393)
at com.itextpdf.kernel.pdf.PdfWriter.flushObject(PdfWriter.java:301)
at com.itextpdf.kernel.pdf.PdfDocument.flushObject(PdfDocument.java:1743)
at com.itextpdf.kernel.pdf.PdfObject.flush(PdfObject.java:183)
at com.itextpdf.kernel.pdf.PdfObject.flush(PdfObject.java:152)
at com.itextpdf.kernel.pdf.PdfObjectWrapper.flush(PdfObjectWrapper.java:94)
at com.itextpdf.kernel.pdf.PdfPage.flush(PdfPage.java:505)
at com.itextpdf.kernel.pdf.PdfPage.flush(PdfPage.java:462)
at com.itextpdf.kernel.pdf.PdfDocument.close(PdfDocument.java:847)
at testPDF.PDF.splitByPage(PDF.java:564)
at testPDF.Main.main(Main.java:153)
经过一番搜索,我发现了这个 post 关于类似的问题:
在我的例子中,我只是拆分和合并pdf,我没有触及pdf的内容,所以我不知道为什么会出现这种异常。 (据我了解,异常来自复制某些字体时出现的问题)。
我的代码如下:
public static void splitByPage(File pdfToSplit, int nbPageByPDF){
try {
// Open the document in reading mode
PdfDocument pdfDoc = new PdfDocument(new PdfReader(pdfToSplit));
List<PdfDocument> splitDocuments = new PdfSplitter(pdfDoc) {
int partNumber = 1;
@Override
protected PdfWriter getNextPdfWriter(PageRange documentPageRange) {
try {
return new PdfWriter(pdfToSplit.getAbsolutePath()
.substring(0,
pdfToSplit.getAbsolutePath()
.lastIndexOf(".")
)
+ "splitPage_part"
+ String.valueOf(partNumber++)
+ ".pdf");
} catch (FileNotFoundException e) {
throw new RuntimeException();
}
}
}.splitByPageCount(nbPageByPDF);
// Close all the part created
for (PdfDocument doc : splitDocuments) {
doc.close(); // exception throws at the first closing
}
// Close the initial pdf to split
pdfDoc.close();
}
这段代码的灵感来自于这个例子:https://developers.itextpdf.com/examples/stamping-content-existing-pdfs/clone-splitting-pdf-file
对于合并,当我尝试关闭新的 pdf 时会发生同样的错误,我附加了导致异常的 pdf。 (但我可以用另一种方式做到这一点。我可以将另一个 pdf(没有这个问题)附加到有问题的 pdf)。
我认为我需要找到将字体直接从初始 pdf 复制到我创建的每个 pdf 的方法,但我找不到方法。
如果需要,我可以私下向您发送发生错误的 pdf,因为此 pdf 有点机密。
在此先感谢您的帮助或建议。
该问题在目前的7.1.3-SNAPSHOT开发版状态下已经修复。更确切地说,在解决问题 DEVSIX-1913(修复继承页面条目的复制)的过程中,它已在日期为 2018-04-23 13:46:25 的提交 251606e55768a47cb68eb8c58f2f5fe36324d85b 中得到修复。
原因是在 PdfPage.copyInheritedProperties(PdfPage, PdfDocument)
中,某些属性的值是按原样添加到目标文档中的。
这对于直接宾语是可以的;因为在大多数 PDF 中,这些属性的值是直接对象,这在很长一段时间内都没有引起注意。
有问题的页面 属性 是 CropBox,在您的示例文档中,它恰好是从页面树的根部继承的,并且具有间接值。
因此,您可以
- 等待 7.1.3 版本,或者
- 使用 7.1.3-SNAPSHOT,或者
向后移植您的 iText 版本的修复程序。在这种情况下,您只需替换
copyPdfPage.put(PdfName.CropBox, cropBox);
来自
copyPdfPage.put(PdfName.CropBox, cropBox.copyTo(pdfDocument));
在
PdfPage.copyInheritedProperties(PdfPage, PdfDocument)
.