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

如何使用iText for填写这样的表单。净额

  •  0
  • Midhul  · 技术社区  · 8 年前

    尝试使用填充每个框上的名称和地址

     cb.SetTextMatrix(x, y);// x and y positions .
     cb.ShowText("data");
    

    enter image description here

    但未能做到这一点。

    the problem

    1 回复  |  直到 8 年前
        1
  •  1
  •   Bruno Lowagie    8 年前

    您使用的代码并非完全错误,但它有几个缺陷。首先,你不知道 x 和 y

    另外:您正在将PDF语法直接写入内容流。在代码段中,您忘记创建文本对象(使用 cb.BeginText() 和 cb.EndText() ). 如果您是PDF新手,则不应尝试将PDF语法直接写入内容流 除非你对ISO-32000-1有深入的了解 . 你读过ISO-32000-1吗?如果没有, 那你为什么要使用低级操作呢? 这没有多大意义,不是吗?有助手类,例如 ColumnText 在绝对位置添加内容。

    查看您共享的屏幕截图,我看到一些字段需要“Comb”功能。此功能确保每个小框恰好包含一个字形(如果您不知道字形是什么,请将其视为字符的视觉表示)。

    如果你想让自己变得简单,你应该先测试一下表单是否是交互式的。回答这个问题:

    表单是否包含AcroFields?

    如果答案是“是”,请使用 AcroFields 对象您可以按照问题答案中的说明找出要使用的字段名称: How do I enumerate all the fields in a PDF file in ITextSharp ?

    如果答案为“否”,请在Adobe Acrobat中打开该文件,然后手动添加字段。将字段定义为梳字段,使每个框包含每个轮廓。要获得好看的结果,请选择等距字体,如Courier(使用比例字体可能会产生更难看的结果)。此操作添加AcroForm字段。

    一旦你有了一个带有AcroFields的交互式表单(假设你已经正确定义了它们),填写表单就像在iText 5中一样简单:

    PdfReader reader = new PdfReader(template);
    PdfStamper stamper = new PdfStamper(reader,
        new FileStream(newFile, FileMode.Create));
    AcroFields form = stamper.AcroFields;         
    form.SetField(key1, value1);      
    form.SetField(key2, value2);      
    form.SetField(key3, value3);
    ...
    stamper.Close();
    

    看见 How to create and fill out a PDF form

    然而,由于您对这一切都是新手,我建议您使用iText 7,如中所述 jump-start tutorial :

    PdfDocument pdf = new PdfDocument(new PdfReader(src), new PdfWriter(dest));
    PdfAcroForm form = PdfAcroForm.GetAcroForm(pdf, true);
    IDictionary<String, PdfFormField> fields = form.GetFormFields();
    PdfFormField toSet;
    fields.TryGetValue(key1, out toSet);
    toSet.SetValue(value1);
    fields.TryGetValue(key2, out toSet);
    toSet.SetValue(value2);
    ...
    pdf.Close();
    

    如果要在填写表单后删除交互,则需要 田地。这也记录在官方网站上。