企业 Web 项目开发中经常会有生产 PDF 格式文档的需求,例如 PDF 账单下载,月末生成各种统计报表等等。我们要帮助企业实现自动化,也就是说无需人工干预,程序能够按需从 DB 中拿数据自主生成。

项目使用 PHP 开发,于是调研了一下 PHP 的 PDF 类库,有 dompdf,TCPDF 之流,总的来说,各个项目主页上自夸的成分居多,基本思想都是类似的,即先用 HTML 写一个模板,每次往模板里填上数据,就可以转成 PDF 输出。但真正用起来就会发现各种毛病各种坑爹,部分 CSS 属性不支持啦,中文乱码啦,诸如此类。最终让我们抛弃 dompdf 的貌似是分页的一个大坑,据说一个表格 <table> 标签在跨页的情况下,dompdf 就直接崩溃了……

转换一下思路,其实我们只是要把 HTML 转成 PDF 而已,并不是必须要使用 PHP 这种低效的语言来做它并不擅长的事情。 Linux 下有没有二进制程序可以做这项工作呢?大杀气登场,撒花欢迎~

一、wkhtmltopdf:利用 webkit 内核将 HTML 转为 PDF

webkit 是一个高效、开源的浏览器内核,包括 Chrome 和 Safari 在内的(当然也包括国内那些极速啥的)浏览器都使用了这个内核。Chrome 打印当前网页的功能,其中有一个选项就是直接“保存为 PDF”。

Chrome 打印为 PDF

wkhtmltopdf 就是这样一个工具,使用 webkit 内核的 PDF 渲染引擎来将 HTML 页面转换为 PDF。高保真,质量很不错,server 上安装相关中文字体即可支持中文文档。更重要的是,使用非常简单。


当然它本身提供了一些 PHP 集成的方法,但我还是觉得直接用 exec 调用外部程序更方便一些。

HTML 源文件和生成的 PDF 文件对比效果图——

wkhtmltopdf html 源文件

wkhtmltopdf 生成的pdf

关于中文渲染的问题,只要在服务器上安装相应字体即可。如果是 CentOS 系统,一个命令就能搞定:

$ yum install fonts-chinese.noarch

另外注意在 HTML 文档中也要指定字符集


———- 我是猥琐的分割线,割割更健康 ———-

二、pdf2htmlEX:将 PDF 转为 HTML 网页

反过来,可否将 PDF 转化为 HTML 网页呢?(这样蛋疼的需求,我等是无法预料的……)

pdf2htmlEX 的作者是一名中国人,他实现将了 PDF 转换为 HTML,主要针对学术论文进行优化。这个工具的出现在Hacker News上引发了热烈讨论。看下 demo 你就会感叹它的效果是多么惊艳:

它的用法也非常简单,适合各路 PhD 们展示论文用。

$ pdf2htmlEX /path/to/foobar.pdf

综上

本文介绍了 wkhtmltopdfpdf2htmlEX 这两个将 HTML 和 PDF 格式文档互相转换的神器。但是其实这篇 blog 写来只是因为尘埃落定太久没更新了,写点东西更新一下而已 🙂
— EOF —