繁体   English   中英

使用iText复制带注释的PDF

[英]Copy PDF with Annotations using iText

我们需要将现有的多个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时不会复制这些交互式功能,这意味着在使用PdfWriter类的getImportedPage()方法复制页面时,所有交互性都会丢失。

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

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

请看一下新的例子:

换句话说:现在可以使用PdfCopy类复制/合并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()方法是您需要记住的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM