HTML5 转 PDF 服务器端

15

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

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

实际上,当您从浏览器中打印PDF时,应该存在一些东西。理想情况下,解决方案应该嵌入网络浏览器引擎(webkit或gecko)。我尝试了wkHtmlToPdf...但结果一点也不好(HTML5画布甚至没有打印...)

如果有人有任何解决方案的想法,不管是免费还是付费,任何语言都可以...我将非常感激!谢谢!


为什么这个问题还是关闭的?每一个问题都引起了更多的“争论、辩论、投票或长时间讨论”。 - Timo Kähkönen
1
wkhtml2pdf现在可以渲染画布了...请参见wkhtmltopdf.org。为wkhtml2pdf点赞...只需处理fop的7000多个Java类之一,就可以拥有一个可执行文件,这真是太棒了。 - HAL 9000
3个回答

24
我已经使用PhantomJS生成网页的PNG图像,通常质量很好。该属性称为截屏,可以在此处找到相关描述,并且还支持PNG,JPEG,GIF和PDF格式。
当转换为PDF时,页面文本会保留为文本。
在测试了一些其他库或程序之后,发现PhantomJS是最完美的解决方案。PhantomJS使用WebKit,一个真正的布局和渲染引擎。
一些示例可以在https://github.com/ariya/phantomjs/wiki/Examples中找到。在Rendering/rasterization部分中提到了以下脚本,可帮助您完成此过程:
rasterize.js rasterizes a web page to image or PDF

PhantomJS QuicStart Guide指出:

可以生成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光栅化到5641像素宽并裁剪其中一部分得到的样本。和之前的PDF示例一样,PDF中的文本是可选的,并且正如您所看到的,文本很清晰(无锯齿!)。

CSS3Buttons

安装

我首先尝试在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常见问题也提供了很好的信息和可能性。


1

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


0
你在服务器端使用什么语言?
创建页面截图,然后将图像转换为PDF可能会给您最好的结果。它将显示与浏览器呈现的页面完全相同。
有一些屏幕截图服务工具,例如browshot.com。请查看API支持的语言
或者您可以使用您的工具。对于node.js,在github上存在一个不错的项目。

谢谢你的回答。我在服务器端使用Java,但我也可以考虑使用其他工具来生成PDF。不幸的是,截图不是一个选项,因为生成的PDF应该是专业打印机所需的真正的PDF(例如,文本应该是文本,而不是一些像素)。 - Olivier
将图像转换为PDF是一个非常糟糕的想法 - 您将失去所有文本,因此它不会很好地缩放,也无法复制/粘贴或搜索。这还会使PDF文件比必要的大。如果您使用wkHtmlToPdf、phantomJs或普通浏览器的打印选项,文本将作为文本进入PDF,任何矢量图形也将作为矢量进入,避免这些问题。 - rjmunro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接