很抱歉,如果有像我这样的帖子,但我在这个论坛上是新的,我还没有找到它。
我有动态调整大小的问题 TextField 大小取决于文本大小。我填写 AcroForm 中现有的 PDF 填充字段:
form.setField(“field”,“value”); (etc.)
一切都没关系,但我也想设置大小大于字段大小的文本(在 TextField 中)。如何动态调整 TextField(after/before setField 或在 AcroForm 创建过程中设置一些字段属性)以适应文本(大于 TextField 的文本)?此 TextField 的大小必须与文本大小完全相同,而不会将字体大小更改为较小的大小,并且此 TextField 中没有滚动条。
在此先感谢您的帮助。
1 回答
那么你很容易做到你想要的相反,改变字体大小,以便所有文本都可见。您只需将字体大小设置为“0”,iText(或 Acrobat 等)确定要在运行中使用的字体大小(在一些合理的限制范围内)。
要确定给定文本块的长度,可以调用
myBaseFont.getWidthPoint( fieldValToBe, fontSize )
。然后你可以在调用setField
之前调整字段**的大小。 iText 默认为您渲染场外观,并且当您可以setField
时渲染完成。除非再次调用setField
,否则更改字段后的字段大小不会更改字段的外观。好的,那么你如何改变场地的大小呢? iText 不直接支持,因此您必须使用 iText 的 low-level PDF 对象。像这样的东西:
FUDGE_FACTOR 需要考虑右边界和左边界的厚度。我猜 3-5 点,取决于斜面与平面边框,线条粗细等等。您可以选择一个值并继续使用它。
循环可能是不必要的,因为多个字段共享名称的情况很少见。 OTOH,如果这是你所反对的,你可能还需要重新计算
newWidth
,因为不同的实例不需要共享相同的字体大小。最后,您可能需要将此新 rectArr 写入项目的“合并”版本以及窗口小部件版本。在操作字段时,iText 几乎普遍适用于合并版本,因为所有可能的 key/value 对都在那里,您可能必须使用窗口小部件版本检查父字段值。
OTOH,给定的“合并”和“小部件”应该共享相同的矩形
PdfArray
,使得这一点没有实际意义。 “Rect”是一个“叶子”值,永远不会从父级继承,因此小部件的数组将在合并字典中“shallow-copied”...因此共享它。无论如何,你应该能够相当容易地检查它。请注意,这是
==
而不是.equals
。我不认为 PdfArray 有一个equals()
,所以这一点也不是那么相关。哦,只是因为我实际上有工作要做,我会让你弄清楚如何从一个领域自己获得一个 BaseFont,并在正确的方向上轻推。你需要一个
DocumentFont
来自BaseFont.createFont(PRIndirectReference fontRef)
,你应该看看PDF 规范,章 12.7(交互式表格)和 9.5-9.10(各种字体类型...... DocumentFont 将主要照顾你)找出在哪里找到间接参考。要弄清楚间接引用是什么,你需要阅读章节 7.3,“对象”,特别是 7.3.10,“间接对象”。