1

我有以下代码可以打开一个 PDF 模板,用对象中的数据填充 AcroFieldsReceipt并输出到浏览器。它与我的收据的一个实例完美配合,但现在我用收据列表重复该过程,以便我可以生成一个连接 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

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

4

1 回答 1

2

让我总结一下文档对您的问题的看法:

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

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

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

于 2013-08-06T06:57:35.217 回答