从 PDF 中删除页面时出现 Itext7 空异常错误
Itext7 null exception error when removing pages from the PDF
我试图将 PDF 中的页面范围保留为总共 12 页并删除其余页面
PdfReader pdfReader = new PdfReader("src/main/sample/test_doc2.pdf");
pdfReader.setUnethicalReading(true);
PdfDocument inputPDF = new PdfDocument(pdfReader);
PdfDocument outputPDF = new PdfDocument(new PdfWriter("src/main/sample/output.pdf").setSmartMode(true));
inputPDF.copyPagesTo(1, inputPDF.getNumberOfPages(), outputPDF, new PdfPageFormCopier());
Integer pages[] = {
1,
2,
3,
4,
5,
6,
7,
8,
9,
// 10,
// 11,
12
};
ListIterator<Integer> pagesList = Arrays.asList(pages).listIterator(pages.length);
while (pagesList.hasPrevious()) {
outputPDF.removePage(pagesList.previous());
}
outputPDF.close();
这适用于大多数范围,但对于某些范围(即,如果我只想保留第 10 页和第 11 页),我在第 303 行的 PDFPagesTree.class::generate_tree()
itext 方法中遇到空指针异常:
assert current != null;
current.addPages(pages);
我尝试了不同的文档,并始终得到范围 10-11 的空指针异常。
这确实是 iText 中的一个错误。作为解决方法,您可以尝试计算最后要保留的页面,而不是先复制它们,然后再删除其中的一些页面。
或者,您可以在从源文档复制页面后使用中间 PDF 作为结果,然后您可以创建另一个 PdfDocument
从中间 PDF 中删除一些页面并生成最终结果.
下面是这种方法的例子:
PdfReader pdfReader = new PdfReader(inputPdf);
pdfReader.setUnethicalReading(true);
PdfDocument inputPDF = new PdfDocument(pdfReader);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfDocument tempPDF = new PdfDocument(new PdfWriter(baos));
inputPDF.copyPagesTo(1, inputPDF.getNumberOfPages(), tempPDF, new PdfPageFormCopier());
tempPDF.close();
PdfDocument outPDF = new PdfDocument(new PdfReader(new ByteArrayInputStream(baos.toByteArray())),
new PdfWriter(outputPdf));
Integer pages[] = {
1,
2,
3,
4,
5,
6,
7,
8,
9,
// 10,
// 11,
12
};
ListIterator<Integer> pagesList = Arrays.asList(pages).listIterator(pages.length);
while (pagesList.hasPrevious()) {
outPDF.removePage(pagesList.previous());
}
outPDF.close();
我试图将 PDF 中的页面范围保留为总共 12 页并删除其余页面
PdfReader pdfReader = new PdfReader("src/main/sample/test_doc2.pdf");
pdfReader.setUnethicalReading(true);
PdfDocument inputPDF = new PdfDocument(pdfReader);
PdfDocument outputPDF = new PdfDocument(new PdfWriter("src/main/sample/output.pdf").setSmartMode(true));
inputPDF.copyPagesTo(1, inputPDF.getNumberOfPages(), outputPDF, new PdfPageFormCopier());
Integer pages[] = {
1,
2,
3,
4,
5,
6,
7,
8,
9,
// 10,
// 11,
12
};
ListIterator<Integer> pagesList = Arrays.asList(pages).listIterator(pages.length);
while (pagesList.hasPrevious()) {
outputPDF.removePage(pagesList.previous());
}
outputPDF.close();
这适用于大多数范围,但对于某些范围(即,如果我只想保留第 10 页和第 11 页),我在第 303 行的 PDFPagesTree.class::generate_tree()
itext 方法中遇到空指针异常:
assert current != null;
current.addPages(pages);
我尝试了不同的文档,并始终得到范围 10-11 的空指针异常。
这确实是 iText 中的一个错误。作为解决方法,您可以尝试计算最后要保留的页面,而不是先复制它们,然后再删除其中的一些页面。
或者,您可以在从源文档复制页面后使用中间 PDF 作为结果,然后您可以创建另一个 PdfDocument
从中间 PDF 中删除一些页面并生成最终结果.
下面是这种方法的例子:
PdfReader pdfReader = new PdfReader(inputPdf);
pdfReader.setUnethicalReading(true);
PdfDocument inputPDF = new PdfDocument(pdfReader);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfDocument tempPDF = new PdfDocument(new PdfWriter(baos));
inputPDF.copyPagesTo(1, inputPDF.getNumberOfPages(), tempPDF, new PdfPageFormCopier());
tempPDF.close();
PdfDocument outPDF = new PdfDocument(new PdfReader(new ByteArrayInputStream(baos.toByteArray())),
new PdfWriter(outputPdf));
Integer pages[] = {
1,
2,
3,
4,
5,
6,
7,
8,
9,
// 10,
// 11,
12
};
ListIterator<Integer> pagesList = Arrays.asList(pages).listIterator(pages.length);
while (pagesList.hasPrevious()) {
outPDF.removePage(pagesList.previous());
}
outPDF.close();