在文本字段IText中调整文本

在文本字段IText中调整文本,itext,Itext,很抱歉,如果有类似的帖子像我一样,但我在这个论坛上是新的,我没有找到它 我对动态调整文本大小有问题。文本字段大小取决于文本大小。我填写现有PDF-填写AcroForm中的字段: 形式。设置字段(“字段”、“值”);(等等) 一切正常,但我还想设置文本(在TextField中)的大小大于字段大小。如何动态调整TextField的大小(在setField之后/之前,或者在AcroForm创建过程中设置一些字段属性)以适应文本(文本大于TextField)?此文本字段的大小必须与文本大小完全相同,且不

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

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

形式。设置字段(“字段”、“值”);(等等)

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


提前感谢您的帮助。

很容易做与您想要的相反的事情,更改字体大小,使所有文本都可见。您只需将字体大小设置为“0”,iText(或Acrobat,或其他)就可以动态确定要使用的字体大小(在一些合理的限制范围内)


要确定给定文本块的长度,可以调用
myBaseFont.getWidthPoint(fieldValToBe,fontSize)
。然后,您可以在调用
setField
之前调整字段的大小。默认情况下,iText会为您渲染字段外观,并且在您可以
设置字段时会完成渲染。更改字段大小afterwords不会更改字段的外观,除非再次调用
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 ) );
}
请注意,这是
=
而不是
.equals
。我不认为PdfArray有一个
等于()
,所以这一点也没有那么重要

哦,仅仅因为我确实有工作要做,我就让你自己想一想如何从一个字段中获取BaseFont,只需朝正确的方向轻推。您需要通过
BaseFont.createFont(PRIndirectReference fontRef)
使用
DocumentFont
,您应该查看第12.7章(交互式表单)和第9.5-9.10章(各种字体类型…DocumentFont将主要为您提供哪些字体),以了解在哪里可以找到间接引用


为了弄清楚间接引用到底是什么,你需要阅读第7.3章“对象”,特别是第7.3.10章“间接对象”。我怀疑还有其他类似的问题。在使用PDF超过13年后,以前从未听说过有人需要这样的东西。这对长度很有效,但对高度不起作用,有办法吗?
assert item.getWidget(0).getAsArray(PdfName.RECT) ==
       item.getMerged(0).getAsArray(PdfName.RECT);