首页 文章

在 TextField IText 中使用文本

提问于
浏览
4

很抱歉,如果有像我这样的帖子,但我在这个论坛上是新的,我还没有找到它。

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

form.setField(“field”,“value”); (etc.)

一切都没关系,但我也想设置大小大于字段大小的文本(在 TextField 中)。如何动态调整 TextField(after/before setField 或在 AcroForm 创建过程中设置一些字段属性)以适应文本(大于 TextField 的文本)?此 TextField 的大小必须与文本大小完全相同,而不会将字体大小更改为较小的大小,并且此 TextField 中没有滚动条。

在此先感谢您的帮助。

1 回答

  • 7

    那么你很容易做到你想要的相反,改变字体大小,以便所有文本都可见。您只需将字体大小设置为“0”,iText(或 Acrobat 等)确定要在运行中使用的字体大小(在一些合理的限制范围内)。


    要确定给定文本块的长度,可以调用myBaseFont.getWidthPoint( fieldValToBe, fontSize )。然后你可以在调用setField之前调整字段**的大小。 iText 默认为您渲染场外观,并且当您可以setField时渲染完成。除非再次调用setField,否则更改字段后的字段大小不会更改字段的外观。

    好的,那么你如何改变场地的大小呢? iText 不直接支持,因此您必须使用 iText 的 low-level 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 几乎普遍适用于合并版本,因为所有可能的 key/value 对都在那里,您可能必须使用窗口小部件版本检查父字段值。

    OTOH,给定的“合并”和“小部件”应该共享相同的矩形PdfArray,使得这一点没有实际意义。 “Rect”是一个“叶子”值,永远不会从父级继承,因此小部件的数组将在合并字典中“shallow-copied”...因此共享它。无论如何,你应该能够相当容易地检查它。

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

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

    哦,只是因为我实际上有工作要做,我会让你弄清楚如何从一个领域自己获得一个 BaseFont,并在正确的方向上轻推。你需要一个DocumentFont来自BaseFont.createFont(PRIndirectReference fontRef),你应该看看PDF 规范,章 12.7(交互式表格)和 9.5-9.10(各种字体类型...... DocumentFont 将主要照顾你)找出在哪里找到间接参考。

    要弄清楚间接引用是什么,你需要阅读章节 7.3,“对象”,特别是 7.3.10,“间接对象”。

相关问题