Значение сохраненного текстового поля не отображается должным образом в 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.