当前位置: 首页 > 面试题库 >

使用iText复制带注释的PDF

曹凯泽
2023-03-14
问题内容

我们需要将现有的多个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

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


问题答案:

作为您所引用的书的作者,我想指出的是,书中的示例有些过时了。该书将建议您使用PdfCopyFields合并表单,但是该类在最新版本的iText中已弃用。

请看一下新的例子:

  • 合并表格
  • 合并表格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();
    }
}

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



 类似资料:
  • 我们需要将现有的多个 PDF 导入到单个新 PDF 中。部分代码的工作方式类似于 iText 在操作 2nd 版的第 6.2.1 节中的示例代码: 然而,我们刚刚意识到,在处理带注释的可填充PDF时(在我们的例子中,那些PDF已经填充了数据),所有填充的数据在新的PDF中都丢失了。 我们在书的同一部分找到了答案: 了解呈现页面内容所需的资源与页面的交互功能之间的区别非常重要。通常,这些功能称为批注

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

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

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

  • 我有一把刀: 问题是,当我试图使用DAO进行加载调用时,使用DynamoDBMapper以field d1作为哈希键来获取项目,它会抛出一个DynamoDBExc0019,说:为公共DAO. getField2()找到了空键,但实际上表的值对应于field d2。问题,这是因为Lombok注释而不是手动突变代码,还是一般来说我们一起使用Lombok和DynamoDBAnnotions?

  • 我正在使用注释处理器来处理方法参数的注释。 用于参数的注释类型有一个注释@参数 现在,当注释处理器运行时,我想检查参数注释()是否有参数注释。我通过执行以下代码来实现这一点。 由于某种原因,arg始终为空。是否有注释未返回的原因?