用 itext7 填写 PDF/A3-Acroform 会使 PDF 失去 PDF/A3 合规性,我不明白为什么

Filling out a PDF/A3-Acroform with itext7 makes the PDF lose its PDF/A3 compliance and I can't figure out why

我有一个 PDF/A3 文件,里面有一个空的 acroform,需要以编程方式填充。我选择使用 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();

如果有人知道如何解决这个问题,我们将不胜感激。谢谢。

多亏了blagae,我的问题解决了。确实是老版本出问题了

升级到最新版本解决了我的问题。