你可以很容易地做与你想要的相反的事情,改变字体大小,让所有的文本都可见。您只需将字体大小设置为“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 节“间接对象”。