如何使用itext 7和itextsharp 5.5.9填充现有的pdf表单而不展平它?

时间:2016-09-22 20:25:40

标签: forms pdf itext fill itext7

我正在尝试填写USCIS表格并在填写之后将其作为只读(展平)。我不确定为什么这样做。即使我没有任何代码来压扁它。 我搜索了堆栈溢出并尝试了许多不同的东西(使用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();

1 个答案:

答案 0 :(得分:2)

使用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进行C#。如果您希望该代码有效,那么您肯定需要删除XFA部分,因为iText 7不支持XFA。 iText 7的开发考虑了PDF 2.0(该规范将于2017年发布)。 XFA将在PDF 2.0中弃用。不允许使用有效的PDF 2.0文件包含XFA流。