2013-11-25 46 views
3

我正在使用iText來閱讀PDF文件。我有不同的fillColor屬性在我的pdf中有20個Acro文本字段。我試圖閱讀的屬性,但無法閱讀。有沒有什麼辦法可以讓我們在java中獲得具有特定顏色的字段作爲它們的fillcolor屬性?如何使用iText獲取AcroField屬性?

編輯: 我使用下面的Adobe的Javascript創建的PDF ACRO領域

var oFld = this.addField("nameOfField", "button", 0, fldRect); 
    if (oFld != null) { 
     oFld.buttonSetCaption(""); 
     oFld.borderStyle = border.s; 
     oFld.fillColor = color.gray; 
     oFld.textColor = color.white; 
     oFld.lineWidth = 1; 
    } 

UPDATE:

現在我能讀顏色屬性。

我不確定這是否是正確的做法?

if(dict.getAsDict(PdfName.MK).get(PdfName.BG) !=null){ 
      if(dict.getAsDict(PdfName.MK).get(PdfName.BG).toString().trim().equals("  
    [0.0, 1.0, 0.0]")){ 
       System.out.println(entry.getKey()); 
       System.out.println("Green"); 
      } 
      if(dict.getAsDict(PdfName.MK).get(PdfName.BG).toString().trim().equals(" 
     [1.0, 0.0, 0.0]")){ 
       System.out.println(entry.getKey()); 
       System.out.println("Red"); 
      } 

     } 
+0

請提供有問題的PDF。只是爲了確認,在iText掌握之前已經將Javascript應用於PDF *,並且您不希望iText執行Javascript,對嗎? – mkl

+0

*正確的方法來做到這一點* - 以及與字符串比較檢查是**不是正確的方式。這些是數字,應該檢查爲數字。此外,如果(dict.getAsDict(PdfName.MK).get(PdfName.BG)!= null)'初始'if'子句'在沒有** MK **字典的情況下失敗。 – mkl

+0

感謝您指出,如果(ict.getAsDict(PdfName.MK)!= null)應該避免空指針異常和比較,我應該遍歷[1.0,0.0,0.0]並比較每個數字,或者我怎麼能做數字比較? @mkl – MaheshVarma

回答

5

Chapter 8我的書從較高層次討論了AcroForm字段。如果你想深入挖掘,你需要chapter 13。在頁449,表13.11列出了不同的AcroFields.Item方法。正如您所知,表單字段使用表單字典進行描述。使用一個或多個小部件註釋來描述(或者)描述字段的視覺表示。您正在尋找外觀屬性,因此您需要註釋字典。

您還知道,字段字典和小部件字典通常會在一個字段與一個小部件註釋對應時合併,這就是爲什麼AcroFields.Item類具有名爲getMerged()的方法的原因。對於特定字段的每個窗口部件註釋,它將返回字段和窗口部件註釋的合併屬性。

這就是理論。讓我們來看一個例子:InspectForm

Map<String,AcroFields.Item> fields = form.getFields(); 
AcroFields.Item item; 
PdfDictionary dict; 
int flags; 
for (Map.Entry<String,AcroFields.Item> entry : fields.entrySet()) { 
    out.write(entry.getKey()); 
    item = entry.getValue(); 
    dict = item.getMerged(0); 
    // inspect dict 
} 

在這個例子中,我們檢查字段標誌(/FF),這是該領域字典的性能。你有興趣的外觀特徵,所以我想你會想檢查/MK條目,該條目(ISO-32000-1表188):

的外觀特徵詞典(見表189),其應 用於構建一個動態的外觀流,指定頁面上的註釋的可視化表示的 。這個 條目的名稱MK僅具有歷史意義,並沒有直接意義。

你需要看看錶189找出特定的屬性,你想:

[R整數(可選):的度數由小部件 註釋應相對於頁面逆時針旋轉。所述 值應爲90默認值的倍數:0.

BC陣列(可選): 數字,應介於0.0至1的數組。0指定 小部件註釋邊框的顏色。數組 元素的數量決定了顏色應定義爲 的顏色空間:0無顏色;透明1 DeviceGray 3 DeviceRGB 4 DeviceCMYK

BG陣列(可選):數字,應介於0.0 到1.0指定插件註釋的背景的顏色的數組。 數組元素的數量決定顏色空間,如BC描述的 。

CA文本字符串(可選按鈕字段僅):的 Widget註釋的通常字幕,須當 不與用戶交互的顯示。與此表中僅列出與 按鈕字段(請參閱第12.7.4.2節「按鈕字段」中的按鈕)關聯的窗口小部件註釋的其餘條目 不同,該條目可與任何類型的按鈕字段一起使用,包括檢查 框(請參閱12.7.4.2「按鈕域」中的複選框)和單選按鈕 (12.7.4.2「按鈕域」中的單選按鈕)。

RC文本串(可選;按鈕字段僅):小部件註釋的側翻 字幕,當用戶滾動光標變爲 其有源區不按下鼠標按鈕,其將被顯示。

AC文本串(可選;只有按鈕字段):小部件標註的備用 (向下)字幕,當鼠標按鈕是 其有效區域內按下其將被顯示。

當你問的填充顏色,我認爲你指的是背景色,這意味着你必須看看BC 條目使用的色彩,並在BG輸入實際的顏色值。

+0

我使用dict.getAsDict(PdfName.MK).get(PdfName.BG)來獲取顏色值,您提到了表189以查找特定屬性,在哪裏可以找到表?它是否在PDF規格? – MaheshVarma

+0

是的,我完全複製了我的答案:R,BC,BG,CA,RC和AC是該表中列出的條目。假設BC是3,那麼BG將是一個包含三個值的數組:一個紅色,綠色和黃色值,表示爲介於0和1之間的數字。 –

+0

感謝您的明確解釋。現在我可以讀取acro字段的顏色屬性。我更新了我的問題。 @BrunoLowagie – MaheshVarma