Yii框架不内置PDF文字提取功能,需集成smalot/pdfparser或spatie/pdf-to-text等第三方库,在控制器或服务类中加载PDF并调用getText()提取文本,注意处理扫描版、加密、编码及排版等问题。

Yii 框架本身不提供 PDF 文字提取功能,需借助第三方 PHP 库(如 tcpdf、fpdi、smalot/pdfparser 或更推荐的 setasign/fpdi + setasign/fpdf 组合)来解析 PDF 并提取文本。核心思路是:在 Yii 控制器或服务类中加载 PDF 文件,调用解析库读取页面内容,再将原始文本结构化处理。
选择合适的 PDF 解析库
推荐使用 smalot/pdfparser(轻量、纯 PHP、支持文本提取)或 spatie/pdf-to-text(基于 poppler-utils 的命令行封装,准确率高但需服务器支持)。若项目已用 Composer 管理依赖,可直接安装:
- composer require smalot/pdfparser —— 适合纯 PHP 环境,无需外部工具,但对扫描版/加密 PDF 支持弱
- composer require spatie/pdf-to-text —— 需提前安装 pdftotext(poppler-utils 的一部分),识别质量好,支持 OCR 前置处理(需额外集成)
在 Yii 控制器中实现基础提取逻辑
以 smalot/pdfparser 为例,在控制器方法中读取上传或本地 PDF,提取全部文本:
- 先通过
UploadedFile::getInstance()获取用户上传的 PDF 文件 - 用
file_get_contents()或直接传路径初始化Smalot\PdfParser\Parser - 调用
$parser->parseFile($path)得到文档对象,再遍历每页调用$page->getText() - 合并所有页面文本后,可做 trim、去空行、UTF-8 编码校验等清洗处理
处理常见问题与限制
PDF 文本提取不是 100% 可靠,尤其遇到以下情况需额外应对:
- 扫描版 PDF:本质是图片,必须先走 OCR(如 Tesseract + imagick),Yii 中可调用 shell_exec('tesseract xxx.pdf stdout'),但需确保环境已部署 OCR 工具
-
加密 PDF:smalot/pdfparser 默认不支持解密;若知密码,可用
$parser->setPassword($password)尝试 - 中文字体缺失或编码异常:确保 PDF 内嵌字体,或在解析后强制指定 UTF-8 输出,并用 mb_convert_encoding 清理乱码
- 表格/多栏排版错乱:原生 getText() 返回的是流式文本,无布局信息;如需结构化,得结合坐标解析(如用 setasign/fpdi + setasign/tcpdf 提取位置)或改用 PDF.js 前端解析方案
封装为 Yii 服务提高复用性
把解析逻辑抽成独立服务类(如 app\services\PdfTextExtractor),注入到控制器或命令行任务中:
- 构造函数接收解析器实例或配置项(如是否启用 OCR、默认编码、超时时间)
- 提供
extract(string $filePath, array $options = [])方法,返回标准化数组:['text' => '...', 'page_count' => 5, 'error' => null] - 配合 Yii 日志组件记录失败详情,便于排查字体缺失、权限不足等问题











