Значение сохраненного текстового поля не отображается должным образом в PDF, созданном с использованием PDFBOX

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();
    }
}

Выпуск № 1 Я создал одно текстовое поле, как показано в приведенном выше коде, и попытался установить значение с помощью textbox.setValue («Test Value»); метод, но он дает ошибку, как показано ниже:

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)

Выпуск № 2

Для решения проблемы # 1, если я устанавливаю значение textBox, используя свойство cosDictionary, то есть cosDict1.setItem (COSName.V, new COSString ("Test Value1"));

Тогда в Adobe Reader значение textBox не заполняется должным образом. Я должен нажать на текстовое поле, и тогда появится только значение, и как только я выйду из поля, значение снова станет невидимым.

Выпуск № 3

Чтобы решить проблему №2, мне нужно установить флаг needAppearances в значение true, как показано ниже, и после этого значение поля будет правильно отображаться в PDF. Но после этого решения я не могу извлечь / проанализировать поле PDF обратно, как только пользователь изменит значение поля, и мы снова проанализируем этот PDF.

Заметка:- Эта проблема существует в Adobe Reader, здесь, открывая PDF, он также выдает сообщениеисправление полей формы, И как только я сохраняю PDF и пытаюсь проанализировать поля acroform, все поля оказываются сброшенными или равными нулю. Ни одно из имени поля или значений поля не может быть извлечено.

Таким образом, используя acroFormDict.setBoolean (COSName.getPDFName ("NeedAppearances"), true); в коде кажется рискованным, и это создает другую проблему при разборе PDF, поэтому его нельзя использовать.

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);

Я думаю, мне нужно установить PDAppearanceDictionary для текстовых полей, но я не знаю, как это сделать, и нужно ли мне устанавливать для каждого поля или на уровне acroform.

Пожалуйста, помогите мне с этой проблемой, как я должен решить. Я использую PDFBOX версии 1.8.10.

Ответы на вопрос(1)

Ваш ответ на вопрос