我知道这里有很多类似的问题,我已经尝试了其中几个,但没有设法解决问题(其中许多问题在几年后仍未得到答复)。
我的问题是我无法设置名为“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();
结果是它只填充第一页上的字段值。
从我的研究this question来看SO是最有希望的,但建议的解决方案(删除XFA)在我的案例中似乎不起作用。
答案 0 :(得分:1)
如果(AcroForm)表单字段具有不同的全名,则它们是单独的字段。
您所描述的行为(在失去焦点时填充Adobe Reader中的一个字段也会自动填充另一个字段)可以使用JavaScript操作来实现。但是使用iText填写这些字段不会触发任何JavaScript事件。因此,通常您必须填写两个(AcroForm)字段。
但是你的情况略有不同:
flt_datSidhuvud
和flt_txtPersonNrBrukare
字段(您没有明确填写)是空的,甚至没有外观流。< / LI>
flt_datSidhuvud
表单字段均由单个数据元素支持,flt_txtPersonNrBrukare
表单字段也是如此。此外,您的案例很特殊,因为您展平表单。如果您没有展平id,则只会设置第一页上的AcroForm字段和XFA数据字段的字段中的值,而不是第二页上的AcroForm字段。
在5.x版本中,表格展平也得到了显着改善。
在展平混合表单时,第二页上的字段会显示其值:
虽然在第二页展平了空的flt_datSidhuvud
和flt_txtPersonNrBrukare
AcroForm字段,但iText确定它们没有任何外观流尚未展平到页面内容中,因此会尝试创建外观为他们流。
要创建这些外观,iText首先检索每个字段的值。如上所述,这意味着首先查找XFA表单中的值,这对于第一页和第二页上的两个字段都是相同的。因此,这里检索您为第一页上的字段设置的值,并用于在第二页上构建外观!
在评论中你说过你大多使用旧的4.1.6.0 iTextSharp版本,而不是当前的5.5.11.0版本。如上所述,第二页上的自动填写取决于iText XFA支持和表单展平改进,这两种改进都是在5.x版本中引入的。
因此,您从问题中运行代码的初始尝试并未导致第2页上的填充字段,因为较旧的iTextSharp版本根本没有实现对此的支持。