Yii框架需借助smalot/pdfparser等第三方库解析PDF文本;示例中通过Parser类读取文件并调用getText()提取纯文本,支持上传流直接解析,但不适用于扫描件PDF。

Yii 框架本身不内置 PDF 内容解析功能,读取 PDF 文字需借助第三方 PHP 库(如 smalot/pdfparser 或 setasign/fpdi + setasign/fpdf 的组合),其中 smalot/pdfparser 更适合纯文本提取。下面以 Yii2 为例,给出在控制器中读取 PDF 文件内容并赋值给变量的简洁、可运行示例。
1. 安装 PDF 解析库(推荐 smalot/pdfparser)
在项目根目录执行:
composer require smalot/pdfparser
安装后 Composer 会自动加载类,无需手动注册(Yii2 默认已启用 autoload)。
2. 在控制器中读取 PDF 并提取文本到变量
假设 PDF 文件路径为 @app/runtime/uploads/sample.pdf,在控制器方法中写:
// 控制器 action 示例
use Smalot\PdfParser\Parser;
public function actionReadPdf()
{
$pdfPath = \Yii::getAlias('@app/runtime/uploads/sample.pdf');
if (!file_exists($pdfPath)) {
throw new \yii\web\HttpException(404, 'PDF 文件不存在');
}
try {
$parser = new Parser();
$pdf = $parser->parseFile($pdfPath);
$text = $pdf->getText(); // ✅ 全文纯文本内容(含换行和空格)
// $text 现在就是你要的变量,可直接使用、返回或处理
\Yii::info('PDF 提取成功,长度:' . strlen($text), __METHOD__);
return $this->asJson(['success' => true, 'content' => $text]);
} catch (\Exception $e) {
\Yii::error('PDF 解析失败:' . $e->getMessage(), __METHOD__);
return $this->asJson(['success' => false, 'error' => $e->getMessage()]);
}
}
3. 注意事项与常见问题
- 仅支持文本型 PDF:若 PDF 是扫描件(图像型),smalot/pdfparser 无法识别文字,需先用 OCR(如 Tesseract)处理;
-
编码与乱码:部分 PDF 使用自定义字体编码,
getText()可能返回乱码或空字符串,可尝试$pdf->getDetails()或逐页解析调试; -
大文件内存限制:超大 PDF(>50MB)可能触发内存溢出,建议设置
ini_set('memory_limit', '256M');或分页提取; -
中文支持:该库对 UTF-8 中文基本友好,但若 PDF 内嵌字体未正确映射,仍可能丢失字符——可配合
$pdf->getPages()手动遍历每页调试。
4. 进阶:从上传流直接解析(不保存临时文件)
如果 PDF 来自用户上传且不想落盘,可用如下方式:
$uploadedFile = \yii\web\UploadedFile::getInstanceByName('pdf_file');
if ($uploadedFile && $uploadedFile->type === 'application/pdf') {
$content = file_get_contents($uploadedFile->tempName);
$parser = new Parser();
$pdf = $parser->parseContent($content); // ⚡ 直接解析二进制流
$text = $pdf->getText();
}











