【问题标题】:Creating a single PDF file from multiple templates with iText使用 iText 从多个模板创建单个 PDF 文件
【发布时间】:2013-08-06 13:05:27
【问题描述】:

我有以下代码可以打开一个 PDF 模板,用来自 Receipt 对象的数据填充 AcroFields 并输出到浏览器。它与我的收据的一个实例完美配合,但现在我用收据列表重复该过程,以便我可以生成一个连接 pdf 压模实例的单个 PDF 文件。

这是我现在的代码:

response.setContentType("application/pdf");

PdfReader pdfTemplate = new PdfReader ("/receipt-template.pdf");
PdfStamper stamper = new PdfStamper(pdfTemplate, response.getOutputStream());
stamper.setFormFlattening(true);
AcroFields form = stamper.getAcroFields();

// fill the fields as
form.setField("number", recipt.getNumber().toString());

// ...
stamper.close();
pdfTemplate.close();

我想做这样的事情:

pdf = new pdf
foreach receipt in receiptsList
    partial = fillReceiptTemplate (receipt)
    pdf.append (partial)
output pdf

有可能吗?我在一些论坛上读过我应该使用PdfCopyPdfSmartCopy 但我不知道如何,在其他地方说不可能连接整个pdf文档,所以我应该添加页面。..

【问题讨论】:

  • 你好。我有一个我认为非常相似的问题,在此处详述:programmers.stackexchange.com/q/239095/78820。这看起来像一个相关的情况吗?既然你自己已经成功了,你有什么见解吗?非常感谢。

标签: java spring pdf pdf-generation itext


【解决方案1】:

让我总结一下文档中关于您的问题的内容:

  1. 如果最终文档需要交互,您就有问题了。如果您阅读 ISO-32000-1,您会发现 PDF 文档只能包含一个表单。一个字段可以对应多个widget注解,但只能有一个值。例如:如果您有一个带有字段 name 的表单,并且您多次连接同一个表单(使用 PdfCopyFields),那么所有包含与字段 对应的小部件注释的页面>name 将显示相同的名称。您不能在一个页面中 name 字段显示 Bruno,而在另一个页面中 name 字段显示 Joaquin .这在我的书 chapter 6 的第 6.4.3 节中进行了解释,其中示例 ConcatenateForms1 导致同一字段有多个小部件,ConcatenateForms2 在连接表单之前重命名字段。
  2. 在你的情况下,你没有这个问题。您使用stamper.setFormFlattening(true); 行将表单展平,您可以将结果连接起来,如我的书chapter 6 的第6.4.2 节所示,其中DataSheets1 使用PdfCopy 导致文件很大,而DataSheets2 使用PdfSmartCopy 生成的 PDF 尺寸更可接受。

“最终结果需要保持形式”和“最终结果可以展平”之间的区别可以解释为什么您会在不同论坛上获得混合信息。

请注意,DataSheets 示例不会将单个文件存储在磁盘上。相反,这些字节使用ByteArrayOutputStream 保存在内存中,其中toByteArray() 用于构造PdfReader 实例。

【讨论】:

  • 完美的答案,最后我使用 PdfSmartCopy 成功地将内容绕过到阅读器的 ByteArrayOutputStream
猜你喜欢
  • 2014-08-24
  • 2020-10-30
  • 1970-01-01
  • 2022-11-10
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
相关资源
最近更新 更多