企业 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
 //将网页内容转换为 PDF
 exec("wkhtmltopdf http://www.google.com google.pdf");
 //将本地 HTML 文件转为 PDF
 exec("wkhtmltopdf my.html my.pdf");
?>

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

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

wkhtmltopdf html 源文件

wkhtmltopdf 生成的pdf

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

$ yum install fonts-chinese.noarch

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

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

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

二、pdf2htmlEX:将 PDF 转为 HTML 网页

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

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

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

$ pdf2htmlEX /path/to/foobar.pdf

综上

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