PHP輸出PDF打印HTML5+CSS3打印格式控制

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

本文推薦兩個可用的類庫:Princewkhtmltopdf。這兩位都是跨平臺系統支持,而且不須要內嵌於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,真是要多快有多快啊!

相關文章
相關標籤/搜索