如何使用iText for .NET填写这样的表单

时间:2017-10-31 04:44:26

标签: c# itext

尝试使用

填写每个方框的姓名和地址
 cb.SetTextMatrix(x, y);// x and y positions .
 cb.ShowText("data");

enter image description here

但未能这样做。

the problem

1 个答案:

答案 0 :(得分:1)

您使用的代码并非完全不正确,但它有几个缺陷。对于初学者:您不知道xy参数的价值,如果您希望文本处于正确的位置,那将是至关重要的。

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

看着你分享的屏幕截图,我看到有些字段需要" Comb"功能。此功能可确保每个小方框只包含一个字形(如果您不知道字形是什么,请将其视为字符的直观表示)。

如果您想让自己变得轻松,您应该首先测试表单是否是交互式的。回答这个问题:

  

表单是否包含AcroFields?

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

如果答案是"否",请在Adobe Acrobat中打开文件,然后手动添加字段。将字段定义为Comb字段,以便每个框包含每个字形。要获得漂亮的结果,请选择等宽字体,例如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

但是,由于您是新手,我建议您按照jump-start tutorial中所述使用iText 7:

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();

如果要在填写表单后删除交互性,则需要展平字段。这也记录在官方网站上。