Скопируйте PDF с аннотациями с помощью iText

Нам нужно импортировать несколько существующих PDF-файлов в один новый PDF-файл. Часть кодов работает аналогично образцам кодов в разделе 6.2.1 документа iText in Action 2nd edition:

Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(
    document, new FileOutputStream(RESULT));
document.open();
PdfPTable table = new PdfPTable(2);
PdfReader reader = new PdfReader(MovieTemplates.RESULT);
int n = reader.getNumberOfPages();
PdfImportedPage page;
for (int i = 1; i <= n; i++) {
    page = writer.getImportedPage(reader, i);
    table.addCell(Image.getInstance(page));
}
document.add(table);
document.close();

Однако мы только что осознали, что при работе с заполняемыми PDF-файлами с аннотациями (в нашем случае в этих PDF-файлах уже есть заполненные данные), все заполненные данные теряются в новом PDF-файле.

Мы нашли ответ в том же разделе книги:

Важно понимать разницу между ресурсами, необходимыми для отображения содержимого страницы, и интерактивными функциями страницы. Обычно эти функции называются аннотациями. Они включают ссылки, текстовые аннотации и поля формы. Аннотации не являются частью потока контента. Они перечислены не в словаре ресурсов страницы, а в словаре аннотаций. Эти интерактивные функции не копируются при использовании PdfImportedPage, что означает, что вся интерактивность теряется при копировании страницы с помощью метода getImportedPage() класса PdfWriter.

Но как можно сохранить эти аннотации?


person MichaelYu    schedule 03.10.2014    source источник
comment
Взгляните на образцы PdfCopy в главе 6.   -  person mkl    schedule 03.10.2014


Ответы (1)


Как автор книги, о которой вы говорите, я хотел бы отметить, что примеры в книге несколько устарели. Книга посоветует вам использовать PdfCopyFields для объединения форм, но этот класс устарел в последних версиях iText.

Взгляните на новые примеры:

Другими словами: формы теперь можно копировать / объединять с помощью класса PdfCopy, но он импортируется, чтобы сообщить PdfCopy, что поля необходимо объединить, как это сделано в следующем фрагменте кода:

public void createPdf(String filename) throws IOException, DocumentException {
    PdfReader[] readers = {
        new PdfReader(getFile1()),
        new PdfReader(getFile2())
    };
    createPdf(filename, readers);
}

public void createPdf(String filename, PdfReader[] readers)
    throws IOException, DocumentException {
    Document document = new Document();
    PdfCopy copy = new PdfCopy(document, new FileOutputStream(filename));
    copy.setMergeFields();
    document.open();
    for (PdfReader reader : readers) {
        copy.addDocument(reader);
    }
    document.close();
    for (PdfReader reader : readers) {
        reader.close();
    }
}

Метод setMergeFields() - это метод, который вам нужно запомнить.

person Bruno Lowagie    schedule 04.10.2014
comment
Спасибо за ответ. - person MichaelYu; 06.10.2014
comment
Именно то, что я искал. Спасибо. - person paulchapman; 09.09.2020