【问题标题】:Fit text in TextField IText在 TextField IText 中调整文本
【发布时间】:2010-11-03 02:49:24
【问题描述】:

对不起,如果有类似的帖子像我一样,但我是这个论坛的新手,我还没有找到它。

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

form.setField("字段", "值"); (等等)

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

提前感谢您的帮助。

【问题讨论】:

  • 我怀疑还有其他类似的问题。在使用 PDF 超过 13 年之后,从未听说过有人需要这样的东西。

标签: itext


【解决方案1】:

你可以很容易地做与你想要的相反的事情,改变字体大小,让所有的文本都可见。您只需将字体大小设置为“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,从而使该点没有实际意义。 “矩形”是一个“叶”值,永远不会从父级继承,因此小部件的数组将被“浅拷贝”到合并字典中……从而共享它。无论如何,您应该能够相当容易地检查它。

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

请注意,这是 == 而不是 .equals。我不认为 PdfArray equals(),所以这一点也不是那么相关。

哦,因为我实际上有工作要做,所以我会让你弄清楚如何从你自己的字段中获取 BaseFont,并朝着正确的方向轻推。您将需要通过BaseFont.createFont(PRIndirectReference fontRef) 获得DocumentFont,并且您应该查看The PDF Spec,第12.7 章(交互式表单)和9.5-9.10(各种字体类型...... DocumentFont 将在很大程度上为您处理)找出在哪里可以找到间接引用。

要弄清楚间接引用到底是什么,您需要阅读第 7.3 章“对象”,尤其是第 7.3.10 节“间接对象”。

【讨论】:

  • 这对长度很有效,但对身高无效,有什么办法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 2012-06-22
相关资源
最近更新 更多