我有一个带有空的acroform的PDF / A3文件,需要以编程方式填充。我选择使用itext7库,起初一切似乎都很顺利。填充acroform似乎很容易,结果看起来很好。
现在生成的PDF文件仍然需要符合PDF / A3标准,但由于某种原因,在用我的程序填写表单后,当我检查verapdf以确认我的PDF文件的有效性时,我收到以下错误:
我完全不知道在哪里开始修复它。解码生成的PDF时,以下两部分是唯一包含“pdfuaid”的部分:
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:pdf="http://ns.adobe.com/pdf/1.3/"
xmlns:pdfaid="http://www.aiim.org/pdfa/ns/id/"
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/"
xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema#"
xmlns:pdfaProperty="http://www.aiim.org/pdfa/ns/property#"
xmlns:pdfaType="http://www.aiim.org/pdfa/ns/type#"
xmlns:pdfaField="http://www.aiim.org/pdfa/ns/field#"
xmlns:ftx="http://ns.ftx.com/forms/1.0/"
xmlns:control="http://ns.ftx.com/forms/1.0/controldata/"
xmlns:pdfuaid="http://www.aiim.org/pdfua/ns/id/"
<ftx:ControlData
control:Anzahl_Zeichen_Hausnummer="3"
control:Anzahl_Zeichen_Namenszusatz="0"
control:Anzahl_Zeichen_Postleitzahl="10"
control:Anzahl_Zeichen_Titel="0"
control:Anzahl_Zeichen_Vorname="4"
control:Anzahl_Zeichen_Wohnsitzlaendercode="1"
control:Auftragsnummer_Einsender="0"
control:Formularnummer="10"
control:Formularversion="07.2017"
control:Technische_Version="3"/>
<pdfuaid:part>1</pdfuaid:part>
这是填充PDF的代码:
PdfADocument pdf = new PdfADocument(new PdfReader(TEMPLATE), new PdfWriter(DEST + name + ".pdf"));
PdfFont font = PdfFontFactory.createFont(FONT, PdfEncodings.CP1252, true);
// Hole Acro-Form aus der PDF
PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, false);
// Lese XMP-Metadaten aus der PDF
byte[] xmp = pdf.getXmpMetadata();
XMPMeta meta = XMPMetaFactory.parseFromBuffer(xmp);
JSONArray jsonArr = (JSONArray) this.parser.parse(new FileReader(jsonFile));
// Durchlaufe JSON-Array, in dem alle zu befüllenden Felder stehen
for (Object obj : jsonArr) {
JSONObject json = (JSONObject) obj;
// Lese Daten für dieses Feld aus
String feld = (String) json.get("Bezeichnung");
String val = (String) json.get("value");
String ez = (String) json.get("EZ");
String az = (String) json.get("AZ");
String fontSizeStr = (String) json.get("Size");
// Setze Default FontSize auf 12pt und ändere diese, wenn anders
// spezifiziert in JSON-Datei
int fontSize = 12;
if (fontSizeStr != null && !fontSizeStr.equals("")) {
fontSize = Integer.parseInt(fontSizeStr);
}
if (ez.equals("meta")) {
meta.setStructField(nsControlData, "ControlData", nsControl, feld, val);
} else {
// Lese Art des Feldes aus && parse maximal erlaubte Anzahl
// von
// Zeichen
int maxChar = 0;
int maxDisplay = 0;
boolean kreuzFeld = false;
if (!ez.equals("K")) {
maxChar = Integer.parseInt(ez);
maxDisplay = Integer.parseInt(az);
} else {
kreuzFeld = true;
}
// Befülle Acro-Form
if (!kreuzFeld) {
String value = val;
String display = val;
if (value.length() > maxChar) {
value = value.substring(0, maxChar);
}
if (display.length() > maxDisplay) {
display = display.substring(0, maxDisplay);
}
// Ersetze ";" durch "\n" im Stempel && verringere die
// Fontsize auf 6
if (feld.equals("0000_Vertragsarztstempel")) {
value = value.replace(";", "\n");
fontSize = 6;
}
// Setze Wert und Schriftart für dieses Feld
try {
// form.getField(feld).setFontSize(fontSize);
form.getField(feld).setFontAndSize(font, fontSize);
form.getField(feld).setValue(value, display);
} catch (NullPointerException e) {
System.out.println(feld);
}
} else {
if (!val.equals("0")) {
form.getField(feld).setValue("Yes");
}
}
}
}
// Korrigiere technische Version
meta.setStructField(nsControlData, "ControlData", nsControl, "Technische_Version", "3");
// Setze die erneuerten Metadaten
pdf.setXmpMetadata(meta);
// Schließe ausgefüllte pdf
pdf.close();
如果有人知道如何解决这个问题,我们将不胜感激。感谢。
答案 0 :(得分:1)
感谢blagae,我的问题解决了。这确实是旧版本的表现。
升级到最新版本解决了我的问题。