Yii框架本身不提供PDF文本提取能力,需借助smalot/pdfparser库实现;该库纯PHP、无需系统依赖,支持文本型PDF的全文及分页提取,但不支持加密、扫描件(OCR需另接Tesseract或云API)。

Yii框架本身不提供PDF文本内容提取能力,需借助第三方PHP库实现。最常用、稳定且与Yii2集成度高的方案是 smalot/pdfparser 扩展,它纯PHP实现、无需系统级依赖(如pdftotext),适合在共享主机或容器环境中部署。
安装与基础配置
通过 Composer 安装解析器:
- 执行命令:
composer require smalot/pdfparser - 无需额外注册服务组件,直接在控制器或服务类中 use 类即可使用
- 注意:该库支持 PDF 1.0–1.7,对含加密、JavaScript 或高级字体嵌入的 PDF 可能解析失败,建议先用 Acrobat 检查文档是否可复制文本
在 Yii2 中提取纯文本内容
典型用法如下(Controller 示例):
- 加载 PDF 文件(支持本地路径或 UploadedFile 实例):
$parser = new \Smalot\PdfParser\Parser();<br>$pdf = $parser->parseFile('/path/to/invoice.pdf'); - 获取全部页面文本:
$text = $pdf->getText(); // 返回连续字符串,含换行符 - 按页提取便于结构化处理:
$pages = $pdf->getPages();<br>foreach ($pages as $page) {<br> $pageText = $page->getText();<br> // 可做关键词匹配、正则抽取金额/单号等<br>}
结合 Yii2 模型与验证做结构化解析
若用于票据识别类场景(如自动提取发票号码、金额、开票日期),建议封装为独立服务:
- 创建
app/services/PdfTextExtractor.php,注入yii\helpers\StringHelper辅助清洗(去空行、合并断裂词) - 定义规则方法,例如:
extractInvoiceNo($text)使用正则/发票代码[::\s]*(\d{12})/u - 在模型中调用时捕获异常:
try { $result = PdfTextExtractor::fromFile($model->pdf_file->tempName); } catch (\Exception $e) { $model->addError('pdf_file', 'PDF内容无法读取,请检查格式'); }
性能与边界注意事项
PDF 解析属于 CPU 密集型操作,需规避常见陷阱:
- 大文件(>5MB 或 >100页)建议加超时控制:
set_time_limit(60);并记录日志 - 扫描件类 PDF(即图片型)无法提取文字——
smalot/pdfparser仅处理文本型 PDF;如需 OCR,须另接 Tesseract(需系统安装)或云 API(如百度 OCR) - 中文乱码通常因 PDF 内嵌字体未正确映射,可尝试用
$pdf->getDetails()查看Producer和Creator字段,辅助判断生成工具来源


















