【问题标题】:How can I add an PdfFormField using IText 7 at the current page position如何在当前页面位置使用 IText 7 添加 PdfFormField
【发布时间】:2016-06-22 13:11:29
【问题描述】:

我们已经能够使用以下 Scala 代码 sn-p 在页面上的特定位置添加 PdfFormField。

val form = PdfAcroForm.getAcroForm(document.getPdfDocument(), true)
val nameField = PdfFormField.createText(document.getPdfDocument(), new Rectangle(data.x, data.y, data.width, data.height), data.formName, data.formText)
form.addField(nameField)

但是,我们希望能够将它添加到我们插入的页面的最后一个段落之后。 (即该字段紧随其后)。有没有一种方法可以推导出正确的矩形,还是有更简单的方法? 谢谢

【问题讨论】:

    标签: itext7


    【解决方案1】:

    目前没有开箱即用的方式将字段添加到布局,但 iText 团队正在考虑实现此功能。

    同时,有一些简单的方法可以实现您的目标,其中有几种。

    我的示例将使用 Java,但我假设您可以轻松地在 Scala 中使用它们。

    第一种方法是获取您添加的段落的底部位置,并添加与该位置相关的字段。最后一段的底部位置恰好是页面(区域)上其余可用内容框的顶部位置,转换为以下代码:

    Document doc = new Document(pdfDoc);
    doc.add(new Paragraph("This is a paragraph.\nForm field will be inserted after it"));
    
    Rectangle freeBBox = doc.getRenderer().getCurrentArea().getBBox();
    float top = freeBBox.getTop();
    float fieldHeight = 20;
    PdfTextFormField field = PdfFormField.createText(pdfDoc,
                new Rectangle(freeBBox.getLeft(), top - fieldHeight, 100, fieldHeight), "myField", "Value");
    form.addField(field);
    

    你感兴趣的部分是

    Rectangle freeBBox = doc.getRenderer().getCurrentArea().getBBox();
    

    它会为您提供尚未放置内容的矩形。

    但是请注意,这种方法不会影响您想要添加表单域的后面的段落,这意味着该表单域和内容可能会重叠。

    请处理这种情况,您可能想利用在 iText7 中创建自定义布局元素的可能性。

    依次转换为以下代码:

    private static class TextFieldRenderer extends DivRenderer {
        public TextFieldRenderer(TextFieldLayoutElement modelElement) {
            super(modelElement);
        }
    
        @Override
        public void draw(DrawContext drawContext) {
            super.draw(drawContext);
            PdfAcroForm form = PdfAcroForm.getAcroForm(drawContext.getDocument(), true);
            PdfTextFormField field = PdfFormField.createText(drawContext.getDocument(),
                    occupiedArea.getBBox(), "myField2", "Another Value");
            form.addField(field);
        }
    }
    
    private static class TextFieldLayoutElement extends Div {
        @Override
        public IRenderer getRenderer() {
            return new TextFieldRenderer(this);
        }
    }
    

    然后你只需要以一种奇特的方式添加元素:

    doc.add(new Paragraph("This is another paragraph.\nForm field will be inserted right after it."));
    doc.add(new TextFieldLayoutElement().setWidth(100).setHeight(20));
    doc.add(new Paragraph("This paragraph follows the form field"));
    

    简而言之,我们在这里所做的是我们创建了一个自定义的虚拟 Div 元素(类似于 HTML 的 div),它将在布局期间占据区域,但是我们为这个元素定义了自定义 #draw() 运算符,所以当我们知道我们想要做的确切位置时,该表单域就会被插入。

    您可以找到示例here 的完整代码。但请注意,该链接可能会随着示例存储库的重组而改变。

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      • 2016-11-30
      • 2017-09-30
      • 1970-01-01
      相关资源
      最近更新 更多