ERP系統進入尾聲,各類送貨單、退貨單、合同、對帳單等等一系列的東東排着隊調打印格式。HTML5+CSS3已經這樣流行,然則眼下,基於CSS3的打印控制,竟然還處於原始部落階段,Chrome、Firefox、Edge等連簡單的@page都支持得不完善。通過一番折騰,終於找到好的解決方案,即借道輸出PDF,先讓PHP抓取目標的HTML代碼,而後輸出到指定解析器,生成PDF內容,最終打印。php
實際上,這個模式裏:css
1. HTML5+CSS3,只是輸出內容的調節環節,須要確保CSS3 @page的全特性支持無誤。尤爲是長文章(合同)分頁,和長表格自動分頁(最好是thead和tfoot能分頁重複顯示)。html
2. PDF預覽時,實際上就是打印前的排版預覽,以後就直接輸出打印便可。html5
3. PDF可供用戶自行下載成本地文件作備份。css3
4. HTML內容(PDF內容),能夠經過緩存類庫進行緩存,本身調控週期、壓縮存儲便可。git
因而打印問題迎刃而解。github
本文推薦兩個可用的類庫:Prince和wkhtmltopdf。這兩位都是跨平臺系統支持,而且不須要內嵌於php,不須要有任何擔憂。bootstrap
這兩貨都須要在官網下載安裝,若是是windows,記得安裝的時候別放在C盤,否則會沒法執行。windows
php調用:緩存
Prince:下載他官方的這個類庫:Prince for php。順帶說,Prince的類庫裏支持.net、Java、Python、Prel等等。
Snappy:這個是國外某開發者基於wkhtmltopdf的php composer擴展,直接在你項目中執行:composer require knplabs/knp-snappy,便可。Snappy github地址。
Prince和wkhtmltopdf,實際上就是一個html5+css3的解析器,而且是完整支持css3 @page部分的打印特性的功能。而且具有生成PDF的功能。其中Prince是收費的,但他提供無償使用License,美中不足的地方就是生成PDF預覽時,第一頁右上角會有一個P字的icon,不過在打印的時候就會消失掉。
二者比較,Prince對中文樣式的支持更好(可能wkhtmltopdf是由於個人CSS寫法有問題,沒有針對@media print),修改中文字體,wkhtmltopdf仍是會用默認的宋體輸出,而Prince則是你指定的字體。
二者的調用代碼都很簡單。
Prince部分:
<?php require '../bootstrap.php'; $prince = new \xErp\Helper\Prince('D:\\prince\\prince-10r7-win64\\bin\\prince.exe'); header('Content-Type: application/pdf'); header('Content-Disposition: inline; filename="foo.pdf"'); $prince->convert_file_to_passthru('http://www.163.com');
Snappy部分:
<?php require '../bootstrap.php'; use Knp\Snappy\Pdf; $snappy = new Pdf('D:\xampp\wkhtmltopdf\bin\\wkhtmltopdf.exe'); header('Content-Type: application/pdf'); //header('Content-Disposition: attachment; filename="file.pdf"'); print $snappy->getOutput('http://www.163.com');
就是這樣酸爽,不再用怕客戶改打印格式了,隨便改吧,親。
無圖無真相,來個截圖
好像這樣的頁面,其實是基於HTML生成的,調試只需調試HTML+CSS便可,截圖以下:
用HTML+CSS調打印,基本上一個格式,最多不超過1個小時,基本上就能調完。這樣後期,管你有多少分報表,我統一用http://erp/print/報名類型/報表ID.ext的url,.html就是請求普通的html輸出,.pdf就是請求將html輸出pdf,真是要多快有多快啊!