在TextField IText中使用文本

aro*_*982 4 itext

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

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

form.setField("field","value"); (等等.)

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

在此先感谢您的帮助.

Mar*_*rer 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 ) );
}
Run Code Online (Sandbox Code Playgroud)

FUDGE_FACTOR需要考虑右边界和左边界的厚度.我猜3-5分,取决于斜面与平面边框,线条粗细等等.您可以选择一个值并继续使用它.

循环可能是不必要的,因为多个字段共享名称的情况很少见.OTOH,如果这是你所反对的,你可能还需要重新计算,newWidth因为不同的实例不需要共享相同的字体大小.

最后,您可能需要将此新rectArr写入项目的"合并"版本以及窗口小部件版本.在操作字段时,iText几乎普遍适用于合并版本,因为所有可能的键/值对都在那里,您可能必须使用窗口小部件版本检查父字段值.

OTOH,给定的"合并"和"小部件"应该共享相同的矩形PdfArray,使得这一点没有实际意义."Rect"是一个"叶子"值,永远不会从父级继承,因此小部件的数组将被"浅层复制"到合并的字典中......从而共享它.无论如何,你应该能够相当容易地检查它.

assert item.getWidget(0).getAsArray(PdfName.RECT) ==
       item.getMerged(0).getAsArray(PdfName.RECT);
Run Code Online (Sandbox Code Playgroud)

请注意,事实==并非如此.equals.我不认为PdfArray 一个equals(),所以这点是不是所有的相关的要么.

哦,只是因为我真的有工作要做,我会让你弄清楚如何从一个字段中获得一个BaseFont,并在正确的方向上轻推.你需要一个DocumentFontvia BaseFont.createFont(PRIndirectReference fontRef),你应该查看PDF规范,第12.7章(交互式表格)和9.5-9.10(各种字体类型...... DocumentFont将主要为您服务),以找出在哪里找到间接参考.

要弄清楚间接引用是什么,你需要阅读第7.3章"对象",特别是7.3.10,"间接对象".