Скопируйте PDF с аннотациями, используя iText

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

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 учебный класс.

Но какое решение оставить эти аннотации?

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() Метод - это метод, который вам нужно запомнить.

Другие вопросы по тегам