C# iTextSharp,用于提交post上所有字段的代码

C# iTextSharp,用于提交post上所有字段的代码,c#,asp.net,pdf,itextsharp,itext,C#,Asp.net,Pdf,Itextsharp,Itext,我正在使用iTextSharp,遇到了一个无法解决的问题。我正在加载一个包含混合文本字段和复选框的现有PDF表单。我动态地在表单中添加了一个提交按钮,然后将表单发送到浏览器,在浏览器中填写表单,然后重新提交到服务器。我的问题是,我无法让PDF提交回所有填充和空字段。我已经确定了应该返回所有字段的代码,但是我不能返回空复选框。我认为这是不可能的。任何使用Acrobat Pro创建的PDF Acroform进行此操作的人-而不是LiveCycle。有关创建按钮的代码段,请参见下文。我是在C#asp.

我正在使用iTextSharp,遇到了一个无法解决的问题。我正在加载一个包含混合文本字段和复选框的现有PDF表单。我动态地在表单中添加了一个提交按钮,然后将表单发送到浏览器,在浏览器中填写表单,然后重新提交到服务器。我的问题是,我无法让PDF提交回所有填充和空字段。我已经确定了应该返回所有字段的代码,但是我不能返回空复选框。我认为这是不可能的。任何使用Acrobat Pro创建的PDF Acroform进行此操作的人-而不是LiveCycle。有关创建按钮的代码段,请参见下文。我是在C#asp.NET4中使用iTextSharp完成这项工作的

    ButtonRect = MakeButtonRect(PDFFormOut, ButtonPos);
    button = new PushbuttonField(PDFFormOut.Writer, ButtonRect, "postSubmit");
    button.BackgroundColor = BaseColor.LIGHT_GRAY;
    button.BorderColor = GrayColor.BLACK;
    button.BorderWidth = 1f;
    button.BorderStyle = PdfBorderDictionary.STYLE_BEVELED;
    button.TextColor = GrayColor.GREEN;
    button.FontSize = 8f;
    button.Text = "Submit";
    button.Visibility = PushbuttonField.VISIBLE_BUT_DOES_NOT_PRINT;
    field = button.Field;
    field.Put(PdfName.TU, new PdfString("Save changes and return to the folder."));
    **field.Action = PdfAction.CreateSubmitForm(@"http://" + Application["WebSiteRoot"].ToString() + @"/SaveForm.aspx?OP=SAV", null, PdfAction.SUBMIT_HTML_FORMAT | PdfAction.SUBMIT_INCLUDE_NO_VALUE_FIELDS);**
    PDFFormOut.AddAnnotation(field, 1);
根据PDF规范第12.7.5.2节-提交表单操作,表237,您正在设置第二个标志位,即
IncludeNoValueFields
,该标志位适用于文本字段,但您没有看到复选框。不幸的是,如果您查看12.7.3.1-字段字典常规,表221,您将看到PDF中的每个字段都可以在各自的字段标志中设置其第3位,即
NoExport
位,而
IncludeNoValueFields
不包括该位。因此,像这样通过HTTP传递名称/值很不幸对您不起作用

但是,您可以将提交操作设置为include
pdpartion.submit\u XFDF
,这将为您提供包含每个字段的XML文件,包括未标记为导出的字段

int flags = PdfAction.SUBMIT_XFDF | PdfAction.SUBMIT_INCLUDE_NO_VALUE_FIELDS;
field.Action = PdfAction.CreateSubmitForm(@"http://localhost/", null, flags);
下面是带有两个复选框、一个单选按钮组和一个文本字段的表单的结果

<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
 <fields>
  <field name="Check Box3"><value>Off</value></field>
  <field name="Check Box4"><value>Off</value></field>
  <field name="Text7"><value/></field>
  <field name="YesOrNo"><value>Yes</value></field>
  <field name="postSubmit"/>
 </fields>
 <ids original="B8B00E1D7C7ADB119BD056BC3BD5CA9F" modified="05CBB9BE1720DA2B6FC45E071B74F7E3"/>
 </xfdf>

谢谢你的洞察力。我发现有趣的是,复选框在被选中时会导出。因此,如果设置了第三位选项,我希望它们即使带有值也不会导出。我目前的工作涉及加载PDF并从AcroForm中提取所有字段,然后将该字段列表与通过POST发送的内容进行比较。未在发送时发送的字段被视为“空”,然后进行相应的处理。这样做的好处是,只有发送带有值的字段才能最小化帖子大小。
int flags = PdfAction.SUBMIT_PDF;