填写从其他字段

时间:2017-04-25 12:19:00

标签: c# pdf itext

我知道这里有很多类似的问题,我已经尝试了其中几个,但没有设法解决问题(其中许多问题在几年后仍未得到答复)。

我的问题是我无法设置名为“form1 [0] .sida2 [0] .flt_datSidhuvud [0]”和“form1 [0] .sida2 [第二页]顶部的两个字段的值。 0] .flt_txtPersonNrBrukare [0]“,他们都在第一页上有一个名字相同但前缀不同的字段,从我做过的研究中可能会导致问题,但建议的解决方案对我没用。

如果我使用例如Acrobat Reader手动填写表格,则第一页上的字段中输入的值会自动显示在第二页的字段中,反之亦然。

以下是我用来尝试填写两个字段

的代码示例
MemoryStream output = new MemoryStream();
FileStream fs = File.Open(pdfTemplatePath, FileMode.Open, FileAccess.Read);
PdfReader reader = new PdfReader(fs);
fs.Close();
PdfStamper stamper = new PdfStamper(reader, output);
var formFields = stamper.AcroFields;

formFields.SetField("form1[0].sida2[0].flt_datSidhuvud[0]", "2016-12"));
formFields.SetField("form1[0].sida2[0].flt_txtPersonNrBrukare[0]", data.SocialSecurityNumber);//data.SocialSecurityNumber is a string

stamper.FormFlattening = true;
stamper.Close();
reader.Close();

结果是它只填充第一页上的字段值。

Link to PDF

从我的研究this question来看SO是最有希望的,但建议的解决方案(删除XFA)在我的案例中似乎不起作用。

1 个答案:

答案 0 :(得分:1)

一般

如果(AcroForm)表单字段具有不同的全名,则它们是单独的字段。

您所描述的行为(在失去焦点时填充Adobe Reader中的一个字段也会自动填充另一个字段)可以使用JavaScript操作来实现。但是使用iText填写这些字段不会触发任何JavaScript事件。因此,通常您必须填写两个(AcroForm)字段。

你的案子很特别

但是你的情况略有不同:

  • 您的PDF包含混合形式,以AcroForm形式和XFA形式呈现,有时在5.x版本中的iText配备了一定数量的XFA支持。特别是在混合形式的情况下,
    • 每当检索到一个字段的值时,首先在XFA表单数据元素中查找它;和
    • 无论何时设置字段值,都会在单个匹配的AcroForm字段和XFA表单数据元素中设置它。
  • 在表单的AcroForm表示形式中,第2页上的flt_datSidhuvudflt_txtPersonNrBrukare字段(您没有明确填写)是空的,甚至没有外观流。< / LI>
  • 在表单的XFA表示形式中,flt_datSidhuvud表单字段均由单个数据元素支持,flt_txtPersonNrBrukare表单字段也是如此。

此外,您的案例很特殊,因为您展平表单。如果您没有展平id,则只会设置第一页上的AcroForm字段和XFA数据字段的字段中的值,而不是第二页上的AcroForm字段。

在5.x版本中,表格展平也得到了显着改善。

为什么会起作用

在展平混合表单时,第二页上的字段会显示其值:

虽然在第二页展平了空的flt_datSidhuvudflt_txtPersonNrBrukare AcroForm字段,但iText确定它们没有任何外观流尚未展平到页面内容中,因此会尝试创建外观为他们流。

要创建这些外观,iText首先检索每个字段的值。如上所述,这意味着首先查找XFA表单中的值,这对于第一页和第二页上的两个字段都是相同的。因此,这里检索您为第一页上的字段设置的值,并用于在第二页上构建外观!

为什么最初没有为你工作

在评论中你说过你大多使用旧的4.1.6.0 iTextSharp版本,而不是当前的5.5.11.0版本。如上所述,第二页上的自动填写取决于iText XFA支持和表单展平改进,这两种改进都是在5.x版本中引入的。

因此,您从问题中运行代码的初始尝试并未导致第2页上的填充字段,因为较旧的iTextSharp版本根本没有实现对此的支持。