如何在Java web应用程序中使用wkhtmltopdf?

如何在Java web应用程序中使用wkhtmltopdf?,java,eclipse,web-applications,jakarta-ee,wkhtmltopdf,Java,Eclipse,Web Applications,Jakarta Ee,Wkhtmltopdf,我是wkhtmltopdf的新手。我想知道如何在Eclipse中将wkhtmltopdf与我的动态Web项目一起使用?如何将wkhtmltopdf与我的Java动态web应用程序集成 有适合wkhtmltopdf初学者的教程吗 (基本上,我希望在我的web应用程序中使用wkhtmltopdf,这样当用户单击保存按钮时,当前页面将保存为PDF文件) 首先,一个技术说明:因为您想在web项目中使用wkhtmltopdf,如果您部署到通过ssh(即通过网络)访问的Linux服务器机器上,您需要使用经过

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

有适合wkhtmltopdf初学者的教程吗


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

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

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

如果您只想保存当前页面的服务器生成版本,也就是说,不需要进行任何更改(如用户填写表单或Javascript添加新的DOM元素),您只需要在URL末尾添加一个额外的可选参数,如
?generate=pdf
,这将导致该页面生成为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()
或名为
ProcessBuilder
的较新API生成外部进程-请参阅以获取比较。如果你是聪明的,你应该能够做到这一点,而不需要创建任何临时文件

其中一个wkhtmltopdf网站目前已关闭,但主自述文件可用,这解释了命令行参数

这仅仅是一个提纲性的回答,给出了一些建议。如果您需要更多详细信息,请告诉我们您具体需要了解的内容。

其他信息:

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

有人回答说这是设计的,因为wkhtmltopdf支持在标准输出中给出实际的pdf输出。有关更多详细信息和java代码,请参见链接。

提供了一个在java中使用
wkhtmltopdf
的简单API

它还可以在带有
xvfb
的无头服务器上开箱即用

例如,在Ubuntu或Debian服务器上:
aptitude安装wkhtmltopdf xvfb

然后在Java中:

Pdf pdf = new Pdf();
pdf.addPage("http://www.google.com", PageType.url);
pdf.saveAs("output.pdf");

有关更多选项,请参见Github页面上的示例。

您能展示一些代码吗?他们根本没有文档。我必须在我的机器上安装wkhtmltopdf应用程序才能使用它吗?完全搞糊涂了。有没有什么方法可以让我将html页面代码作为字符串传递并以PDF格式获取?wkhtmltopdf()的可用java包装器依赖于vm来安装wkhtmltopdf。如果在java中将html转换为pdf是唯一的要求,那么您可以引用itext,而不需要任何安装依赖项,这与wkhtmltopdf不同。有关用法,请参阅此链接。谢谢!我刚从Maven Rep下载,我很满意!