如何在 Java 中填写 PDF/A-1
How to fill a PDF/A-1 in Java
我有一个 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 格式:
希望你能帮到你。
此致。
我下载了文件 formulaire-a1.pdf 因为我想写一个小的概念证明来填充它。然而,当我检查这个文件时,我发现它没有表单域。
请参阅下面的屏幕截图:
我在目录中没有看到任何 AcroForm 条目;我没有看到任何字段。
请将上面的屏幕截图与此屏幕截图进行比较:
这是您表单的 "non PDF/A" 版本。这里我们有一个 AcroForm 和一个字段数组。这是一个可以填写的表格;公式-a1.pdf 不是。
我有一个 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 格式:
希望你能帮到你。
此致。
我下载了文件 formulaire-a1.pdf 因为我想写一个小的概念证明来填充它。然而,当我检查这个文件时,我发现它没有表单域。
请参阅下面的屏幕截图:
我在目录中没有看到任何 AcroForm 条目;我没有看到任何字段。
请将上面的屏幕截图与此屏幕截图进行比较:
这是您表单的 "non PDF/A" 版本。这里我们有一个 AcroForm 和一个字段数组。这是一个可以填写的表格;公式-a1.pdf 不是。