Добавить пустую / пустую страницу в PdfDocument Java - PullRequest
0 голосов
/ 15 октября 2019

Есть ли способ добавить пустую страницу в существующий документ PDF? Я создал метод, подобный этому:

  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-документ?

1 Ответ

1 голос
/ 15 октября 2019

com.itextpdf.kernel.PdfException: не существует ассоциированного PdfWriter для создания косвенных адресов.

Это исключение указывает, что вы инициализируете PdfDocument только с PdfReader, нетPdfWriter. Вы не показываете свой PdfDocument код экземпляра, но я предполагаю, что вы делаете что-то вроде этого:

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

Такие документы предназначены для только для чтения . (На самом деле вы можете сделать некоторые незначительные манипуляции, но не такие большие, как добавление страниц.)

Если вы хотите редактировать PDF, инициализируйте PdfDocument с PdfReader иPdfWriter, например

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

Если вы хотите сохранить отредактированный файл в том же месте, что и исходный файл, вы не должны использовать то же имя файла, что и SOURCE вPdfReader и как DESTINATION в 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();
...