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();