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