首页 文章

使用 iText 复制带注释的 PDF

提问于
浏览
3

我们需要将现有的多个 PDF 导入到一个新的 PDF 中。部分代码与第 2 版动作中的 iText 部分 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();

但是,我们刚刚意识到在处理带注释的 fill-able PDF 时(在我们的例子中,那些 PDF 已经填充了数据),所有填充的数据都会丢失在新的 PDF 中。

我们在本书的同一部分找到了答案:

了解呈现页面内容所需的资源与页面的交互功能之间的区别非常重要。通常,这些功能称为注释。它们包括链接,文本注释和表单字段。注释不是内容流的一部分。它们未列在页面的资源字典中,而是列在注释字典中。使用PdfImportedPage时不会复制这些交互式功能,这意味着在使用PdfWriter类的getImportedPage()方法复制页面时,所有交互性都会丢失。

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

1 回答

  • 4

    作为你所提到的书的作者,我想指出书中的例子有点过时了。本书将建议您使用PdfCopyFields来合并表单,但在最新版本的 iText 中不推荐使用该类。

    请看一下新的例子:

    换句话说:表单现在可以使用PdfCopy类 copied/merged,但是导入它以告诉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()方法是您需要记住的方法。

相关问题