yii框架不提供pdf解析能力,需用smalot/pdfparser等第三方库集成;推荐封装为服务类,逐页解析提取字段,结合yii模型验证,注意大文件性能优化。

Yii框架本身不提供PDF解析能力,它专注Web应用构建,解析PDF需借助第三方PHP类库并手动集成。常见需求如提取文字、读取元数据、拆分页面等,不能靠yii2-export或mpdf这类生成类扩展实现。
推荐用Smalot/PDFParser做基础解析
这是目前 Yii2/Yii3 项目中最稳定、文档清晰、支持中文PDF的解析库。它纯PHP实现,无系统依赖,能准确提取文本流、字体信息和页面结构。
- 安装命令:
composer require smalot/pdfparser - 加载PDF文件时,用绝对路径(
Yii::getAlias('@webroot')开头),避免相对路径导致file_get_contents失败 - 中文PDF需确保PDF内嵌字体或使用UTF-16编码;若解析出乱码,可先用
iconv('UTF-16', 'UTF-8', $text)转码 - 不建议在控制器中直接new Parser——应封装为服务类,注入到需要的地方,便于复用和测试
提取文字与结构化数据的典型写法
多数业务场景不是“全文解析”,而是定位特定字段,比如发票号、金额、开票日期。这时别用$parser->parseFile()全量加载,而应逐页处理:
- 调用
$document->getPages()获取页面数组,遍历每页 - 对每页用
$page->getText()得原始文本,再用正则匹配关键字段(如/发票代码:(\d{12})/) - 表格类PDF(如对账单)可用
$page->getDetails()尝试获取坐标+文本,结合x/y位置做行列还原 - 避免用
strip_tags清理文本——PDF文本无HTML标签,该函数会误删括号、斜杠等有效符号
与Yii模型和验证联动
解析结果常要存入数据库或参与业务校验。可将解析逻辑封装进模型方法,复用Yii的验证规则:
- 在模型中加属性
public $pdfFile;,rules里配置['pdfFile', 'file', 'extensions' => 'pdf'] - 写一个
extractFromPdf()方法:用Smalot解析后,把发票号、金额等赋值给模型属性 - 调用
$model->validate()触发金额是否为数字、发票号长度等校验,失败则返回错误给前端 - 不要在
beforeSave里解析PDF——上传和保存是两个动作,应先解析成功再允许保存
大文件与性能注意事项
超过10MB的PDF容易超时或内存溢出,尤其在共享主机或低配VPS上:
- 上传前用JavaScript校验文件大小(
input.files[0].size ),拦截过大文件 - PHP配置中调高
max_execution_time(至少120秒)和memory_limit(建议256M起) - 禁用调试模式(
YII_DEBUG = false),关闭日志记录PDF解析过程,减少I/O压力 - 不推荐用Ghostscript或Poppler作预处理——它们需系统级安装,破坏Yii项目的可移植性











