php生成pdf文件
- 前序
- 前期准备
- 代码实现
-
- 安装dompdf
- 加载中文字体库( 防止中文乱码 )
- 加载外部图片
- 渲染模板数据
- 生成pdf
- 其他方面
- 注意事项
- 参考文献及个人博客
- 局限性
- 博主声明
前序
该篇主要讲述的是使用PHP是生成pdf文件,选用了Packagist中使用率最高的 dompdf 来满足我们的需求
请先通篇阅读本文,然后在完成功能需求
前期准备
1.主体框架:laravel 版本5.8
2.使用工具包 :
- dompdf 实现pdf功能的主体工具包
- load_font.php 和 autoload.inc.php 加载字体文件
- 字体文件(自行下载)
代码实现
安装dompdf
1 | composer require dompdf/dompdf |
加载中文字体库( 防止中文乱码 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 下载 git clone https://github.com/dompdf/utils.git 复制 load_font.php到 dompdf目录中,与lib 和 src 目录同级。 下载中文字体,推荐下载 Droid Sans Fallback 字体,下载链接 http://www.17ziti.com/info/71250.html 也可用雅黑字体 (我本人使用的微软雅黑),【雅黑字体会导致导出文档过大】 将字体文件放在指定位置(本人放在了public下面的字体文件夹) 执行下列语句(注意执行语句时所处文件位置) php vendor/dompdf/dompdf/load_font.php 'msyh' public/font//msyh.ttf 此时 vendor/dompdf/dompdf/lib/fonts 下会出现你的字体文件 模板页面渲染 @font-face{ font-family:msyh; } body { font-family:msyh; margin: 0 auto; } |


执行后语句后,目录下会出现字体文件



加载外部图片
1 2 3 4 5 | 修改Option配置文件的配置项 路径 vender/dompdf/dompdf/src/Options.php 修改以下配置(测试成功需清除页面缓存文件) private $isRemoteEnabled = true; |
渲染模板数据
将你要生成的pdf数据渲染到模板上(根据需求渲染样式)

生成pdf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 引用 dompdf 软件包 use Dompdf\Dompdf; 获取模板页面 $html = view('pdf.artworks')->with('artworks',$artworks); $html = response($html)->getContent(); 生成pdf $dompdf = new Dompdf(); $dompdf->loadHtml($html); $dompdf->setPaper('A4', 'landscape'); $dompdf->render(); $name = "artworks".time().".pdf"; $dompdf->stream($name); |
其他方面
除修改配置参数外,还可使用option方法来实现其他的参数配置
使用范例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | **使用 Options 类** use Dompdf\Dompdf; use Dompdf\Options; $options = new Options(); $options->set('defaultFont', 'Courier'); $dompdf = new Dompdf($options); **或使用 getOptions 方法** use Dompdf\Dompdf; $dompdf = new Dompdf(); $options = $dompdf->getOptions(); $options->setDefaultFont('Courier'); $dompdf->setOptions($options); |
注意事项
1.处理大多数CSS 2.1和一些CSS3属性,并不能适用所有除css3属性
2.支持大多数演示HTML 4.0属性,html标签使用需谨慎
3.中文字体需引入中文字体库,软件包本身不携带
4.显示图片需修改配置
5.中文换行需自行处理
参考文献及个人博客
dompdf 的 packagist 地址
dompdf 的 github 地址
dompdf 项目
Ann子尘 的 OSCHINA 地址
局限性
- Dompdf对格式不正确的HTML输入不是特别宽容。为避免任何意外的呈现问题,您应该在运行时($dompdf->set_option(‘isHtml5ParserEnabled’, true);)启用内置HTML5解析器,或者通过HTML验证器/清理器(例如Tidy或 W3C标记验证服务)运行HTML 。
- 表格单元不可分页,这意味着表格行必须适合单个页面。
- 元素在解析后呈现在活动页面上。
博主声明
本文是本人踩坑过程,所涉及方面并不全面,若有其他想法或补充请留言联系,希望认识更多的朋友并与之共同进步