我正在寻找一个从HTML5/CSS3文档,服务器端生成PDF的解决方案。
我知道有很多的解决方案来创建一个PDF (如FOP,iText…),但我需要确保它将看起来100%一样的HTML页面。所以,我不想像FOP或iText这样的元素来创建一个PDF元素。
实际上,应该存在一些东西,因为这就是您在浏览器中打印为PDF时所做的事情。理想情况下,解决方案应该嵌入web浏览器引擎(webkit或gecko)。我试过wkHtmlToPdf..。但是结果一点也不好( HTML5画布甚至没有打印出来……)
如果有人有任何解决方案的想法,不管是不是免费的,任何语言...我会很感激的!谢谢!!
发布于 2012-10-11 06:39:43
我曾使用PhantomJS从网页生成png图像,它也可以生成PDF,而且质量通常很好。该属性称为screen capture和described here。支持的格式有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 PDFPhantomJS QuicStart Guide说:
生成PDF输出是可能的,例如来自维基百科的文章:
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

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

安装
我先试着在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/phantomjsphantomjs已经准备好了。
如果生成的PDF不好,您可以尝试更新Webkit,但我认为结果应该足够了。PhantomJS有很好的更新周期,所以bugs应该在合理的时间内修复。
PhantomJS FAQ也有很好的可能性信息。
发布于 2012-10-02 20:00:03
根据超文本标记语言的复杂程度,您可以使用XmlWorker,这是iText开发人员使用iText的项目。
发布于 2012-10-02 17:31:07
你在服务器端使用的是什么语言?
创建页面的屏幕截图,然后将图像转换为pdf可能会给你带来最好的结果。它将以与浏览器呈现完全相同的方式显示页面。
市面上有一些截图即服务工具,比如browshot.com。看看API和supported languages。
或者你可以使用你的工具。在github上有一个很好的node.js项目。
https://stackoverflow.com/questions/12686286
复制相似问题