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(「測試顯示生成的值」);的方法,但如下所示,它給錯誤:保存的文本字段值沒有正確使用PDF PDFBOX
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,如果我使用cosDictionary屬性 即cosDict1.setItem設置TextBox的值(COSName.V,新的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。
我能打開與AR文件,編輯字段,保存文件,然後重新打開這樣的:DOC = PDDocument.load(「SampleTextbox2 .PDF「); PDField field = doc.getDocumentCatalog()。getAcroForm()。getField(「tx1」); System.out.println(field.getValue()); doc.close(); 並且輸出是測試值2,即修改值。 –