gpt4 book ai didi

itext - 在 TextField IText 中调整文本

转载 作者:行者123 更新时间:2023-12-05 00:07:36 29 4
gpt4 key购买 nike

抱歉,如果有类似我的帖子,但我是这个论坛的新手,我还没有找到它。

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

form.setField("字段", "值"); (ETC。)

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

提前感谢您的帮助。

最佳答案

好吧,很容易做与你想要的相反的事情,改变字体大小,使所有文本都可见。您只需将字体大小设置为“0”,iText(或 Acrobat 或其他)会确定要即时使用的字体大小(在一些合理的限制内)。

要确定给定文本 block 的长度,可以调用 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,并朝着正确的方向轻推。你会想要一个 DocumentFont通过 BaseFont.createFont(PRIndirectReference fontRef) ,您应该查看 The PDF Spec ,第 12.7 章(交互式表单)和第 9.5-9.10 章(各种字体类型...... DocumentFont 将主要为您处理)找出在哪里可以找到间接引用。

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

关于itext - 在 TextField IText 中调整文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2072468/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com