yii框架需借助smalot/pdfparser等第三方库提取pdf文本,该库轻量、纯php、支持中文(需确保字体utf-8编码),不支持扫描版;示例代码展示单页/全文提取及简单结构化处理,yii2/yii3集成方式一致,注意异常捕获与内存限制。

Yii框架本身不内置PDF内容提取功能,需借助第三方PHP类库(如 Smalot/PdfParser 或 setasign/Fpdi + TCPDF 组合)来实现。推荐使用轻量、维护活跃、支持中文(需注意编码)的 Smalot/PdfParser,它纯PHP实现,无需扩展依赖,适配Yii2/Yii3项目。
安装 Smalot/PdfParser 并集成到 Yii2
在项目根目录执行:
composer require smalot/pdfparserYii2中可直接在控制器或服务类中使用,无需额外注册组件(除非需全局复用)。示例代码如下:
- 确保PDF文件路径可读(如上传后暂存于
@runtime/pdf/) - 中文内容提取前建议确认PDF内嵌字体是否支持UTF-8,否则可能乱码
- 该库对扫描版PDF(图片型)无效,仅解析文本型PDF
基础文本提取:单页与全文
以下为 Yii2 Controller 中的实操代码片段(以 SiteController 为例):
use Smalot\PdfParser\Parser;
public function actionExtractPdf()
{
$pdfPath = \Yii::getAlias('@runtime/pdf/sample.pdf');
if (!file_exists($pdfPath)) {
throw new \yii\web\HttpException(404, 'PDF file not found.');
}
$parser = new Parser();
$pdf = $parser->parseFile($pdfPath);
// 提取全部文本(自动合并所有页)
$fullText = $pdf->getText();
// 或逐页提取,便于分段处理
$pages = $pdf->getPages();
$texts = [];
foreach ($pages as $page) {
$texts[] = $page->getText();
}
return $this->asJson([
'status' => 'success',
'total_pages' => count($pages),
'full_text' => trim($fullText),
'per_page' => $texts,
]);
}
提取结构化内容:标题、表格区域(需配合逻辑判断)
Smalot/PdfParser 不直接识别标题/表格,但可通过文本特征做简单规则提取:
- 按行分割
$page->getText()结果,用正则匹配“第[零一二三四五六七八九十]+章”、“1.1 ”、“【摘要】”等模式 - 若PDF由Word导出且格式规范,可基于换行符和缩进估算段落层级
- 表格内容通常有固定空格/制表符分隔,可用
preg_split('/\s{2,}/u', $line)粗略切分(复杂表格仍需专用库如tabula-java配合命令行调用)
Yii3 中的用法差异与注意事项
Yii3 使用 PSR-4 自动加载,集成方式一致。但需注意:
- 命名空间引入写法不变:
use Smalot\PdfParser\Parser; - 若启用严格类型(strict types),确保传入
parseFile()的是字符串路径,非SplFileInfo - 生产环境建议加 try-catch,捕获
Smalot\PdfParser\Exception\ParserException - 大文件(>50MB)可能触发内存限制,可在 action 开头设置:
ini_set('memory_limit', '512M');











