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

Mel*_*lon 11 java eclipse web-applications java-ee wkhtmltopdf

我是wkhtmltopdf的新手.我想知道如何在Eclipse中使用wkhtmltopdf和我的Dynamic Web Project?如何将wkhtmltopdf与我的Java动态Web应用程序集成?

有什么教程可供wkhtmltopdf的初学者使用吗?

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

Rob*_*een 14

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

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

如果您只想保存服务器生成的当前页面版本,即没有像填写表单的用户那样做任何更改,或者Javascript添加新的DOM元素,您只需要有一个额外的可选参数,如?generate=pdfon URL的结尾,这将导致该页面生成为PDF,然后PDF按钮将链接到该URL.如果您只是使用简单的JSP或其他东西,这可能需要手动添加到每个页面,但是根据您使用的Web框架,Web框架可能会提供一些帮助,以便在每个页面上实现相同的操作,如果你需要实现它.

为了实现这种方法,你可能会想捕捉通过包装响应对象和overridding其响应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可在此处获得,它解释了命令行参数.

这只是一个概述答案,给出了一些指示.如果您需要更多详细信息,请告诉我们您需要了解的具体内容.


小智 8

附加信息:

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

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

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


Dar*_*idl 5

java-wkhtmltopdf-wrapper提供了一个wkhtmltopdf在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");
Run Code Online (Sandbox Code Playgroud)

有关更多选项,请参阅其Github页面上的示例.