2010-01-15 70 views
4

對不起,如果存在類似我的帖子,但我是新的論壇,我還沒有找到它。在TextField中適合文本IText

我有動態調整大小的問題TextField大小取決於文本大小。我填充AcroForm中的現有PDF - 填充字段:

form.setField(「field」,「value」);(etc.)

一切都沒問題,但我也想設置文本(在TextField中),其大小大於字段大小。我如何動態調整TextField的大小(在setField之後/可能在AcroForm創建過程中設置一些字段屬性)以適應文本(比TextField更大的文本)?此TextField必須具有與文本大小完全相同的大小,而不必將字體大小更改爲較小的大小,並且不在此TextField中滾動。

預先感謝幫助。

+0

我懷疑是否有其他類似的問題。在使用PDF> 13年之後,從未聽說過任何人需要類似的東西。 – 2010-11-02 18:53:24

回答

7

那麼很容易做到與你想要的相反,改變字體大小,所有文本都可見。您只需將字體大小設置爲'0',iText(或Acrobat,或其他)就可以確定使用什麼字體大小(在一些合理的範圍內)。


要確定給定的文本塊的長度,您可以撥打myBaseFont.getWidthPoint(fieldValToBe, fontSize)。然後您可以在之前確定字段,您可以撥打setField。默認情況下,iText會爲您呈現字段外觀,並且您可以在setField之後完成渲染。改字後的字段大小不會改變字段的外觀,除非再次調用setField

好的,那麼如何改變字段的大小? iText不直接支持,所以你必須用iText的低級PDF對象來完成。事情是這樣的:

AcroFields.Item fldItem = myAcroFields.getFieldItem("fieldName"); 

for (int i =0; i < fldItem.size(); ++i) { 
    // "widget" is the visible portion of the field 
    PdfDictionary widgetDict = fldItem.getwidget(0); 

    // pdf rectangles are stored as [llx, lly, urx, ury] 
    PdfArray rectArr = widgetDict.getAsArray(PdfName.RECT); // should never be null 
    float origX = rectArr.getAsNumber(0).floatValue(); 
    // overwrite the old value. 
    rectArr.set(2, new PdfNumber(origX + newWidth + FUDGE_FACTOR)); 
} 

FUDGE_FACTOR需要考慮合適的&左邊框的厚度。我猜測3-5分,取決於斜面與平面邊界,線條粗細等等。你可能只是選擇一個價值,並與它一起去。

該循環可能是不必要的,因爲很少有多個字段共享一個名稱。 OTOH,如果這就是你所反對的,你可能還需要重新計算newWidth,因爲不同的實例不需要共享相同的字體大小。

最後,您可能需要將這個新的rectArr寫入該項目的「合併」版本以及小部件版本。 iText在處理字段時幾乎可以與合併版本一起工作,因爲所有可能的鍵/值對都在那裏,您可能必須使用小部件版本檢查父字段值。

OTOH,給定的「合併」和「小部件」應該共享相同的矩形PdfArray,使點無效。 「Rect」是一個「葉子」值,永遠不會從父項繼承,所以小部件的數組將被「淺拷貝」到合併的字典中,從而共享它。無論如何,你應該能夠很容易地檢查它。

assert item.getWidget(0).getAsArray(PdfName.RECT) == 
     item.getMerged(0).getAsArray(PdfName.RECT); 

注意,這不是==.equals。我不認爲PdfArray equals(),所以這一點也不是全部相關。

哦,只是因爲我其實是有工作要做,我會讓你知道如何從一個領域你自己得到BASEFONT,在正確的方向輕推。你會希望有一個DocumentFont通過BaseFont.createFont(PRIndirectReference fontRef),你應該看看The PDF Spec,章12.7(交互式表單)和9.5-9.10(各種字體的類型......這DocumentFont將在很大程度上照顧你)來找出在哪裏可以找到間接參考。

而且要弄清楚究竟發生了什麼的間接引用是,你需要閱讀章節7.3,「對象」,尤其是7.3.10,「間接對象」。