2014-10-03 2 views
2

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

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.

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

+0

Посмотрите образцы PdfCopy в главе 6. – mkl

ответ

3

Будучи автором книги, на которую вы ссылаетесь, я хотел бы указать, что примеры в книге несколько устарели. В книге вам будет предложено использовать 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() - метод, который вам нужно запомнить.

+0

Спасибо вам за ответ. – MichaelYu

Смежные вопросы