如何在pdf-java中设置字段名称

时间:2016-09-23 01:01:14

标签: java itext

我想在pdf中设置字段名称(不在现有的pdf中),这样我就可以在需要时获取该字段的坐标。 我们可以在没有pdfstamper的情况下实现这个目标吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

您说您想要从头开始创建PDF(而不是现有的PDF),并且您希望此PDF有一个字段。

从头开始创建PDF并不涉及PdfStamper,所以问题的答案是"我们可以在没有PdfStamper"是的,是的,你可以。"

如果您正在考虑使用iText 5,,请查看以下示例:

其中一个例子是在回答问题Add PdfPCell to Paragraph

时写的

在此示例中,我们创建了一个Paragraph,其中一些Chunk个对象是字段:

enter image description here

您可以使用getFieldPositions()方法获取这些字段的坐标。常见问题解答中解释了这一点:How to find the absolute position and dimension of a field?

如果您正在考虑使用iText 7.0.1,,您会发现这些类更容易理解,因为无论您是从头创建表单还是填写表单,都会使用相同的类现有表单,请参阅chapter 4iText 7 jump-start tutorial

public class GenericFields extends GenericTest {
    public static final String DEST = "./target/test/resources/sandbox/events/generic_fields.pdf";

    public static void main(String[] args) throws Exception {
        File file = new File(DEST);
        file.getParentFile().mkdirs();
        new GenericFields().manipulatePdf(DEST);
    }

    @Override
    protected void manipulatePdf(String dest) throws Exception {
        PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
        Document doc = new Document(pdfDoc);
        Paragraph p = new Paragraph();
        p.add("The Effective Date is ");
        Text day = new Text("     ");
        day.setNextRenderer(new FieldTextRenderer(day, "day"));
        p.add(day);
        p.add(" day of ");
        Text month = new Text("     ");
        month.setNextRenderer(new FieldTextRenderer(month, "month"));
        p.add(month);
        p.add(", ");
        Text year = new Text("            ");
        year.setNextRenderer(new FieldTextRenderer(year, "year"));
        p.add(year);
        p.add(" that this will begin.");
        doc.add(p);
        doc.close();
    }


    protected class FieldTextRenderer extends TextRenderer {
        protected String fieldName;

        public FieldTextRenderer(Text textElement, String fieldName) {
            super(textElement);
            this.fieldName = fieldName;
        }

        @Override
        public void draw(DrawContext drawContext) {
            PdfTextFormField field = PdfTextFormField.createText(drawContext.getDocument(), getOccupiedAreaBBox(), fieldName);
            PdfAcroForm.getAcroForm(drawContext.getDocument(), true).addField(field);
        }
    }
}