yii框架需借助第三方库(如smalot/pdfparser)提取pdf文本,再用正则清理空白;扫描版pdf需ocr,加密pdf需密码,亦可调用pdftotext提升准确率。

Yii框架本身不直接提供PDF文本提取功能,需借助第三方PHP库(如 smalot/pdfparser 或 setasign/fpdi + tcpdf)来解析PDF内容。获取文本后,去除多余空格(包括换行、制表、连续空格等),可用PHP原生函数处理。
使用 smalot/pdfparser 提取并清理文本
该库轻量、兼容性好,适合纯文本提取场景:
- 通过 Composer 安装:
composer require smalot/pdfparser - 在 Yii 控制器或服务类中使用:
// 假设 $pdfPath 是 PDF 文件绝对路径
use Smalot\PdfParser\Parser;
$parser = new Parser();
$pdf = $parser->parseFile($pdfPath);
$text = $pdf->getText(); // 获取原始文本(含换行/空格)
// 去除首尾空白,合并连续空白符为单个空格,并 trim
$cleanText = preg_replace('/\s+/', ' ', trim($text));
// 若需完全去除所有空白(包括单词间空格),用:
// $cleanText = str_replace([' ', "\t", "\n", "\r", "\0", "\x0B"], '', $text);
echo $cleanText;
在 Yii2 中封装为可复用方法
推荐将逻辑抽离为独立工具类(如 app\components\PdfTextExtractor):
- 自动处理文件不存在、解析失败等异常
- 支持传入选项:是否保留段落换行、是否压缩空格、是否转小写等
- 返回标准化字符串,便于后续搜索或存入数据库
注意 PDF 内容限制
不是所有PDF都能提取文本:
- 扫描版PDF(图片型)无文字层,
pdfparser返回空字符串 —— 需结合 OCR(如 Tesseract) - 加密PDF需先解密(库支持密码参数,但需知道密码)
- 部分字体嵌入不全可能导致乱码,建议解析后做简单编码检查(如 mb_detect_encoding)
替代方案:调用命令行工具 pdftotext(Linux/macOS)
若服务器环境允许,pdftotext(Poppler 工具集)准确率更高:
- 安装:
sudo apt install poppler-utils(Ubuntu) - Yii 中执行:
$pdfPath = '/path/to/file.pdf';
$txtPath = sys_get_temp_dir() . '/temp_' . uniqid() . '.txt';
exec("pdftotext -enc UTF-8 '{$pdfPath}' '{$txtPath}' 2>/dev/null");
$rawText = file_exists($txtPath) ? file_get_contents($txtPath) : '';
$cleanText = preg_replace('/\s+/', ' ', trim($rawText));
@unlink($txtPath); // 清理临时文件











