是否可以将空白页添加到现有的PdfDocument中?我创建了这样的方法:

  public void addEmptyPage(PdfDocument pdfDocument){
    pdfDocument.addNewPage();
    pdfDocument.close();
}


但是,当我将其与PdfDocument一起使用时,它会抛出:

com.itextpdf.kernel.PdfException: There is no associate PdfWriter for making indirects.
at com.itextpdf.kernel.pdf.PdfObject.makeIndirect(PdfObject.java:228) ~[kernel-7.1.1.jar:?]
at com.itextpdf.kernel.pdf.PdfObject.makeIndirect(PdfObject.java:248) ~[kernel-7.1.1.jar:?]
at com.itextpdf.kernel.pdf.PdfPage.<init>(PdfPage.java:104) ~[kernel-7.1.1.jar:?]
at com.itextpdf.kernel.pdf.PdfDocument.addNewPage(PdfDocument.java:416) ~[kernel-7.1.1.jar:?]


将空白页插入pdf文档的正确方法是什么?

最佳答案

com.itextpdf.kernel.PdfException:没有关联的PdfWriter用于进行间接调用。


该异常表明您仅使用PdfDocument而不使用PdfReader初始化PdfWriter。您没有显示您的PdfDocument实例化代码,但我假设您执行以下操作:

PdfReader reader = new PdfReader(SOURCE);
PdfDocument document = new PdfDocument(reader);


这些文件仅供阅读。 (实际上,您可以进行一些小的操作,但没有添加页面那么大。)

如果要编辑PDF,请同时用PdfDocumentPdfReader初始化PdfWriter,例如

PdfReader reader = new PdfReader(SOURCE);
PdfWriter writer = new PdfWriter(DESTINATION);
PdfDocument document = new PdfDocument(reader, writer);


如果要将编辑后的文件存储在与原始文件相同的位置,
您不得使用与SOURCE中的PdfReaderDESTINATION中的PdfWriter相同的文件名。

首先写入一个临时文件,关闭所有参与的对象,然后用该临时文件替换原始文件:

PdfReader reader = new PdfReader("document.pdf");
PdfWriter writer = new PdfWriter("document-temp.pdf");
PdfDocument document = new PdfDocument(reader, writer);
...
document.close();
Path filePath = Path.of("document.pdf");
Path tempPath = Path.of("document-temp.pdf");
Files.move(tempPath, filePath, StandardCopyOption.REPLACE_EXISTING);


或将原始文件读入byte[]并从该数组初始化PdfReader

PdfReader reader = new PdfReader(new ByteArrayInputStream(Files.readAllBytes(Path.of("document.pdf"))));
PdfWriter writer = new PdfWriter("document.pdf");
PdfDocument document = new PdfDocument(reader, writer);
...
document.close();

10-04 23:24