yii框架不提供pdf文本提取功能,需借助smalot/pdfparser等外部库实现;推荐使用smalot/pdfparser,支持文字型pdf直接提取及扫描件配合ocr处理,并建议封装为服务、添加缓存与异常处理。

Yii框架本身不提供PDF文本提取能力,它主要负责生成或导出PDF。要从PDF中获取文本内容,需借助外部PHP库(如smalot/pdfparser、setasign/fpdi搭配tcpdf,或spipu/html2pdf的逆向解析方案),并在Yii控制器或服务类中调用。
推荐用 smalot/pdfparser 提取纯文本
这是目前在Yii2/Yii3项目中最稳定、轻量、支持中文PDF文本抽取的开源库:
- 安装命令:
composer require smalot/pdfparser - 支持扫描型PDF(需配合OCR工具,如Tesseract)和文字型PDF;纯文字PDF可直接读取,无需额外依赖
- 在Controller中使用示例:
use Smalot\PdfParser\Parser; $pdfPath = Yii::getAlias('@webroot/uploads/invoice.pdf'); $parser = new Parser(); $pdf = $parser->parseFile($pdfPath); $text = $pdf->getText(); // 返回完整字符串,含换行和空格 - 注意:若PDF含加密或权限限制(如禁止复制),
getText()可能返回空或乱码,需先用qpdf或pdftk解密
处理中文PDF时的关键细节
中文PDF文本提取失败,往往不是库的问题,而是PDF自身结构导致:
- 字体未嵌入或使用非标准编码(如自定义 CID 字体)→ 解析后出现“□□□”或空字符串
- 文本被转为路径(即“曲线化文字”)→
pdfparser无法识别,必须走OCR流程 - 解决办法:
- 用 Adobe Acrobat 或在线工具检查PDF属性 → 确认“字体是否全部嵌入”“是否为可选中文搜索PDF”
- 对扫描件,集成 Tesseract(
thiagoalessio/tesseract_ocr)+ 图像预处理(intervention/image)做OCR识别 - 提取后建议用
mb_convert_encoding($text, 'UTF-8', 'auto')统一编码,再trim、preg_replace清理多余空白
避免在Yii中硬编码路径或重复IO
提取逻辑应封装成独立服务,便于复用和测试:
- 新建
services/PdfTextExtractor.php,注入FileHelper校验文件存在性与MIME类型 - 对大PDF(>10MB)加内存保护:用
ini_set('memory_limit', '512M')临时扩容,或分页提取($pdf->getPages()逐页调用getText()) - 缓存结果:将提取文本存入Redis或文件缓存,键名为
pdf_text_hash_'.md5_file($path),避免重复解析 - 异常统一捕获:
PdfParserException、RuntimeException需转为用户友好的提示,如“该PDF可能为图片格式,请上传文字版或联系管理员处理”
不推荐直接用 mPDF 或 TCPDF 反向提取
mPDF、TCPDF 是渲染型库,设计目标是“HTML → PDF”,没有内置文本抽取模块。强行用$mpdf->WriteHTML()加载PDF再试图读取,会报错或返回空——它们不解析PDF源结构,只生成PDF。
如果已有mPDF环境且仅需简单提取(如已知是标准文字PDF),可用其Output('S')输出原始流再交给pdfparser,但多此一举,不如直连解析器。











