12

我是wkhtmltopdf的新手。我想知道如何在 Eclipse 中将 wkhtmltopdf 与我的动态 Web 项目一起使用?如何将 wkhtmltopdf 与我的 Java 动态 Web 应用程序集成?

有没有适合 wkhtmltopdf 初学者的教程?

(基本上,我想在我的 Web 应用程序中使用 wkhtmltopdf,这样当用户单击保存按钮时,当前页面将保存为 PDF 文件)。

4

3 回答 3

14

首先,技术说明:因为您想在 Web 项目中使用 wkhtmltopdf,如果并且当您部署到通过 ssh(即通过网络)访问的 Linux 服务器计算机时,您将需要使用已修补的 Qt 版本,或运行 X 服务器,例如虚拟 X 服务器 xvfb。(我不知道如果您部署到运行 Linux 以外的操作系统的服务器上会发生什么。)

其次,在 Web 项目中使用任何语言的 wkhtmltopdf 应该非常简单。

如果您只想保存当前页面的服务器生成版本,即不进行任何更改,例如用户填写表单或 Javascript 添加新的 DOM 元素,您只需要有一个额外的可选参数,例如?generate=pdfon 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 可在此处获得,其中解释了命令行参数。

这只是一个大纲答案,提供了一些指示。如果您需要更多详细信息,请告诉我们您需要了解的具体内容。

于 2011-04-17T10:15:33.087 回答
9

附加信息:

如果您最终尝试从 java(或就此而言,任何语言)在外部进程中调用 wkhtmltopdf,请注意从命令行使用 wkhtmltopdf 时看到的“正常”输出(即您期望的见 STDOUT)不在 STDOUT 中,而是在 STDERR 中。我在项目页面中提出了这个问题

http://code.google.com/p/wkhtmltopdf/issues/detail?id=825

并回答说这是设计使然,因为 wkhtmltopdf 支持在 STDOUT 中提供实际的 pdf 输出。有关更多详细信息和 java 代码,请参阅链接。

于 2012-01-17T07:03:22.860 回答
6

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 页面上的示例。

于 2016-11-30T17:02:49.103 回答