Java 添加与iText具有相同字段名的n-TEXT字段

Java 添加与iText具有相同字段名的n-TEXT字段,java,itext,textfield,Java,Itext,Textfield,我想使用iText将共享相同字段名的文本字段添加到文档中。其目的是能够设置一个值,该值应显示在所有页面上(自动填充) 我的问题是,使用以下代码,Adobe Reader中只会出现第一个文本字段。经过研究,我似乎不得不使用“一个字典条目”和多个可视化表示“小部件”,但我不知道如何用iText实现这一点 有什么建议吗? 谢谢 齐格弗里德 import java.io.File; import java.io.FileOutputStream; import java.io.IOException;

我想使用iText将共享相同字段名的文本字段添加到文档中。其目的是能够设置一个值,该值应显示在所有页面上(自动填充)

我的问题是,使用以下代码,Adobe Reader中只会出现第一个文本字段。经过研究,我似乎不得不使用“一个字典条目”和多个可视化表示“小部件”,但我不知道如何用iText实现这一点

有什么建议吗? 谢谢 齐格弗里德

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.TextField;

public class ITextAddTextfieldDemo {
    private static final String ORIGINAL = "original.pdf";
    private static final String RESULT = "original_textfield.pdf";

    public static void main(String[] args) throws IOException,
            DocumentException {
        ITextAddTextfieldDemo.createPdf(ORIGINAL, 5);
        ITextAddTextfieldDemo.stamp(ORIGINAL, RESULT);

        System.out.println("done");
    }

    public static void stamp(String src, String dest) throws IOException,
            DocumentException {
        PdfReader reader = new PdfReader(new File(src).getAbsolutePath());
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));

        int pages = reader.getNumberOfPages();

        // test problem by switching true/false
        boolean uniqueName = false;
        String fieldName = "demoField";

        if (uniqueName) {
            TextField textField = new TextField(stamper.getWriter(),
                    new Rectangle(560, 600, 590, 800), fieldName);
            textField.setText(""); // add text to see misrendered output
            textField.setOptions(TextField.MULTILINE | TextField.DO_NOT_SCROLL);
            textField.setRotation(90);

            for (int page = 1; page <= pages; page++) {
                stamper.addAnnotation(textField.getTextField(), page);
            }
        } else {
            TextField[] textFields = new TextField[pages];
            for (int page = 1; page <= pages; page++) {
                int idx = page - 1;
                fieldName += "_" + String.valueOf(page);

                textFields[idx] = new TextField(stamper.getWriter(),
                        new Rectangle(560, 600, 590, 800), fieldName);
                textFields[idx].setText(""); // add text to see misrendered output
                textFields[idx].setOptions(TextField.MULTILINE
                        | TextField.DO_NOT_SCROLL);
                textFields[idx].setRotation(90);

                stamper.addAnnotation(textFields[idx].getTextField(), page);
            }
        }

        stamper.close();
        reader.close();
    }

    public static void createPdf(String filename, int pages)
            throws IOException, DocumentException {
        Document document = new Document(PageSize.A4);
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        document.open();

        for (int i = 0; i < pages; i++) {
            Paragraph p = new Paragraph("Hello page " + String.valueOf(i + 1));
            document.add(p);
            document.newPage();
        }

        document.close();
    }

}
导入java.io.File;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入com.itextpdf.text.Document;
导入com.itextpdf.text.DocumentException;
导入com.itextpdf.text.PageSize;
导入com.itextpdf.text.paragration;
导入com.itextpdf.text.Rectangle;
导入com.itextpdf.text.pdf.PdfReader;
导入com.itextpdf.text.pdf.PdfStamper;
导入com.itextpdf.text.pdf.PdfWriter;
导入com.itextpdf.text.pdf.TextField;
公共类ITextAddTextfieldDemo{
私有静态最终字符串ORIGINAL=“ORIGINAL.pdf”;
私有静态最终字符串RESULT=“original_textfield.pdf”;
公共静态void main(字符串[]args)引发IOException,
文档例外{
ITextAddTextfieldDemo.createPdf(原件,5);
ITextAddTextfieldDemo.stamp(原件、结果);
系统输出打印项次(“完成”);
}
公共静态空戳(字符串src、字符串dest)引发IOException,
文档例外{
PdfReader=newpdfReader(新文件(src).getAbsolutePath());
PdfStamper stamper=新PdfStamper(读取器,新文件输出流(dest));
int pages=reader.getNumberOfPages();
//通过切换真/假来测试问题
布尔唯一名称=假;
字符串fieldName=“demoField”;
if(唯一名称){
TextField TextField=新的TextField(stamper.getWriter(),
新矩形(560600590800),字段名;
textField.setText(“”;//添加文本以查看错误呈现的输出
textField.setOptions(textField.MULTILINE | textField.DO_NOT_SCROLL);
textField.setRotation(90);

对于(int page=1;page您不必将父项添加到每个页面。您可以使用PDFanMotion.setPlaceInPage(pagenumber)为每个小部件设置页面并添加父项一次。我已调整了您添加到问题中的解决方案:

    if (uniqueName) {
        PdfFormField parent = PdfFormField.createTextField(
                stamper.getWriter(), true, false, 0);
        parent.setFieldName(fieldName);
        parent.setUserName("Please enter the common demo data.");

        for (int page = 1; page <= pages; page++) {
            TextField textField = new TextField(stamper.getWriter(),
                    new Rectangle(560, 600, 590, 800), null);
            textField.setOptions(TextField.MULTILINE
                    | TextField.DO_NOT_SCROLL);
            textField.setRotation(90);
            PdfFormField pff = textField.getTextField();
            parent.addKid(pff);
            // add widget to each page
            pff.setPlaceInPage(page);
        }
        // add parent
        stamper.addAnnotation(parent, 1);
    } else {
if(uniqueName){
Pdformfield父项=Pdformfield.createTextField(
stamper.getWriter(),true,false,0);
parent.setFieldName(fieldName);
setUserName(“请输入常用演示数据”);

对于(int page=1;page)是否可以避免在PdfStamperImp.addFieldResources()中添加字体/Helv和/ZaDb?通过这种方式,我们只能向每个页面添加一个文本字段,但如何在单个或多个页面中以不同坐标添加多个文本字段。
    if (uniqueName) {
        PdfFormField parent = PdfFormField.createTextField(
                stamper.getWriter(), true, false, 0);
        parent.setFieldName(fieldName);
        parent.setUserName("Please enter the common demo data.");

        for (int page = 1; page <= pages; page++) {
            TextField textField = new TextField(stamper.getWriter(),
                    new Rectangle(560, 600, 590, 800), null);
            textField.setOptions(TextField.MULTILINE
                    | TextField.DO_NOT_SCROLL);
            textField.setRotation(90);
            PdfFormField pff = textField.getTextField();
            parent.addKid(pff);
            // add widget to each page
            pff.setPlaceInPage(page);
        }
        // add parent
        stamper.addAnnotation(parent, 1);
    } else {