27

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

对 PDF 文件的内部一无所知,可以预见两种途径:

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

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

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

4

3 回答 3

26

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

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

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

于 2012-07-28T15:26:41.397 回答
5

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

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

参见例如:

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();
}
于 2015-05-11T10:48:53.613 回答
1
public void fillPDF()
{

     try {
            PDDocument pDDocument = PDDocument.load(new File("D:/pdf/pdfform.pdf")); // pdfform.pdf is input file
            PDAcroForm pDAcroForm = pDDocument.getDocumentCatalog().getAcroForm();


         PDField field = pDAcroForm.getField("Given Name Text Box"); 

          field.setValue("Kalyan"); 
          field = pDAcroForm.getField("Family Name Text Box");
          field.setValue("Gutta");
          field = pDAcroForm.getField("Country Combo Box");
          field.setValue("India");
          System.out.println("country combo" );
          field = pDAcroForm.getField(" Driving License Check Box");

          field = pDAcroForm.getField("Favourite Colour List Box");
        System.out.println("country combo"+ field.isRequired());
          pDDocument.save("D:/pdf/pdf-java-output.pdf");
             pDDocument.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
}
于 2020-03-14T18:54:52.823 回答