当前位置: 首页 > 知识库问答 >
问题:

使用iText复制带有注释的PDF

陈嘉荣
2023-03-14

我们需要将现有的多个 PDF 导入到单个新 PDF 中。部分代码的工作方式类似于 iText 在操作 2nd 版的第 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() 方法复制页面时,所有交互性都会丢失。

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

共有1个答案

柯景龙
2023-03-14

作为你提到的那本书的作者,我想指出书中的例子有些过时了。这本书会建议您使用< code>PdfCopyFields来合并表单,但是该类在iText的最新版本中已被弃用。

请看一下新的例子:

    < li >合并表单 < li >合并表单2

换句话说:表单现在可以使用 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();
    }
}

< code>setMergeFields()方法是您需要记住的方法。

 类似资料:
  • 问题内容: 我们需要将现有的多个PDF导入到一个新的PDF中。部分代码的工作方式类似于 iText in Action 2nd Edition 第6.2.1节中的示例代码: 但是,我们只是意识到在处理带有注解的可填充PDF(在我们的示例中,那些PDF已经填充了数据)时,所有填充数据都会丢失在新PDF中。 我们在本书的同一部分找到了答案: 重要的是要理解呈现页面内容所需的资源与页面的交互功能之间的区

  • 问题内容: 有没有办法获取所有带有注释的Controller的列表?我想像这样使用它们: 谢谢! 问题答案: getBeansWithAnnotation() 如果您已使用控制器…对其进行注释: 然后

  • 问题内容: 有没有理由不将Controller映射为接口? 在所有的示例和问题中,我看到了周围的控制器,都是具体的类。是否有一个原因?我想将请求映射与实现分开。但是,当我尝试在具体类中获取a 作为参数时,我碰壁了。 我的Controller界面如下所示: And the implementing class: 该方法效果很好;在抛出一个异常 如果我将注释添加到具体类中,那么一切都会按预期工作,但是

  • 我可以在lombok中使用@JsonIgnore和@getter注释,而不显式定义getter,因为我必须在序列化对象时使用这个JsonIgnore,但是在反序列化时,JsonIgnore注释必须是ignore,所以对象中的字段不能为空。 我知道,只要在password的getter上定义JsonIgnore就可以防止我的密码被序列化,但为此我必须显式定义我不想要的getter。任何建议,任何帮助

  • 矩形是正确的,因为它填充矩形形状的前2行正确显示。这是我有问题的文本。

  • 我正在尝试为我的类禁用几个任意PMD警告。 如何列出要忽略的几个PMD规则?我无法用谷歌找到。 它给出了Eclipse编译时错误: 这是可编译的,但被忽略了 这 结果是 Eclipse配置为接受PMD类型: 不支持@SuppressWarnings("PMD. DoNotCallSystemExit")