如何在Java中自动填写PDF表单

2022-09-01 15:58:49

我正在为我住的地方附近的食品储藏室做一些“无偿”开发。他们被表单和文书工作淹没了,我想开发一个系统,该系统只需从他们的MySQL服务器(我在以前的项目中为他们设置)读取数据,并将数据馈送到他们需要填写的所有表单的PDF版本中。这将极大地帮助他们,为他们节省大量时间,并摆脱填写这些表格时犯的许多人为错误。

由于对PDF文件的内部一无所知,我可以预见到这里有两种途径:

  • 更难的方法:可以扫描纸质文档,将其转换为PDF,然后使用软件只需说“将除blah以外的文本添加到以下(x,y)坐标......”即可“填写”PDF;或
  • 更简单的方法:PDF规范已经允许构建可以填写的“字段”;这样,我只需编写代码,即“将文本摘录blah添加到名为*address_value*...”的字段中,等等。

所以我的第一个问题是:我面对的是两条途径中的哪一条?PDF是否有“字段”的概念,或者我是否需要通过告诉PDF库放置数据的像素坐标来“填写”这些文档?

其次,我显然需要一个开源(和Java)库来做到这一点。iText似乎是一个良好的开端,但我听说它可能很难使用。任何人都可以在这里提出一些想法或一般建议吗?提前致谢!


答案 1

您可以使用FDF(表单数据格式)技术轻松地将数据合并到PDF的字段中。

Adobe提供了一个库来做到这一点:Acrobat Forms Data Format (FDF) Toolkit

Apache PDFBox也可以用来做到这一点。


答案 2

请查看免费电子书《StackOverflow上的最佳iText问题》中有关交互式表单的章节。它捆绑了以下问题的答案:

或者,您可以观看此视频,其中我解释了如何使用表单逐步进行报告

例如,请参阅:

public void manipulatePdf(String src, String dest) throws DocumentException, IOException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader,
            new FileOutputStream(dest));
    AcroFields fields = stamper.getAcroFields();
    fields.setField("name", "CALIFORNIA");
    fields.setField("abbr", "CA");
    fields.setField("capital", "Sacramento");
    fields.setField("city", "Los Angeles");
    fields.setField("population", "36,961,664");
    fields.setField("surface", "163,707");
    fields.setField("timezone1", "PT (UTC-8)");
    fields.setField("timezone2", "-");
    fields.setField("dst", "YES");
    stamper.setFormFlattening(true);
    stamper.close();
    reader.close();
}

推荐