HTML5 到 PDF 服务器端 [关闭]
Posted
技术标签:
【中文标题】HTML5 到 PDF 服务器端 [关闭]【英文标题】:HTML5 to PDF serverside [closed] 【发布时间】:2012-09-23 01:41:06 【问题描述】:我正在寻找从服务器端的 html5/CSS3 文档生成 PDF 的解决方案。
我知道有很多创建 PDF 的解决方案(如 FOP、iText...),但我需要确保它看起来与 HTML 页面 100% 相同。所以,我不想像 FOP 或 iText 这样逐个元素地创建 PDF 元素。
实际上,应该存在某些东西,因为这就是您从浏览器打印为 PDF 时所做的事情。 理想情况下,该解决方案应嵌入 Web 浏览器引擎(webkit 或 gecko)。我试过wkHtmlToPdf...但结果一点都不好(HTML5画布甚至没有打印...)
如果有人有任何解决方案的想法,无论是否免费,任何语言......我将不胜感激! 谢谢!!
【问题讨论】:
为什么这仍然关闭?每个问题都会引发比这更多的“征求辩论、争论、投票或扩展讨论”。 wkhtml2pdf 现在 确实 渲染画布...参见 wkhtmltopdf.org。为 wkhtml2pdf 竖起大拇指......只有一个可执行文件而不是处理 7000 多个 java 类的 fop,这真是太棒了 【参考方案1】:我使用 PhantomJS 从网页生成 png 图像,它也可以生成 PDF,而且质量通常很好。该属性称为屏幕截图并描述为here。支持的格式为 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 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 样本,我将其光栅化为 5641px 宽并裁剪了其中的一个区域。与前面的 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/phantomjs
phantomjs 已准备好运行。
如果生成的PDF不好,你可以尝试更新Webkit,但我想结果应该足够了。 PhantomJS 有很好的更新周期,所以应该在合理的时间内修复错误。
PhantomJS FAQ 也有很好的可能性信息。
【讨论】:
【参考方案2】:根据您的 HTML 的复杂程度,您可以使用 XmlWorker,这是 iText 开发人员的一个项目并使用 iText。
【讨论】:
【参考方案3】:你在服务器端使用什么语言?
创建页面的屏幕截图然后将图像转换为 pdf 可能会给您最好的结果。它将显示的页面与浏览器呈现的页面完全相同。
有一些屏幕截图即服务工具,例如browshot.com。看看API 和supported languages。
或者你可以使用你的工具。对于node.js,github 上有一个不错的项目。
【讨论】:
感谢您的回答。我在服务器端使用 Java,但我愿意为这个 PDF 生成使用其他东西。不幸的是,截图不是一个选项,因为生成的 pdf 应该是专业打印机的真实 PDF(例如,文本应该是文本,而不是某些像素)。 将图像转换为 PDF 是一个非常糟糕的主意 - 您将丢失所有文本,因此无法很好地缩放,并且无法复制/粘贴或搜索。它还会使 PDF 文件比它需要的大。如果使用 wkHtmlToPdf 或 phantomJs 或普通浏览器的打印选项,文本会作为文本进入 PDF,任何矢量图也会作为矢量进入,避免了这些问题。以上是关于HTML5 到 PDF 服务器端 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章