如何通过 HTTP 提交 PDF 表单数据?
Posted
技术标签:
【中文标题】如何通过 HTTP 提交 PDF 表单数据?【英文标题】:How to submit PDF form data via HTTP? 【发布时间】:2014-04-03 13:25:20 【问题描述】:我正在开发一个应用程序,简而言之,它可以处理 PDF 表单。提交数据格式为 XFDF。到目前为止,一切都很好,但我从客户那里得到了一些非常奇怪的行为。
PDF 查看器是 IE 中的 Adobe Reader(当前为 11.0.6)。这是一个内部应用程序,所以现在不需要支持其他任何东西。 PDF 是在服务器上动态创建的,因此我必须在浏览器而不是独立应用程序中执行此操作。
工作流程是这样的:
-
将向用户发送一封电子邮件,其中包含指向应用程序内部 URL 的链接。
用户单击链接。浏览器打开并请求指定的 URL。
应用程序提供一个 PDF 文件(内容类型应用程序/pdf)。
用户在 PDF 中填写表单。
用户点击表单中的“提交”按钮。
PDF 查看器和浏览器以某种方式合作将表单数据 POST 回服务器,发送到
与表单本身的 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
请注意,此请求同时包含 Content-Type 和 Content-Length 标头,这对于 GET 请求来说已经足够不寻常了,但是没有请求正文,不是一个字节,不是 1824 个.我的服务器是 IIS,它使用 400 Invalid Verb 响应此请求(不知道为什么会出现这个特定错误,但这样的 400 肯定是合理的)。
状态页面本身的请求不包含这些标头;这是完全正确的。出于某种原因,样式表请求重复了之前两个请求的表单提交的标头。
不幸的是,没有很多关于通过 HTTP 发送 PDF 表单数据的文档,但据我所知,我做的一切都是正确的。我认为这是 Adobe Reader 插件和/或 IE 中的错误;任何人都可以想办法解决它吗?
【问题讨论】:
【参考方案1】:在提交表单数据时需要注意一些事项。
a) 你的提交命令是什么样子的?
根据 Acrobat javascript 文档,如果您以 FDF 或 XFDF 形式提交,则要提交的 URL 必须以 #FDF 结尾。这将确保 (X)FDF 被传输。如果省略该插件,Acrobat/Reader 可能会以 html POST 的形式提交。
b) 只要您在网络浏览器下运行 Acrobat/Reader,答案应该没问题。否则,Reader 无法理解来自服务器的返回码;相反,您应该返回 PDF 或 FDF。
从 Adobe 网站获取 FDFToolkit 可能会有所帮助。即使您决定不使用它,文档也对事情的工作原理进行了很好的解释。
【讨论】:
我的提交命令是默认的 PDF 表单按钮,“提交表单”的操作设置为仅以 XFDF 形式发送字段。该 URL 不以 #FDF 结尾,因为它仅用于提交为 FDF,而不是 XFDF。我最初使用#FDF 进行了尝试,但以不同的方式失败(立即重复提交,并且未遵循重定向)。此代码的先前版本也没有返回 HTTP 重定向,而是返回一个 XFDF 文档,该文档在表单本身中设置了一个状态字段,而不是返回到状态页面。这工作得很好,但总是需要两个标签。【参考方案2】:我最近遇到了这个确切的问题。我正在通过嵌入式按钮将 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>
果然,后续重定向成功,所有JS/CSS请求格式正确。唯一的缺点是用户在重定向期间短暂地看到了这个空白页面,但我可以在我的项目中忍受它......
【讨论】:
以上是关于如何通过 HTTP 提交 PDF 表单数据?的主要内容,如果未能解决你的问题,请参考以下文章
百度富文本编辑器 通过表单提交数据!php中获取不到富文本编辑器中的内容!有没有啥好的培训机构