yii框架不支持pdf读取,需用smalot/pdfparser等第三方库手动集成;该库仅提取可选文本(非扫描件),中文正常依赖内嵌字体,不支持格式信息,应封装为service复用。

Yii框架本身不提供PDF内容读取能力,需借助第三方PHP库(如smalot/pdfparser、setasign/fpdi或spipu/html2pdf的逆向解析模块),但要注意:这些库不是Yii原生扩展,也**不支持直接“调用Yii扩展”来读取PDF文本**——必须手动集成并处理底层解析逻辑。
推荐方案:用 smalot/pdfparser 解析PDF文字
这是目前最轻量、兼容性好、专注文本提取的开源库,适合在Yii中嵌入使用:
- 安装命令:
composer require smalot/pdfparser - 在Controller或Service中引入:
use Smalot\PdfParser\Parser; - 读取本地PDF文件(路径必须为绝对路径):
$parser = new Parser();<br> $pdf = $parser->parseFile(Yii::getAlias('@webroot/uploads/sample.pdf'));<br> $text = $pdf->getText(); // 返回纯文本内容 - 若PDF含多页,可遍历获取每页文本:
foreach ($pdf->getPages() as $page) { echo $page->getText(); }
注意中文乱码与扫描件限制
该库只能提取“可选中文本”的PDF(即由Word/Excel导出、非扫描图片型PDF):
- 如果PDF是扫描件(本质是图片),
pdfparser返回空字符串或乱码,此时需OCR方案(如Tesseract + imagick),不属于Yii扩展范畴 - 中文显示正常依赖PDF内嵌字体;若原文档未嵌入中文字体,
getText()可能缺失或错位,无法通过Yii配置修复 - 不支持提取表格结构、样式、页眉页脚等格式信息,仅适用于“提取正文关键词”“做简易全文检索”等场景
避免常见错误操作
别误用导出类库反向读取:
-
yii2-export、yii2-mpdf、html2pdf全是生成PDF的工具,不能用来读取PDF内容 - 不要尝试用
file_get_contents()直接读PDF二进制再json_decode——PDF不是JSON,会得到不可读乱码 - 不要在视图层(View)里写PDF解析逻辑,应封装到Service或Helper类中,保持MVC职责清晰
简单封装成Yii服务供复用
可在@common/components/PdfReader.php中创建一个可复用的服务类:
- 构造方法检查文件是否存在且可读:
is_file($path) && is_readable($path) - 添加超时控制(大PDF解析慢):
set_time_limit(60) - 返回结构化结果,例如:
['success' => true, 'text' => $text, 'page_count' => count($pdf->getPages())] - 在Controller中调用:
$result = Yii::createObject(PdfReader::class)->read(Yii::getAlias('@runtime/pdfs/invoice.pdf'));











