嗯,很容易做与您想要的相反的事情,更改字体大小,使所有文本都可见。您只需将字体大小设置为“0”,iText(或 Acrobat 或其他)即可动态确定要使用的字体大小(在某些合理的限制内)。
要确定给定文本块的长度,您可以调用myBaseFont.getWidthPoint( fieldValToBe, fontSize )
。然后你可以调整字段大小before你打电话setField
。默认情况下,iText 会为您渲染字段外观,并且会在您可以时完成渲染setField
。更改字段大小后不会改变字段的外观,除非您调用setField
again.
好的,那么如何更改字段的大小呢? 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);
请注意,这是==
not .equals
。我不认为 PdfArrayhas an equals()
,所以这一点也不是那么相关。
哦,因为我实际上有工作要做,所以我会让你弄清楚如何自己从字段中获取 BaseFont,并在正确的方向上轻推。你会想要一个DocumentFont
via BaseFont.createFont(PRIndirectReference fontRef)
,你应该检查一下PDF 规范 http://www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf,第 12.7 章(交互式表单)和 9.5-9.10(各种字体类型...DocumentFont 将在很大程度上为您处理)以找出在哪里可以找到该间接引用。
要弄清楚间接引用到底是什么,您需要阅读第 7.3 章“对象”,特别是 7.3.10“间接对象”。