使用 iText 7 创建带有表单字段的 PDF/A-3 导致 PdfAConformanceException
Creating a PDF/A-3 with form fields using iText 7 results in PdfAConformanceException
我想使用 iText 7(实际上是 7.0.7)创建一个带有表单字段的 PDF/A-3 文件。
我检查了示例和跳转教程。
向 here 添加表单字段后
如所示 here,我收到以下错误:
Exception in thread "main" com.itextpdf.pdfa.PdfAConformanceException: An annotation dictionary shall contain the f key
at com.itextpdf.pdfa.checker.PdfA2Checker.checkAnnotation(PdfA2Checker.java:336)
at com.itextpdf.pdfa.checker.PdfAChecker.checkAnnotations(PdfAChecker.java:467)
at com.itextpdf.pdfa.checker.PdfAChecker.checkPage(PdfAChecker.java:446)
at com.itextpdf.pdfa.checker.PdfAChecker.checkPages(PdfAChecker.java:434)
at com.itextpdf.pdfa.checker.PdfAChecker.checkDocument(PdfAChecker.java:182)
at com.itextpdf.pdfa.PdfADocument.checkIsoConformance(PdfADocument.java:296)
at com.itextpdf.kernel.pdf.PdfDocument.close(PdfDocument.java:742)
at com.itextpdf.layout.Document.close(Document.java:120)
at pdfatest.C07E03_UnitedStates_PDFA_3a.createPdf(C07E03_UnitedStates_PDFA_3a.java:158)
at pdfatest.C07E03_UnitedStates_PDFA_3a.main(C07E03_UnitedStates_PDFA_3a.java:40)
这是修改后的示例代码:
public void createPdf(String dest) throws IOException {
PdfADocument pdf = new PdfADocument(new PdfWriter(dest),
PdfAConformanceLevel.PDF_A_3A,
new PdfOutputIntent("Custom", "", "http://www.color.org",
"sRGB IEC61966-2.1", new FileInputStream(INTENT)));
Document document = new Document(pdf, PageSize.A4.rotate());
document.setMargins(20, 20, 20, 20);
//Setting some required parameters
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 PDF/A-3 example");
//Add attachment
PdfDictionary parameters = new PdfDictionary();
parameters.put(PdfName.ModDate, new PdfDate().getPdfObject());
PdfFileSpec fileSpec = PdfFileSpec.createEmbeddedFileSpec(
pdf, Files.readAllBytes(Paths.get(DATA)), "united_states.csv",
"united_states.csv", new PdfName("text/csv"), parameters,
PdfName.Data, false);
fileSpec.put(new PdfName("AFRelationship"), new PdfName("Data"));
pdf.addFileAttachment("united_states.csv", fileSpec);
PdfArray array = new PdfArray();
array.add(fileSpec.getPdfObject().getIndirectReference());
pdf.getCatalog().put(new PdfName("AF"), array);
//Embed fonts
PdfFont font = PdfFontFactory.createFont(FONT, true);
PdfFont bold = PdfFontFactory.createFont(BOLD_FONT, true);
// Create content
Table table = new Table(new float[]{4, 1, 3, 4, 3, 3, 3, 3, 1});
table.setWidthPercent(100);
BufferedReader br = new BufferedReader(new FileReader(DATA));
String line = br.readLine();
process(table, line, bold, true);
while ((line = br.readLine()) != null) {
process(table, line, font, false);
}
br.close();
document.add(table);
// START additional code to add a form field
PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
PdfFormField textFormField = PdfFormField.createText(
pdf,
new Rectangle(50, 50, 200, 15),
"vo-1-text", "bla", font, 12.0f);
form.addField(textFormField);
// END additional code to add a form field
//Close document
document.close();
}
我是不是漏掉了什么?
如果你可以切换到 iText 7.1.x,那么它就相对容易了:createText
有一个新的重载,它允许你设置一个PdfAConformanceLevel
参数,所以
PdfFormField textFormField = PdfFormField.createText(
pdf,
new Rectangle(50, 50, 200, 15),
"vo-1-text", "bla", font, 12.0f,
false, // multiline parameter
PdfAConformanceLevel.PDF_A_3A // <-- this is the important one
);
如果您不能或不愿切换到 iText 7.1,那么您可以尝试手动触发将设置标志的代码:
for (PdfWidgetAnnotation wid : textFormField.getWidgets()) {
wid.setFlag(PdfAnnotation.PRINT);
}
我不确定最后一种方法是否有效,因为您可能需要明确定义 PdfWidgetAnnotation
,但转到 iText 7.1 会容易得多。
我想使用 iText 7(实际上是 7.0.7)创建一个带有表单字段的 PDF/A-3 文件。
我检查了示例和跳转教程。
向 here 添加表单字段后 如所示 here,我收到以下错误:
Exception in thread "main" com.itextpdf.pdfa.PdfAConformanceException: An annotation dictionary shall contain the f key at com.itextpdf.pdfa.checker.PdfA2Checker.checkAnnotation(PdfA2Checker.java:336) at com.itextpdf.pdfa.checker.PdfAChecker.checkAnnotations(PdfAChecker.java:467) at com.itextpdf.pdfa.checker.PdfAChecker.checkPage(PdfAChecker.java:446) at com.itextpdf.pdfa.checker.PdfAChecker.checkPages(PdfAChecker.java:434) at com.itextpdf.pdfa.checker.PdfAChecker.checkDocument(PdfAChecker.java:182) at com.itextpdf.pdfa.PdfADocument.checkIsoConformance(PdfADocument.java:296) at com.itextpdf.kernel.pdf.PdfDocument.close(PdfDocument.java:742) at com.itextpdf.layout.Document.close(Document.java:120) at pdfatest.C07E03_UnitedStates_PDFA_3a.createPdf(C07E03_UnitedStates_PDFA_3a.java:158) at pdfatest.C07E03_UnitedStates_PDFA_3a.main(C07E03_UnitedStates_PDFA_3a.java:40)
这是修改后的示例代码:
public void createPdf(String dest) throws IOException {
PdfADocument pdf = new PdfADocument(new PdfWriter(dest),
PdfAConformanceLevel.PDF_A_3A,
new PdfOutputIntent("Custom", "", "http://www.color.org",
"sRGB IEC61966-2.1", new FileInputStream(INTENT)));
Document document = new Document(pdf, PageSize.A4.rotate());
document.setMargins(20, 20, 20, 20);
//Setting some required parameters
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 PDF/A-3 example");
//Add attachment
PdfDictionary parameters = new PdfDictionary();
parameters.put(PdfName.ModDate, new PdfDate().getPdfObject());
PdfFileSpec fileSpec = PdfFileSpec.createEmbeddedFileSpec(
pdf, Files.readAllBytes(Paths.get(DATA)), "united_states.csv",
"united_states.csv", new PdfName("text/csv"), parameters,
PdfName.Data, false);
fileSpec.put(new PdfName("AFRelationship"), new PdfName("Data"));
pdf.addFileAttachment("united_states.csv", fileSpec);
PdfArray array = new PdfArray();
array.add(fileSpec.getPdfObject().getIndirectReference());
pdf.getCatalog().put(new PdfName("AF"), array);
//Embed fonts
PdfFont font = PdfFontFactory.createFont(FONT, true);
PdfFont bold = PdfFontFactory.createFont(BOLD_FONT, true);
// Create content
Table table = new Table(new float[]{4, 1, 3, 4, 3, 3, 3, 3, 1});
table.setWidthPercent(100);
BufferedReader br = new BufferedReader(new FileReader(DATA));
String line = br.readLine();
process(table, line, bold, true);
while ((line = br.readLine()) != null) {
process(table, line, font, false);
}
br.close();
document.add(table);
// START additional code to add a form field
PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
PdfFormField textFormField = PdfFormField.createText(
pdf,
new Rectangle(50, 50, 200, 15),
"vo-1-text", "bla", font, 12.0f);
form.addField(textFormField);
// END additional code to add a form field
//Close document
document.close();
}
我是不是漏掉了什么?
如果你可以切换到 iText 7.1.x,那么它就相对容易了:createText
有一个新的重载,它允许你设置一个PdfAConformanceLevel
参数,所以
PdfFormField textFormField = PdfFormField.createText(
pdf,
new Rectangle(50, 50, 200, 15),
"vo-1-text", "bla", font, 12.0f,
false, // multiline parameter
PdfAConformanceLevel.PDF_A_3A // <-- this is the important one
);
如果您不能或不愿切换到 iText 7.1,那么您可以尝试手动触发将设置标志的代码:
for (PdfWidgetAnnotation wid : textFormField.getWidgets()) {
wid.setFlag(PdfAnnotation.PRINT);
}
我不确定最后一种方法是否有效,因为您可能需要明确定义 PdfWidgetAnnotation
,但转到 iText 7.1 会容易得多。