iTextSharp,用于提交所有字段的代码

本文关键字:字段 代码 用于 提交 iTextSharp | 更新日期: 2023-09-27 18:34:34

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

    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);

iTextSharp,用于提交所有字段的代码

根据 PDF 规范第 12.7.5.2 节 - 提交表单操作,表 237,您正在设置第二个标志位,该标志位IncludeNoValueFields适用于文本字段,但正如您所看到的,它不适用于复选框。不幸的是,如果您查看 12.7.3.1 - 字段字典常规,表 221,您将看到 PDF 中的每个字段都可以在其各自的字段标志中设置其第 3 位,这是IncludeNoValueFields不包括的NoExport位。因此,不幸的是,像这样通过HTTP传递名称/值对您不起作用。

但是,您可以将提交操作设置为包含PdfAction.SUBMIT_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>

在服务器端,您可以使用Request.InputStream来获取 XML。

另一种选择是实际上只是通过网络提交 PDF 并使用服务器端的东西来解析它:

int flags = PdfAction.SUBMIT_PDF;