yii框架不内置pdf解析功能,需借助smalot/pdfparser等第三方库提取文本,并封装清洗逻辑(移除控制字符、统一空白、清理零宽字符等)于服务类中;中文乱码时可尝试iconv转码或改用pdftotext。

Yii 框架本身不内置 PDF 解析功能,需借助第三方库(如 smalot/pdfparser、setasign/fpdi 或 spipu/html2pdf 的配套工具)读取 PDF 文本内容;过滤无效字符则属于通用字符串清洗逻辑,与 Yii 无强耦合,但可在模型、行为或服务类中封装复用。
选择合适的 PDF 解析库并集成到 Yii 项目
推荐使用 smalot/pdfparser(轻量、纯 PHP、支持中文基础提取):
- 通过 Composer 安装:
composer require smalot/pdfparser - 在 Yii2 中可直接在控制器或服务类中使用,无需额外配置(它不依赖 Yii 组件)
- 注意:PDF 若为扫描件(图片型),该库无法提取文字,需先 OCR(如 Tesseract),此场景不适用
提取文本后过滤常见无效字符
PDF 解析出的文本常含换页符、多余空格、零宽空格(U+200B)、软连字符(U+00AD)、控制字符(如 U+0000–U+001F)等。建议统一清洗:
- 移除不可见控制字符:
preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u', '', $text) - 替换多种空白为单个空格:
preg_replace('/\s+/u', ' ', $text) - 清理零宽字符:
str_replace(["\xE2\x80\x8B", "\xE2\x80\x8C", "\xE2\x80\x8D", "\xC2\xAD"], '', $text)(UTF-8 编码下的常见零宽字符) - 可选:过滤掉纯符号段落(如仅含“——”、“***”、“■”等),按业务需求判断是否保留
在 Yii 模型或服务中封装解析与清洗逻辑
避免在控制器中写重复代码,推荐封装为独立服务类(如 PdfContentService):
- 接收 PDF 文件路径或二进制流
- 调用
smalot/pdfparser提取全部页面文本 - 对合并后的文本执行上述清洗规则
- 返回标准化字符串,供搜索、导入、校验等后续流程使用
- 可增加异常捕获(如文件损坏、编码异常),抛出 Yii 自定义异常便于统一处理
中文兼容性与编码注意事项
PDF 内嵌字体和编码方式多样,smalot/pdfparser 对 GBK/GB2312 编码的 PDF 支持有限,易出现乱码:
- 优先确保 PDF 为 UTF-8 编码生成(如由现代办公软件导出)
- 若遇到乱码,可尝试用
iconv('GBK', 'UTF-8//IGNORE', $rawText)尝试转码(需谨慎,可能丢失字符) - 更可靠的方式是改用
poppler-utils(Linux 命令行)配合pdftotext,再由 PHP 调用:exec("pdftotext -enc UTF-8 {$filePath} -", $output); $text = implode("\n", $output);











