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,真是要多快有多快啊!