2010-01-15 51 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,“间接对象”。