如何使用itext 7和itextsharp 5.5.9在不铺平PDF表格的情况下填写现有的PDF表格?

3

我正在尝试填写一个美国移民局表格,但在填写后它会将其变为只读(压平)。我不确定为什么会这样做。即使我没有任何压平代码。

我在stackoverflow上搜索并尝试了许多不同的方法(使用itextsharp 5.5.9和itext 7),但仍然无法解决问题。

以下是我正在使用的示例代码:

string src = @"https://www.uscis.gov/sites/default/files/files/form/i-90.pdf";
    string dest = @"C:\temp\i-90Filled.pdf";

    var reader = new PdfReader(src);
    reader.SetUnethicalReading(true);
    var writer = new PdfWriter(dest);

    PdfDocument pdfDoc = new PdfDocument(reader, writer);


    // add content
    PdfAcroForm form = PdfAcroForm.GetAcroForm(pdfDoc, true);

    IDictionary<String, PdfFormField> fields = form.GetFormFields();

    PdfFormField toSet;

    fields.TryGetValue("form1[0].#subform[0].P1_Line3b_GivenName[0]", out toSet);
    toSet.SetValue("John");

    pdfDoc.Close();

表单是混合表单,意味着您在同一PDF中有两个相同的表单。您尝试过删除XFA部分吗?请阅读“是否安全删除XFA?”和“如何更改AcroForm字段的文本颜色?” - Bruno Lowagie
此外:你到底在哪里找到你正在使用的代码。那段代码非常错误。你没有阅读任何文档吗? - Bruno Lowagie
1个回答

4
使用iTextSharp 5填写表单的方法如下:
string src = @"https://www.uscis.gov/sites/default/files/files/form/i-90.pdf";
string dest = @"C:\temp\i-90Filled.pdf";

PdfReader pdfReader = new PdfReader(src);
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(
        dest, FileMode.Create));
AcroFields form = pdfStamper.AcroFields;         
form.SetField("form1[0].#subform[0].P1_Line3b_GivenName[0]", "John");

请注意,您试图填写的表格是混合型表单。它包含了表单的描述两次:一次作为AcroForm,一次作为XFA表单。您可能希望通过添加以下行来删除XFA表单:

form.RemoveXfa();

更多信息,请阅读文档:

您的代码正在使用iText 7 for C#。如果您希望该代码正常工作,那么您必须删除XFA部分,因为iText 7不支持XFA。iText 7是以PDF 2.0为目标开发的(该规范将在2017年发布)。XFA将在PDF 2.0中被弃用。有效的PDF 2.0文件将不允许包含XFA流。


谢谢您的回复。这非常有帮助。但我还有几个后续问题。 如果我删除XFA表单,PDF将变为平面化。我希望它仍然可以编辑。 此外,我尝试填写XFA表单stamper.AcroFields.Xfa.FillXfaForm(xml);看起来只有75个字段中的55个可用于Xfa表单数据集。 是否有任何方法可以填充整个表单并使其可编辑?因为每页都有一个基于数据生成的条形码。 - Pavan Padavala
我们需要这个表格不要被压平,因为底部有一个条形码,它是根据表格数据生成的。 我尝试使用缺失字段更新XFA表单。但是填充仍然无法工作。 XmlDocument xd = new XmlDocument(); xd.Load(xmlTemplateFile);XfaForm xform = new XfaForm(stamper.Reader); xform.DomDocument = xd; xform.Changed = true;XfaForm.SetXfa(xform, stamper.Reader, stamper.Writer);再次感谢您的帮助。 - Pavan Padavala
XFA很棘手。这就是为什么它被从PDF规范中删除的主要原因。我担心您需要Adobe的专业帮助。 - Bruno Lowagie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接