尝试使用
填写每个方框的姓名和地址 cb.SetTextMatrix(x, y);// x and y positions .
cb.ShowText("data");
但未能这样做。
答案 0 :(得分:1)
您使用的代码并非完全不正确,但它有几个缺陷。对于初学者:您不知道x
和y
参数的价值,如果您希望文本处于正确的位置,那将是至关重要的。
另外:您正在将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();
如果要在填写表单后删除交互性,则需要展平字段。这也记录在官方网站上。