對一般用戶來說,要把文件存成 PDF,大多是按個「匯出」、「另存新檔」、「列印」就完工的事,但在程式端搞起來可不簡單。
生成 PDF 的方式
在 web app 的典型情境不外乎把原本是 HTML 形式的文件、報表、票卡、收據、帳單轉換成 PDF,一般用幾種方式辦到:
用瀏覽器生成
前端有許多 PDF 生成套件可供選用,但問題是你無法保證用戶瀏覽器一致,可能會有版面、字體、顏色各方面參差問題。
在後端生成
以 Python 為例,常見的有 WeasyPrint 和 Python-PDFKit。
PDFKit 是以 wkhtmltopdf 為基礎的工具,而 wkhtmltopdf 則是以 Qt WebKit 為基礎的工具,這個 Qt WebKit 不知道是哪個年代的 WebKit,對當代的 CSS 支援極差,flexbox、grid 都不可用,不禁佩服以前共事的三寶之大寶還能用 wkhtmltopdf 生出有模有樣的標籤,給大寶一個讚!
WeasyPrint 是走自行解析 HTML 的路子,它的解析器來自其他 Python 套件,優點是輕量、快速,問題是它的解析器終究不比真正的瀏覽器,容錯、標準支援方面都不夠好,例如下面這些問題:
- 支援 CSS flexbox ,但對 CSS grid 完全不支援。
- 支援
justify-content
、align-items
,但對 place-content
、place-items
都不支援。
兩者相較還是 WeasyPrint 要好得多,而且它的範例製作的挺精美,令人有想用的衝動。