我是wkhtmltopdf的新手。我想知道如何在 Eclipse 中将 wkhtmltopdf 与我的动态 Web 项目一起使用?如何将 wkhtmltopdf 与我的 Java 动态 Web 应用程序集成?
有没有适合 wkhtmltopdf 初学者的教程?
(基本上,我想在我的 Web 应用程序中使用 wkhtmltopdf,这样当用户单击保存按钮时,当前页面将保存为 PDF 文件)。
我是wkhtmltopdf的新手。我想知道如何在 Eclipse 中将 wkhtmltopdf 与我的动态 Web 项目一起使用?如何将 wkhtmltopdf 与我的 Java 动态 Web 应用程序集成?
有没有适合 wkhtmltopdf 初学者的教程?
(基本上,我想在我的 Web 应用程序中使用 wkhtmltopdf,这样当用户单击保存按钮时,当前页面将保存为 PDF 文件)。
首先,技术说明:因为您想在 Web 项目中使用 wkhtmltopdf,如果并且当您部署到通过 ssh(即通过网络)访问的 Linux 服务器计算机时,您将需要使用已修补的 Qt 版本,或运行 X 服务器,例如虚拟 X 服务器 xvfb。(我不知道如果您部署到运行 Linux 以外的操作系统的服务器上会发生什么。)
其次,在 Web 项目中使用任何语言的 wkhtmltopdf 应该非常简单。
如果您只想保存当前页面的服务器生成版本,即不进行任何更改,例如用户填写表单或 Javascript 添加新的 DOM 元素,您只需要有一个额外的可选参数,例如?generate=pdf
on URL 的末尾,这将导致该页面生成为 PDF,然后 PDF 按钮将链接到该 URL。如果您只是使用简单的 JSP 或其他东西,手动添加到每个页面可能需要做很多工作,但是根据您使用的 Web 框架,Web 框架可能会提供一些帮助来在每个页面上实现相同的操作,如果你需要实现它。
要实现这种方法,您可能希望通过包装响应对象并覆盖其getWriter()
和getOutputStream()
方法来捕获响应。
另一种方法是有一个按钮“提交并生成 PDF”,它将将下一页生成为 PDF。如果您有用户需要填写的表格,这可能更有意义 - 我不知道。这真的是一个设计决定。
第三种方法是使用 Javascript 将页面的当前状态上传回服务器,并使用 wkhtmltopdf 进行处理。这将适用于任何页面。(这甚至可以在任何网站上使用,而不仅仅是您的网站,如果您将其设为书签。这只是我想到的一个想法 - 这可能不是一个好主意。)
第四种方法是,因为 wkhtmltopdf 可以获取 URL,所以传递页面的 URL 而不是页面的内容(这仅在请求是 HTTP GET 或等效于同一 URL 上的 HTTP GET 时才有效)。这比捕获您自己的响应输出有一些开销,但它可能可以忽略不计。您还很可能需要使用这种方法将 cookie 复制到 cookie jar 中,因为您的用户可能已登录或具有隐式会话。
所以你可以看到有很多选择!
现在,问题仍然存在:当您的服务器具有必要的 HTML 时,通过上述任何一种方法,如何将其输入到 wkhtmltopdf 中?这很简单。您将需要使用Runtime.getRuntime().exec()
或称为较新的 API生成一个外部进程ProcessBuilder
- 请参阅http://www.java-tips.org/java-se-tips/java.util/from-runtime.exec-to-processbuilder。 html进行比较。如果你很聪明,你应该能够做到这一点,而无需创建任何临时文件。
wkhtmltopdf 网站之一目前已关闭,但主要的 README 可在此处获得,其中解释了命令行参数。
这只是一个大纲答案,提供了一些指示。如果您需要更多详细信息,请告诉我们您需要了解的具体内容。
附加信息:
如果您最终尝试从 java(或就此而言,任何语言)在外部进程中调用 wkhtmltopdf,请注意从命令行使用 wkhtmltopdf 时看到的“正常”输出(即您期望的见 STDOUT)不在 STDOUT 中,而是在 STDERR 中。我在项目页面中提出了这个问题
http://code.google.com/p/wkhtmltopdf/issues/detail?id=825
并回答说这是设计使然,因为 wkhtmltopdf 支持在 STDOUT 中提供实际的 pdf 输出。有关更多详细信息和 java 代码,请参阅链接。
java-wkhtmltopdf-wrapperwkhtmltopdf
提供了一个在 Java中使用的简单 API 。
它还可以在带有xvfb
.
例如,在 Ubuntu 或 Debian 服务器上:
aptitude install wkhtmltopdf xvfb
然后在Java中:
Pdf pdf = new Pdf();
pdf.addPage("http://www.google.com", PageType.url);
pdf.saveAs("output.pdf");
有关更多选项,请参阅其 Github 页面上的示例。