Yii框架不内置PDF解析能力,需借助Smalot/PdfParser等第三方库;安装后可在控制器中解析本地PDF文本,注意处理中文乱码、分页提取、大文件性能及用户上传安全风险。

Yii 框架本身不内置 PDF 内容解析能力,读取本地 PDF 文件文本需借助第三方 PHP 库(如 Smalot/PdfParser 或 setasign/Fpdi + TCPDF 组合),其中 Smalot/PdfParser 更轻量、专注文本提取,适合大多数读取需求。
安装 PdfParser 扩展
在 Yii 项目根目录执行:
composer require smalot/pdfparser
安装后自动注册到 Composer 自动加载机制,Yii2 中可直接 new 实例使用。
在控制器中读取本地 PDF 文本
假设 PDF 文件位于 @app/files/sample.pdf,在控制器(如 SiteController)中添加方法:
// SiteController.php
use Smalot\PdfParser\Parser;
public function actionReadPdf()
{
$pdfPath = \Yii::getAlias('@app/files/sample.pdf');
if (!file_exists($pdfPath)) {
throw new \yii\web\HttpException(404, 'PDF 文件不存在');
}
try {
$parser = new Parser();
$pdf = $parser->parseFile($pdfPath);
$text = $pdf->getText(); // 获取全部页面纯文本(含换行与空格)
return $this->render('pdf-content', ['content' => $text]);
} catch (\Exception $e) {
\Yii::error('PDF 解析失败:' . $e->getMessage());
throw new \yii\web\HttpException(500, '无法读取 PDF 内容');
}
}
处理多页/分页/编码问题的实用建议
-
按页提取:用
$pdf->getPages()获取页对象数组,再对每页调用$page->getText(),便于分页展示或高亮定位 -
中文乱码常见原因:PdfParser 默认不嵌入字体映射,若 PDF 使用非标准中文字体且未正确嵌入,可能返回空或乱码;建议优先测试已明确嵌入字体的 PDF,或改用支持 TrueType 映射的方案(如结合
tcpdf+fpdi渲染后再 OCR,但成本高) - 性能注意:大文件(>10MB 或 >100页)解析较慢,建议加缓存(如将解析结果存入 Redis 或文件缓存),避免每次请求重复解析
- 安全提醒:不要直接解析用户上传的 PDF —— 需校验 MIME 类型、限制大小、隔离存储路径,并考虑沙箱环境,防止恶意 PDF 触发解析器漏洞
视图中简单展示内容(pdf-content.php)
为提升可读性,可做基础格式处理:
<pre class="brush:php;toolbar:false;" style="white-space: pre-wrap; word-break: break-word; font-size: 14px;">
<?php echo htmlspecialchars($content); ?>
htmlspecialchars 防止 PDF 中意外含 HTML 标签造成 XSS;white-space: pre-wrap 保留原文换行与空格,更贴近原始排版逻辑。











