15

我正在寻找一种从服务器端的 HTML5/CSS3 文档生成 PDF 的解决方案。

我知道有很多创建 PDF 的解决方案(如 FOP、iText...),但我需要确保它看起来与 HTML 页面 100% 相同。所以,我不想像 FOP 或 iText 这样逐个元素地创建 PDF 元素。

实际上,应该存在某些东西,因为这就是您从浏览器打印为 PDF 时所做的事情。理想情况下,该解决方案应嵌入 Web 浏览器引擎(webkit 或 gecko)。我尝试了 wkHtmlToPdf ......但结果一点都不好(HTML5画布甚至没有打印......)

如果有人对任何解决方案有任何想法,无论是否免费,任何语言......我将不胜感激!谢谢!!

4

3 回答 3

24

我使用 PhantomJS 从网页生成 png 图像,它也可以生成 PDF,而且质量通常很好。该属性称为屏幕截图并在此处进行描述。支持的格式为 PNG、JPEG、GIF 和 PDF。

转换为 PDF 时,页面文本保留为文本。

在测试了几个其他库或程序后,发现 PhantomJS 是最完美的解决方案。PhantomJS 使用 WebKit,一个真正的布局和渲染引擎。

https://github.com/ariya/phantomjs/wiki/Examples中很少有示例。在渲染/光栅化部分中提到了以下脚本,可以帮助您完成此过程:

rasterize.js rasterizes a web page to image or PDF

PhantomJS 快速入门指南说:

可以生成 PDF 输出,例如来自 Wikipedia 文章:

phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf

或者在创建可打印的备忘单时:

phantomjs rasterize.js http://www.nihilogic.dk/labs/webgl_cheat_sheet/WebGL_Cheat_Sheet.htm webgl.pdf

我测试了几页的pdf生成,如果页面遵循标准,它会产生很好的结果。文本是可以选择和打印为高质量的,但在某些页面上,pdf 中的布局与 png 中的不同。以下是使用命令生成的两个屏幕截图:

$ phantomjs rasterize.js 'http://windows.microsoft.com/en-US/windows/home' microsoft.png

$ phantomjs rasterize.js 'http://windows.microsoft.com/en-US/windows/home' microsoft.pdf 

使用 Phantomjs 生成 png 和 pdf 的示例

我还测试了 http://lab.simurai.com/buttons/。pdf 和 png 非常相同,下面是一个 pdf 样本,我将其光栅化为 5641px 宽并裁剪了其中的一个区域。与前面的 PDF 示例一样,可以在 PDF 中选择文本,并且如您所见,文本很清晰(没有抗锯齿!)。

CSS3按钮

安装

我首先尝试在从源代码编译的 Centos5 上安装 Qt 库和 PhantomJS,但没有运气。然后在 Ubuntu 11.10 上,这个过程很轻松:

我下载了http://phantomjs.googlecode.com/files/phantomjs-1.7.0-linux-x86_64.tar.bz2并使用

tar -xjvf phantomjs-1.7.0-linux-x86_64.tar.bz2

然后将 phantomjs 可执行文件复制到系统的 bin 目录:

$ cp phantomjs-1.7.0-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs

phantomjs 已准备好运行。

如果生成的PDF不好,你可以尝试更新Webkit,但我想结果应该足够了。PhantomJS 具有出色的更新周期,因此应在合理的时间内修复错误。

PhantomJS FAQ也有很好的可能性信息。

于 2012-10-10T22:39:42.767 回答
1

根据您的 HTML 的复杂性,您可以使用XmlWorker,这是 iText 开发人员的一个项目并使用 iText。

于 2012-10-02T12:00:03.047 回答
0

您在服务器端使用什么语言?

创建页面的屏幕截图,然后将图像转换为 pdf 可能会给您最好的结果。它将显示的页面与浏览器呈现的页面完全相同。

有一些屏幕截图即服务工具,例如browshot.com。查看API支持的语言

或者你可以使用你的工具。对于node.js在github上有一个不错的项目。

于 2012-10-02T09:31:06.820 回答