4

我正在使用 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);
4

1 回答 1

3

根据 PDF 规范,Section 12.7.5.2 - Submit-Form Action, table 237,您正在设置第二个标志位,IncludeNoValueFields该位适用于文本字段,但您没有看到复选框。不幸的是,如果您查看12.7.3.1 - 字段字典常规,表 221,您会看到 PDF 中的每个字段都可以在其各自的字段标志中设置其第三位,这是不包括的NoExport位。IncludeNoValueFields因此,不幸的是,像这样通过 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;
于 2012-05-20T15:41:25.097 回答