Yii不提供PDF文本提取功能,需借助TCPDF+pdf-parser、Poppler的pdftotext或Apache Tika等外部工具,在Yii中封装安全调用逻辑并处理扫描件、编码、超时等实际问题。

Yii本身不提供PDF文本提取能力,它是一个Web应用框架,不是文档处理库。要从PDF中提取文字,必须借助外部PHP扩展或命令行工具,并在Yii项目中封装调用逻辑。
核心依赖:选对底层工具
PHP原生无法解析PDF文本,需引入可靠第三方支持:
- 推荐首选 TCPDF + pdf-parser(纯PHP):轻量、无系统依赖,适合中小PDF;但对扫描件、复杂排版支持弱
-
更稳方案:Poppler 工具集(pdftotext):Linux/macOS下通过
exec('pdftotext -layout input.pdf -')调用,精度高、兼容好,需服务器预装 - 企业级场景:Apache Tika(Java服务):通过HTTP调用Tika Server API,支持PDF/Word/Excel等多格式,适合混合文档系统
在Yii控制器中安全调用pdftotext
假设已安装pdftotext(Poppler套件),且PDF文件存在@webroot/uploads/report.pdf:
- 先用
Yii::getAlias('@webroot') . '/uploads/report.pdf'拼出绝对路径 - 严格校验文件存在、可读、且后缀为.pdf(防路径穿越)
- 执行命令并捕获输出:
$text = trim(exec("pdftotext -layout " . escapeshellarg($filePath) . " - 2>/dev/null")); - 若返回为空,检查
exec是否被禁用(查看disable_functions)、权限是否足够
封装成可复用的服务类
避免在控制器里写重复逻辑,建议新建services/PdfTextExtractor.php:
- 构造方法注入
pdftotext路径(便于测试/切换) - 提供
extract(string $filePath): string方法,内置超时(proc_open更安全)和错误码判断 - 对提取结果做基础清洗:合并换行符、过滤多余空格、移除页眉页脚关键词(如“第 X 页”可正则剔除)
- 返回前可缓存到
@runtime/pdf-text/目录,按文件MD5命名,避免重复解析
注意事项与避坑点
PDF文本提取不是“开箱即用”的功能,实际落地要注意:
- 扫描型PDF(图片PDF)完全无法提取——必须先OCR,可集成Tesseract,但Yii不直接参与,只调度
- 中文支持依赖pdftotext编译时是否启用Unicode支持;若乱码,加参数
-enc UTF-8 - 大文件(>50MB)可能超时或内存溢出,应设
set_time_limit(120)并分页处理(pdftotext支持-f 1 -l 10) - 不要把用户上传的原始PDF路径直接拼进shell命令,必须用
escapeshellarg()或白名单校验
不复杂但容易忽略。关键不在Yii,而在选对工具链、封好边界、控住风险。



















