企業 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 —