O valor do campo de texto salvo não é exibido corretamente no PDF gerado usando o 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();
}
}
Problema 1 Eu criei um campo de texto como mostrado no código acima e tentei definir o valor usando textbox.setValue ("Test Value"); método, mas está dando erro, como mostrado abaixo:
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)
Edição 2
Para corrigir o problema nº 1, se eu definir o valor de textBox usando a propriedade cosDictionary, ou seja, cosDict1.setItem (COSName.V, new COSString ("Test Value1"));
Em seguida, no Adobe Reader, o valor de textBox não é preenchido corretamente. Eu tenho que clicar na caixa de texto e, em seguida, apenas o valor aparece e, depois que saio do campo, o valor novamente fica invisível.
Edição nº 3
Para corrigir o problema nº 2, preciso definir o sinalizador needAppearances como true, como mostrado abaixo, e após esse valor do campo ser exibido corretamente em PDF. Porém, após essa solução, não consigo extrair / analisar o campo PDF novamente quando o usuário altera o valor do campo e analisamos novamente esse PDF.
Nota:- Esse problema existe no Adobe Reader. Aqui, ao abrir o PDF, ele também envia algumas mensagens comocorrigindo campos de formulário. E depois que eu salvo o PDF e tentei analisar os campos acroformados, todos os campos foram redefinidos ou nulos. Nenhum nome ou valor do campo pode ser extraído.
Então, usando acroFormDict.setBoolean (COSName.getPDFName ("NeedAppearances"), true); no código parece arriscado e cria outro problema na análise de PDF, portanto não pode ser usado.
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);
Acho que preciso definir PDAppearanceDictionary para campos de texto, mas não sei fazer isso e se preciso definir para cada campo ou no nível de acroforma.
Por favor me ajude com esse problema, como devo resolver. Estou usando o PDFBOX versão 1.8.10.