Заполнение PDF / A3-Acroform с помощью itext7 приводит к тому, что PDF теряет соответствие PDF / A3, и я не могу понять, почему - PullRequest
0 голосов
/ 29 мая 2018

У меня есть файл PDF / A3 с пустой акроформой внутри, который необходимо заполнить программным способом.Я решил использовать библиотеку itext7, и сначала все казалось очень хорошо.Заполнение этой формы было довольно простым, и результат выглядел неплохо.

Теперь полученный PDF-файл по-прежнему должен быть PDF / A3-совместимым, но по какой-то причине, после заполнения формы моей программой, когда я проверяюПо сравнению с verapdf, чтобы подтвердить правильность моего PDF-файла, я получаю следующую ошибку: verapdf error

Я абсолютно не знаю, где вообще начать это исправлять.При декодировании полученного 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();

Если кто-тоесть идеи, как это исправить, любая помощь приветствуется.Спасибо.

1 Ответ

0 голосов
/ 29 мая 2018

Благодаря Blagae, моя проблема была решена.Это действительно была старая версия, которая действовала.

Обновление до последней версии решило мою проблему.

...