Yii不提供PDF解析能力,需手动集成第三方库:Smalot/pdfparser(纯PHP,适合中小文件)或poppler-utils的pdftotext(Linux下更快更稳,需exec权限)。

Yii本身不提供PDF文本解析能力,必须借助第三方PHP库,且需手动集成、配置和调用——没有现成的Yii扩展能直接“解析PDF内容”并自动注入模型或视图。
核心依赖:选对底层库是前提
常用可靠方案只有两个:
- Smalot/pdfparser:纯PHP实现,无需扩展,支持密码保护PDF、提取文字/元数据/链接,对中文兼容性较好(需确保PDF内嵌字体或使用Unicode编码);适合中小文件、结构较规范的票据、合同类PDF。
-
poppler-utils(通过shell命令):Linux环境推荐,调用
pdftotext命令,速度快、准确率高,但需服务器安装poppler,并开启PHP的exec权限;对扫描件无效(OCR需另配tesseract)。
在Yii中手动集成pdfparser(推荐入门)
1. 安装:composer require smalot/pdfparser
2. 在Controller或Service中使用(示例):
use Smalot\PdfParser\Parser;
$pdf = new Parser();
$document = $pdf->parseFile('/path/to/file.pdf');
$text = $document->getText(); // 获取全部可提取文本
$pages = $document->getPages(); // 按页获取,便于分段处理
3. 注意事项:
- 若PDF含图片或扫描页,
getText()返回为空——它不带OCR能力; - 加密PDF需先传入密码:
$pdf->parseFile($path, 'password');; - 中文乱码常见于PDF未嵌入字体或使用非UTF-16编码,可尝试用
$document->getDetails()['Title']等元数据辅助判断编码。
绕过扩展:用pdftotext提升稳定性和性能
适用于Linux服务器,且你有运维权限:
- 确认已安装:
apt-get install poppler-utils(Ubuntu/Debian)或yum install poppler-utils(CentOS); - 在Yii中安全调用(禁用用户输入直传):
$pdfPath = escapeshellarg(Yii::getAlias('@runtime/uploads/sample.pdf'));
$outputPath = Yii::getAlias('@runtime/tmp/output.txt');
exec("pdftotext -enc UTF-8 {$pdfPath} {$outputPath} 2>/dev/null");
$text = file_get_contents($outputPath);
优势:比php解析快5–10倍,对复杂排版(多栏、表格标题混排)识别更稳;缺点:无法运行在Windows共享主机或禁用exec的环境。
不建议走的路
— 不要用mPDF反向解析:mPDF是生成器,不是解析器,它无法从PDF中读取内容;
— 不要依赖yii2-pdf-parser类扩展:社区无主流维护版本,多数为简单封装,稳定性差、文档缺失、不兼容PHP 8+;
— 不要试图用file_get_contents读PDF二进制再正则匹配:PDF是二进制格式,文本对象被压缩、编码、交叉引用,不可靠且极易崩溃。



















