yii框架不直接支持pdf文本提取,需借助smalot/pdfparser等第三方库,通过解析pdf结构提取纯文本,但不支持扫描版或密码保护pdf,处理上传文件时需临时保存并清理,注意中文编码与安全校验。

Yii 框架本身不直接提供 PDF 文本提取功能,需借助第三方 PHP 库(如 smalot/pdfparser 或 setasign/fpdi + setasign/tcpdf 的组合)来解析 PDF 并提取文本内容。核心思路是:读取 PDF 文件 → 解析其结构 → 提取可读文本 → 转为字符串。
使用 smalot/pdfparser 提取文本(推荐)
这是目前最轻量、兼容性较好、专为文本提取设计的开源库,支持大多数标准 PDF(不含复杂加密或图像OCR)。
- 通过 Composer 安装:
composer require smalot/pdfparser - 在 Yii 控制器或服务类中加载并解析:
$parser = new \Smalot\PdfParser\Parser();
$pdf = $parser->parseFile('/path/to/document.pdf');
$text = $pdf->getText(); // 直接返回纯文本字符串
// 或逐页获取:
// $pages = $pdf->getPages();
// $text = '';
// foreach ($pages as $page) { $text .= $page->getText(); }
?>
注意:该库无法处理扫描版 PDF(即图片型 PDF),也不支持密码保护文档(除非先解密)。
处理上传的 PDF 文件(Yii 表单场景)
若用户通过 Yii 表单上传 PDF,需先保存临时文件再解析:
- 使用
$model->file->saveAs($tempPath)保存上传文件 - 确保
$tempPath可读,且后缀为.pdf - 调用 pdfparser 解析后,建议
unlink($tempPath)清理临时文件 - 若需支持中文,确认 PDF 内嵌字体含中文字形(否则可能乱码或空白);部分情况下需配合
mb_convert_encoding()做编码适配
应对常见问题的补充建议
-
空文本或乱码:检查 PDF 是否为扫描件(需 OCR 工具如 Tesseract);或尝试用
$pdf->getDetails()查看元信息,确认是否含文本层 -
内存溢出:大文件建议设置
ini_set('memory_limit', '512M'),或改用流式解析(pdfparser 支持分页加载) -
Yii2 中封装为组件:可新建
components/PdfTextExtractor.php,封装 parser 实例与异常处理,便于多处复用 -
安全提示:勿直接解析用户上传的 PDF 执行任意操作,应校验 MIME 类型(
application/pdf)、限制文件大小(如 ≤20MB)、禁用危险对象(如 JavaScript)
不复杂但容易忽略:PDF 文本提取本质是“逆向还原排版逻辑”,结果受原始 PDF 生成方式影响很大。测试时务必覆盖不同来源的 PDF(Word 导出、浏览器打印、设计软件导出等)。











