2015-09-04 93 views
2
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正確顯示的字段值之後。但是在此解決方案之後,一旦用戶更改了字段值,我們就無法提取/解析P​​DF字段,並且我們再次解析此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。

+0

我能打開與AR文件,編輯字段,保存文件,然後重新打開這樣的:DOC = PDDocument.load(「SampleTextbox2 .PDF「); PDField field = doc.getDocumentCatalog()。getAcroForm()。getField(「tx1」); System.out.println(field.getValue()); doc.close(); 並且輸出是測試值2,即修改值。 –

回答

1

在上面的問題中,我通過向acroform添加頁面資源並使用正確的默認外觀字符串來修復問題#1。現在我不需要將需求標誌設置爲true。

 PDFont font = PDType1Font.HELVETICA; 
     PDResources res = new PDResources(); 
     String fontName = res.addFont(font); 
     String defaultAppearance = "/"+fontName+" 7 Tf 0 g"; 

     COSDictionary acroFormDict = new COSDictionary(); 
     acroFormDict.setBoolean(COSName.getPDFName("NeedAppearances"), false); 
     acroFormDict.setItem(COSName.getPDFName("Fields"), new COSArray()); 
     acroFormDict.setItem(COSName.DA, new COSString(defaultAppearance)); 

     PDAcroForm acroForm = new PDAcroForm(doc, acroFormDict); 
     acroForm.setDefaultResources(res); 

檢查整個更正如下代碼:

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.PDResources; 
import org.apache.pdfbox.pdmodel.font.PDFont; 
import org.apache.pdfbox.pdmodel.font.PDType1Font; 
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); 

     PDFont font = PDType1Font.HELVETICA; 
     PDResources res = new PDResources(); 
     String fontName = res.addFont(font); 
     String defaultAppearance = "/"+fontName+" 7 Tf 0 g"; 

     COSDictionary acroFormDict = new COSDictionary(); 
     acroFormDict.setBoolean(COSName.getPDFName("NeedAppearances"), false); 
     acroFormDict.setItem(COSName.getPDFName("Fields"), new COSArray()); 
     acroFormDict.setItem(COSName.DA, new COSString(defaultAppearance)); 

     PDAcroForm acroForm = new PDAcroForm(doc, acroFormDict); 
     acroForm.setDefaultResources(res); 

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