Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用iText for.NET填写这样的表单_C#_Itext - Fatal编程技术网

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

C# 如何使用iText for.NET填写这样的表单,c#,itext,C#,Itext,尝试使用填写每个框上的名称和地址 cb.SetTextMatrix(x, y);// x and y positions . cb.ShowText("data"); 但没有做到这一点 您使用的代码并非完全错误,但它有几个缺陷。首先:您不知道x和y参数的值,如果您希望文本处于正确的位置,这一点非常重要 另外:您正在将PDF语法直接写入内容流。在代码段中,您忘记使用cb.BeginText和cb.EndText创建文本对象。如果您是PDF新手,除非您对ISO-32000-1有深入的了解,否则

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

 cb.SetTextMatrix(x, y);// x and y positions .
 cb.ShowText("data");
但没有做到这一点


您使用的代码并非完全错误,但它有几个缺陷。首先:您不知道x和y参数的值,如果您希望文本处于正确的位置,这一点非常重要

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

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

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

表单是否包含字段

如果答案是“是”,请使用AcroFields对象填写表单。您可以按照此问题答案中的说明找到要使用的字段名:

如果回答为“否”,请在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();

但是,由于您对所有这些都是新手,我建议您使用iText 7,如下所述:


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

Bruno已经给出了一个很好的答案,因此这里只提供了一些关于您的问题的提示:您说您的代码无法填充字段。但它怎么会失败呢?您的代码使用了一些cb变量。里面有什么?你用过其他的方法吗?然后显示表单的屏幕截图,但不要将其作为pdf共享。因此,我们不能认真检查它,也不能试图重现这个问题。因此,如果您想要更直接地引用您的代码和问题的答案,您需要提供更多信息。这是我的问题=>如果名称字段有16个小列,我需要创建16个AcroFields对象来填充名称吗?我尝试为整个名称创建一个Acrofield对象,但在相同的列中为例如填充了两个字符:当我尝试填充名称ELIZABETH时,EL位于同一列中。请检查问题图像。谢谢@Bruno在回答中解释:将字段定义为梳字段,以便每个框仅包含一个glyph。这是我的问题=>如果名称字段有16个小列,我是否需要创建16个AcroFields对象来填充名称?我尝试为整个名称创建一个Acrofield对象,但在相同的列中为例如填充了两个字符:当我尝试填充名称ELIZABETH时,EL在同一列中。请检查问题图像。谢谢you@Midhul正如Bruno在回答中所解释的:将字段定义为梳字段,使每个框只包含一个glyph..请阅读该示例中的常见问题解答问题,在您的示例中,有一个值为12的属性/MaxLen,它应该是16,因为您有16个块。comb标志设置为true,这意味着每个字符将占用案例1/16中可用空间的1/12。字符将均匀分布,因此它们应该与方框匹配。谢谢您,先生,您节省了我的时间。请选择等距字体,如Courier,这是解决方案
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();