代码之家  ›  专栏  ›  技术社区  ›  manash

itext 7:设置文本字段一次,即使它以相同的名称存在多次

  •  0
  • manash  · 技术社区  · 6 年前

    我有一个具有多个同名文本字段的PDF文档。

    我想设置一次这个值( field.setValue("text") )以及字段每次出现的值。字段可能在同一页或不同的页中(显然,同一文档)。

    如果只有一个这样的字段,则可以生成PDF。如果有多个字段,则所有字段都显示为空。如果禁用展平,则可以在每个字段中看到文本(尽管只有在单击字段后才能看到文本-奇怪…)。

    这里是 test PDF .


    编辑 :

    这个问题似乎只有在我设置字段的字体时才会发生。你可以用 this font 以及以下代码:

    PdfFont font = PdfFontFactory.createFont("src/main/resources/fonts/Arimo-Regular.ttf", PdfEncodings.IDENTITY_H);
    PdfFormField textField = acroForm.getField("test");
    textField.setValue("שלום", font, 11.0f);
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   mkl    6 年前

    更新后的问题

    使用OP提供的字体和 setValue 使用额外的字体和字体大小参数过载,我可以重现这个问题。

    实际问题

    问题与您使用的特定字体或文本无关,它与 设定值 使用过载:

    • PdfFormField.setValue(String) (除非字段是按钮字段)遍历当前字段的后代的整个层次结构,并调用另一个 设定值 重载每个子代,最终也是当前字段。
    • 另一方面 PdfFormField.setValue(String, boolean) PdfFormField.setValue(String, PdfFont, float) 假设当前字段实际上是要添加外观的单个小部件。

    因此,任何具有多个窗口小部件的窗体字段(甚至是具有单个窗口小部件的字段,该窗口小部件仅与字段合并),如果只是 设定值 后一类的超负荷被调用。

    周围的工作

    考虑到上面所说的,一个解决方法就是以某种方式处理单个参数。 设定值 超载。可以通过将字体和字体大小显式设置为表单字段来完成此操作,只需替换

    textField.setValue("שלום", font, 11.0f);
    

    通过

    textField.setFont(font);
    textField.setFontSize(11f);
    textField.setValue("שלום");
    

    ( SetTextField 测试 testSetFontAndTextToFieldWithManyVisualizationsWorkAround )

    现在,字段确实被填充,其内容出现在扁平结果中。

    不幸的是,这里又出现了另一个问题:字母出现的顺序错误。这里似乎不支持仅使用基本IText组件的RTL语言。可能使用 pdfCalligraph 附加模块增加了对希伯来语等的支持,但我不知道。

    原始问题的原始答案

    我不能用您的示例文档复制这个问题。

    我这样改变字段值

    PdfReader reader = new PdfReader(resource);
    PdfDocument pdfDocument = new PdfDocument(reader, new PdfWriter(outputStream));
    PdfAcroForm acroForm = PdfAcroForm.getAcroForm(pdfDocument, false);
    
    PdfFormField testField = acroForm.getField("test");
    testField.setValue("My test text...");
    
    acroForm.flattenFields();
    
    pdfDocument.close();
    

    ( SetTextField 测试 testSetTextToFieldWithManyVisualizations )

    但结果是预期的:

    page 1 page 2

    字段的所有三个实例都已填写。这既适用于展平,也适用于不适用于展平,它适用于7.1.4和当前的7.1.5快照。

    不过,有一个问题是,在查看PDF所看到的结果的内部结构时,

    enter image description here

    价值 V 在抽象字段和每个小部件中都设置。它应该只在野外。