Gespeicherter Textfeldwert wird in PDF-Dateien, die mit PDFBOX erstellt wurden, nicht richtig angezeigt.

import java.io.IOException;

import javax.swing.text.BadLocationException;

import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSFloat;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSString;
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.interactive.action.PDAnnotationAdditionalActions;
import org.apache.pdfbox.pdmodel.interactive.action.type.PDActionJavaScript;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDTextbox;
import org.junit.Test;

public class TestPDTextbox {
    @Test
    public void Sample1 () throws IOException, COSVisitorException, BadLocationException {


        PDDocument doc = new PDDocument();
        PDPage page = new PDPage();
        doc.addPage(page);   

        COSDictionary acroFormDict = new COSDictionary(); 
//        acroFormDict.setBoolean(COSName.getPDFName("NeedAppearances"), true);
        acroFormDict.setItem(COSName.getPDFName("Fields"), new COSArray());

        PDAcroForm acroForm = new PDAcroForm(doc, acroFormDict);
        doc.getDocumentCatalog().setAcroForm(acroForm);

        COSDictionary cosDict1 = new COSDictionary();
        COSArray rect1 = new COSArray();
        rect1.add(new COSFloat(100));
        rect1.add(new COSFloat(700));
        rect1.add(new COSFloat(200));
        rect1.add(new COSFloat(750));

        cosDict1.setItem(COSName.RECT, rect1);
        cosDict1.setItem(COSName.FT, COSName.getPDFName("Tx")); // Field Type
        cosDict1.setItem(COSName.TYPE, COSName.ANNOT);
        cosDict1.setItem(COSName.SUBTYPE, COSName.getPDFName("Widget"));
        cosDict1.setItem(COSName.T, new COSString("tx1"));
        cosDict1.setItem(COSName.DA, new COSString("/Helv 7 Tf 0 g"));
        cosDict1.setItem(COSName.V, new COSString("Test Value1"));

        PDTextbox textbox = new PDTextbox(doc.getDocumentCatalog().getAcroForm(), cosDict1);

//      textbox.setValue("Test Value");

        page.getAnnotations().add(textbox.getWidget());
        acroForm.getFields().add(textbox);

         doc.save("C:\\PDF\\SampleTextbox.pdf");
         doc.close();
    }
}

Fehler Ich habe ein Textfeld wie oben gezeigt erstellt und versucht, den Wert mit textbox.setValue ("Test Value") festzulegen. Methode, aber es gibt Fehler wie unten gezeigt:

java.io.IOException: Error: Don't know how to calculate the position for non-simple fonts
    at org.apache.pdfbox.pdmodel.interactive.form.PDAppearance.getTextPosition(PDAppearance.java:1037)
    at org.apache.pdfbox.pdmodel.interactive.form.PDAppearance.insertGeneratedAppearance(PDAppearance.java:558)
    at org.apache.pdfbox.pdmodel.interactive.form.PDAppearance.setAppearanceValue(PDAppearance.java:338)
    at org.apache.pdfbox.pdmodel.interactive.form.PDVariableText.setValue(PDVariableText.java:131)
    at sample.pdfbox.example.TestPDTextbox.Sample1(TestPDTextbox.java:54)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

Ausgabe # 2

Um das Problem Nr. 1 zu beheben: Wenn ich den Wert von textBox mithilfe der cosDictionary-Eigenschaft festgelegt habe, d.

Dann wird der Wert von textBox in Adobe Reader nicht richtig ausgefüllt. Ich muss auf ein Textfeld klicken und dann wird nur der Wert angezeigt. Wenn ich aus dem Feld aushebe, wird der Wert wieder unsichtbar.

Ausgabe # 3

Um das Problem Nr. 2 zu beheben, muss das needAppearances-Flag wie unten gezeigt auf true gesetzt werden. Danach wird der Feldwert in PDF ordnungsgemäß angezeigt. Aber nach dieser Lösung kann ich das PDF-Feld nicht mehr extrahieren / analysieren, sobald der Benutzer den Feldwert ändert und wir das PDF erneut analysieren.

Hinweis: Dieses Problem gibt es in Adobe Reader. Hier wird beim Öffnen von PDF eine Meldung angezeigt, wie zBFixing Formularfelder nach oben. Und sobald ich PDF gespeichert und versucht habe, Acroform-Felder zu analysieren, werden alle Felder als zurückgesetzt oder als null erkannt. Keiner der Feldnamen oder Feldwerte kann extrahiert werden.

So using acroFormDict.setBoolean (COSName.getPDFName ("NeedAppearances"), true); im Code scheint riskant zu sein und es entsteht ein anderes Problem bei der PDF-Analyse, sodass es nicht verwendet werden kann.

COSDictionary acroFormDict = new COSDictionary(); 
        acroFormDict.setBoolean(COSName.getPDFName("NeedAppearances"), true);
        acroFormDict.setItem(COSName.getPDFName("Fields"), new COSArray());

        PDAcroForm acroForm = new PDAcroForm(doc, acroFormDict);
        doc.getDocumentCatalog().setAcroForm(acroForm);

Ich denke, ich muss PDAppearanceDictionary für Textfelder festlegen, aber ich weiß nicht, ob ich dies für jedes Feld oder auf Acroform-Ebene festlegen muss.

Bitte hilf mir bei diesem Problem, wie ich es lösen soll. Ich benutze PDFBOX Version 1.8.10.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage