Html 如何通过HTTP提交PDF表单数据?

Html 如何通过HTTP提交PDF表单数据?,html,forms,http,pdf,adobe-reader,Html,Forms,Http,Pdf,Adobe Reader,简单地说,我正在开发一个处理PDF表单的应用程序。提交数据格式为XFDF。到目前为止还不错,但我从客户那里得到了一些非常奇怪的行为 PDF查看器是IE中的Adobe Reader(目前为11.0.6)。这是一个内部应用程序,因此现在不需要支持任何其他内容。PDF是在服务器上动态创建的,因此我必须在浏览器中而不是在独立应用程序中执行此操作 工作流程如下: 将向用户发送一封电子邮件,其中包含指向应用程序内部URL的链接 用户单击链接。浏览器将打开并请求指定的URL 应用程序提供一个PDF文件(内容类

简单地说,我正在开发一个处理PDF表单的应用程序。提交数据格式为XFDF。到目前为止还不错,但我从客户那里得到了一些非常奇怪的行为

PDF查看器是IE中的Adobe Reader(目前为11.0.6)。这是一个内部应用程序,因此现在不需要支持任何其他内容。PDF是在服务器上动态创建的,因此我必须在浏览器中而不是在独立应用程序中执行此操作

工作流程如下:

  • 将向用户发送一封电子邮件,其中包含指向应用程序内部URL的链接
  • 用户单击链接。浏览器将打开并请求指定的URL
  • 应用程序提供一个PDF文件(内容类型application/PDF)
  • 用户在PDF中填写表单
  • 用户单击表单中的“提交”按钮
  • PDF查看器和浏览器以某种方式协作,将表单数据发布回服务器,并发送到 与表单本身的URL稍有不同(表单URL以斜杠结尾,而 提交操作的URL为“submit/”,因此附加了它)
  • 应用程序处理数据并返回303重定向到状态页面。(问题 如果改为发送302,则发生相同的情况。)
  • 浏览器将获取状态页(以及任何引用的资源)
  • 步骤8中实际发生的情况是:浏览器请求状态页面,但当它到达页面中引用的CSS样式表时,它会发送以下消息:

    GET /static/app.css HTTP/1.1
    Accept: text/css, */*
    Acrobat-Version: 11.0.6
    Accept-Language: en-GB
    Content-Type: application/vnd.adobe.xfdf; charset=utf-8
    Content-Length: 1824
    Referer: http://application/report/2014-03-28/925/
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
    Accept-Encoding: gzip, deflate
    Host: application
    DNT: 1
    Connection: Keep-Alive
    Cookie: sessionid=12345
    
    请注意,此请求同时包含内容类型和内容长度头,这对于GET请求来说已经够不寻常了,但是没有请求正文,没有一个字节,也没有1824个字节。我的服务器是IIS,它用一个400无效动词响应这个请求(不确定为什么会出现这个错误,但400本身肯定是合理的)

    对状态页本身的请求不包含这些标题;这是完全正确的。出于某种原因,样式表请求会重复两个请求之前表单提交中的标题


    不幸的是,通过HTTP发送PDF表单数据的文档并不多,但据我所知,我做的一切都是正确的。我假设这是Adobe Reader插件和/或IE中的一个bug;有人能想出解决这个问题的办法吗?

    在提交表单数据时,有几件事需要记住

    a) 提交命令是什么样子的

    根据AcrobatJavaScript文档,如果以FDF或XFDF形式提交,则要提交到的URL必须以#FDF结尾。这将确保传输(X)FDF。如果省略了该附加组件,Acrobat/Reader可以作为HTML帖子提交

    b) 只要您在网络浏览器下运行Acrobat/Reader,答案应该是正确的。否则,读卡器无法理解服务器返回的代码;相反,您应该返回PDF或FDF


    从Adobe网站获取FDFToolkit可能会有所帮助。即使您决定不使用它,文档中也有关于如何工作的合理解释。

    我最近遇到了这个问题。我正在通过嵌入式按钮提交一份PDF作为XFDF。我成功地保存了数据,然后返回了一个HTML响应。通过fiddler,我可以看到响应格式良好且成功(状态代码200)

    当浏览器呈现响应时,它会对引用的CSS/JS文件发出额外的请求(通常)。这些请求的contentType为“application/vnd.adobe.xfdf”和contentLength,这显然对所请求的内容没有意义

    我没能找到一个可靠的解决办法,但确实为我的目的找到了一个体面的解决办法。我怀疑这些请求仍然是在Acrobat Reader的上下文中发出的,因此我的想法是返回一个没有任何CSS/JS的初始响应,以满足Acrobat的要求,并将控制权完全返回给浏览器。我只返回以下内容,而不是返回重定向头或复杂内容:

    <html>
    <head>
    <meta HTTP-EQUIV="REFRESH" content="0;url=http://example.com/myapp/mypage.html">
    </head>
    <body>
    <h3>Submission successful, returning to XYZ</h3>
    </body>
    </html>
    
    
    提交成功,返回XYZ
    

    果然,随后的重定向成功了,所有JS/CSS请求的格式都很好。唯一的缺点是,用户在重定向期间短暂地看到了这个空页面,但我可以在我的项目中使用它…

    我的提交命令是默认的PDF表单按钮,“提交表单”操作设置为仅将字段作为XFDF发送。URL不以#FDF结尾,因为这仅用于作为FDF而不是XFDF提交。我最初尝试使用#FDF,但以另一种方式失败了(立即重复提交,没有遵循重定向)。还有一个以前版本的代码没有返回HTTP重定向,而是一个XFDF文档,它在表单本身中设置了一个状态字段,而不是返回到状态页面。这很有效,但始终需要两个选项卡。