【问题标题】:How to fill a PDF/A-1 in Java如何用 Java 填写 PDF/A-1
【发布时间】:2015-06-04 15:14:35
【问题描述】:

我有一个 pdf/a-1 表格,我必须用 Java 填写。

问题是,它适用于普通 pdf,但不适用于 pdf/a-1。

使用普通的 pdf 表单,我显示表单字段并实现一个 HashMap,我从中自己生成一个 fdf 文件。

然后我使用 pdftk.exe 将我的 fdf 文件导入正常的 pdf 格式,它工作正常。

使用 pdf/a-1 表单,我无法显示字段,如果我尝试导入 fdf 文件,它不会填写表单。

我不知道是否有一种简单的方法可以填写 pdf/a-1 表格,或者我是否应该使用一些机制来使我的 pdf/a-1 可以填写?

我已经尝试过 pdfbox 和 itext,但我并没有真正找到任何东西。

以下是一些真正简化的代码实现,它们适用于常规 pdf 表单,但不适用于字段看起来扁平的 pdf/a-1 表单。

使用 iText 显示字段

    File pdfFile = new File(PDF_FILE_PATH);

    // Display fields
    PdfReader reader = new PdfReader(pdfFile.getAbsolutePath());
    System.out.println("\n-----Champs du pdf-----");
    for (String field : reader.getAcroFields().getFields().keySet()) {
        if (field instanceof String) {
            System.out.println("String " + field);
        } else {
            System.out.println(field.getClass().getSimpleName() + " " + field.toString());
        }
    }
    System.out.println("----------\n");
    reader.close();

使用 PDFBox

    File pdfFile = new File(PDF_FILE_PATH);

    // HashMap Test
    HashMap<String, Object> map = new HashMap<String, Object>();
    map.put("age", "37");
    map.put("name", "Jack");
    map.put("address", "930 rue des Pommes");
    map.put("lastname", "Wilson");
    map.put("description",
            "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.");


    // Load the existing pdf file
    PDDocument pdd = PDDocument.load(pdfFile);
    PDAcroForm acroForm = pdd.getDocumentCatalog().getAcroForm();


    // For each item, sets a value to the corresponding field
    for (String item : map.keySet()){
        acroForm.getField(item).setValue((String) map.get(item));
    }

    // Save
    pdd.save(pdfFile);
    pdd.close();

使用 pdftk

使用 pdftk 的实现在很多方面都与上述类似,但我从 HashMap 生成一个 fdf 文件并使用以下命令行:

pdftk.exe myForm.pdf fill_form myFdf.fdf output fulfilled_form.pdf flatten

这是我的两种形式,一种是普通的,一种是使用 pdf/a-1 格式的:

Regular PDF

PDF/A-1

希望你能帮忙。

最好的问候。

【问题讨论】:

  • 我建议您还为您的问题添加一个示例 pdf,以及一些说明您如何处理文件的示例代码。
  • 当您尝试 iText 时,确定您使用的是 PdfAStamper 而不是 PdfStamper?如果不是,那么当 PDF/A 合规性中断时,您不应该感到惊讶。正如@yms 所指出的,您应该添加一些代码示例来说明您尝试过的内容。见api.itextpdf.com/pdfa/com/itextpdf/text/pdf/PdfAStamper.html
  • 您确实知道 pdftk 实际上是使用 GCJ 编译为可执行文件的 iText 的过时版本,对吗?发生这种情况时,iText 不支持 PDF/A,因此您不应期望 pdftk 能够正常工作。
  • 感谢您的回答,我已按照建议添加了一些示例。当我将文档导出为 PDF/A-1 时,它几乎看起来像是将其保存为图像,但我无法从中得到任何东西......
  • 您的编辑似乎表明您仍然希望为您的 PDF/A“表单”实现一些目标。但那应该是什么? @Bruno 在他的回答中已经表明,您的 PDF/A“表格”不是要填写的表格,而只是具有表格外观的东西。

标签: java forms pdf fdf pdfa


【解决方案1】:

我下载了文件formire-a1.pdf,因为我想写一个小的概念证明来填写它。然而,当我检查这个文件时,我发现它没有表单域。

请看下面的屏幕截图:

我在目录中没有看到任何 AcroForm 条目;我没有看到任何字段。

请把上面的截图和这个对比一下:

这是您表单的“非 PDF/A”版本。在这里,我们确实有一个 AcroForm 和一个字段数组。这是一个可以填写的表格;公式-a1.pdf 不是。

【讨论】:

  • 哦,我使用 OpenOffice 从完全相同的文档制作这些表单。一个保存为常规 pdf,另一个导出为 PDF/A-1。我想我会尝试另一种形式,谢谢。
  • 显然,在您的情况下,OO 通过展平表单使其无法作为常规表单填写,将文件导出为 PDF/A。
猜你喜欢
  • 1970-01-01
  • 2012-07-26
  • 2022-06-29
  • 2015-02-27
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
相关资源
最近更新 更多