如何将完整的CGI表单呈现为PDF?

时间:2015-04-08 13:57:05

标签: perl session pdf cgi render

我有一个HTML表单,用户可能已填写或部分填写。我想快照该状态并将其呈现为PDF文档。我一直在使用wkhtmltopdf

我已经从客户端和服务器端尝试了这个,并且渲染的结果始终是原始形式,而不是填写的形式。

我注意到如果我重新加载已填写的表单页面,我会收到填写的表单,但如果我将表单的URL剪切并粘贴到新窗口中,我会得到初始的,未填写的 - 形式。

所以我确信自己,如果我可以正确使用CGI::Session,我可以成功打开与填写会话相同的会话。我尝试使用CGI::Session::Plugin::Redirect没有任何乐趣。我认为关键是window.open()必须使用填写表单窗口的SID。

我没有很多CGI会话管理经验,所以这是一个四天无处可寻的任务。任何建议都表示赞赏,即使它放弃这种方法并回到更常见的帖子>在新窗口中渲染新表格,并从中生成PDF。如果可以的话,我想避免所有这些。

2 个答案:

答案 0 :(得分:2)

假设您的Web服务器上有以下HTML文档:

/var/www/html/index.html

<!DOCTYPE html>

<html>
  <head>
    <meta charset="UTF-8">
  </head>
  <body>
    <form action="/process.cgi">
      <input type="text" name="foo">
    </form>
  </body>
</html>

当您在浏览器中导航到http://hostname/index.html时,网络服务器会返回此文档,浏览器会显示该文档。

当您在浏览器中填写文本字段时,Web服务器上的文档不会更改。因此,导航到http://hostname/index.html的任何人都将获得原始的,未经修改的形式。这就是为什么您不能简单地将URL复制并粘贴到另一个浏览器选项卡中并获取填写的表单。

大多数浏览器默认使用缓存。当您填写表单中的某些字段时,浏览器会缓存您输入的内容。当您重新加载页面时,Web服务器会发送与之前完全相同的文档*(即未修改的表单),但浏览器使用缓存的数据以您拥有它们的方式填写表单字段。如果在重新加载页面时覆盖缓存(在Firefox中 Ctrl + F5 ),则不会填写表单字段。请注意,URL和文档都不在服务器已经改变了。这就是为什么在重新加载页面并获得填写表单后,您无法将URL复制并粘贴到另一个浏览器选项卡中。

wkhtmltopdf获取网址,呈现相应的网页,并根据呈现的内容生成PDF。基于上面的解释,现在应该清楚为什么wkhtmltopdf总是生成未修改形式的图像。

解决方案

如果填写表单字段不会改变网络服务器上的任何内容, 会改变什么?它会更改DOM,这是一种描述浏览器中可以使用JavaScript访问的文档的结构。

一种方法是使用客户端JavaScript PDF生成器,如jsPDF;因为它在客户端上运行,所以它可以访问用户正在与之交互的DOM,因此它可以“看到”用户在表单字段中输入的值。


*实际上,网络服务器通常会发送304 Unmodified响应以节省带宽,但表单缓存的工作方式相同。

答案 1 :(得分:1)

explanation from ThisSuitIsBlackNot准确了解您的设计失败的原因。在浏览器中将字符键入表单字段只会更改屏幕和分配给浏览器的内存中的数据。

我建议采用不同的解决方案。 WWW::Mechanize::Firefox模块是WWW::Mechanize的变体,它使用真实的浏览器应用程序来检索和呈现网页。它主要是在网站需要JavaScript支持时选择的,但它在这里很有用,因为它有一个content_as_png方法,它返回当前页面的PNG图像。希望这足以让您构建具有所需内容的PDF文件