在TextField IText中使用文本

时间:2010-01-15 15:03:30

标签: itext

很抱歉,如果有像我这样的帖子,但我在这个论坛上是新的,我还没找到。

我有动态调整大小的问题TextField大小取决于文本大小。我在AcroForm中填写现有的PDF填充字段:

form.setField(“field”,“value”); (等)

一切都没关系,但我也想设置大小大于字段大小的文本(在TextField中)。如何动态调整TextField的大小(在setField之后/之前或者在AcroForm创建过程中设置一些字段属性)以适合文本(大于TextField的文本)?此TextField的大小必须与文本大小完全相同,而不会将字体大小更改为较小的大小且此TextField中没有滚动。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分: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,“间接对象”。