4

我们需要将现有的多个 PDF 导入到一个新的 PDF 中。部分代码的工作方式类似于iText in Action 2nd edition的第 6.2.1 节中的示例代码:

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

但是保留这些注释的解决方案是什么?

4

1 回答 1

5

作为您所指的书的作者,我想指出书中的例子有些过时了。这本书会建议你使用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()方法就是你需要记住的方法。

于 2014-10-04T17:29:33.057 回答