使用PDFBox克隆包含所有样式的表单域

时间:2015-09-21 20:51:53

标签: pdf pdfbox

我们需要为客户填写表格并获取PDF,他们可以打印,签名和退还。由于PDF必须经常更改,我们使用带有表单字段的PDF模板,这些字段由我们的工具(pdftk)填充。出于各种原因,我想切换到PDFBox(一个是,它要求我们在单个页面中拆分模板并将它们保存到磁盘,填充它们然后再将它们合并在一起)。到目前为止一切正常。

但是我对页码编号感到困惑。由于表单由多个模板组合而成,我必须使用PDFBox修复页码。到目前为止,我们在每个页面上都使用了样式化输入字段page_num。但由于它们都有相同的名称,我无法单独填写它们。

我可以以某种方式拆分或克隆字段并为其指定个人名称,以便我可以单独填写它们吗?当然,造型应该保持原样。

1 个答案:

答案 0 :(得分:1)

在PDFBox的帮助下,我已经开始工作了。我的解决方案是使用JRuby,但我认为您可以很容易地将其转换为Java(删除Java::OrgApachePdfbox...命名空间)。

doc = Java::OrgApachePdfboxPdmodel::PDDocument.load("input.pdf")

form = doc.getDocumentCatalog.getAcroForm
pages = doc.getDocumentCatalog.getAllPages.toArray.to_a
page_num = form.getField("page_num")
string = page_num.getDictionary
  .getDictionaryObject(Java::OrgApachePdfboxCos::COSName::DA)

page_num.getKids.to_array.each do |widget|
  widget_dict = widget.getDictionary
  widget_dict.setString(Java::OrgApachePdfboxCos::COSName::DA, string.getString)
  field = Java::OrgApachePdfboxPdmodelInteractiveForm::PDTextbox.new(
    form,
    widget_dict
  )

  field.setParent(page_num)

  page = (pages.index(widget.getPage) + 1).to_s
  field.setPartialName("page_num_#{page}")
  field.setValue(page)
end

doc.save("output.pdf")