Yii框架需借助smalot/pdfparser等第三方库实现PDF分页文本提取,关键步骤包括安装解析器、逐页获取UTF-8文本、处理中文乱码(启用unicode选项或检查字体嵌入)、封装服务类并调用,同时注意大文件限制与PDF类型兼容性测试。

Yii 框架本身不直接处理 PDF 文件,提取 PDF 分页文本需借助第三方 PHP PDF 解析库(如 smalot/pdfparser 或 setasign/fpdi + tcpdf),再在 Yii 应用中封装调用。关键在于:选对解析器、按页拆解、避免乱码、适配中文。
选用 pdfparser 实现分页文本提取
smalot/pdfparser 轻量、支持流式解析、对中文 PDF(含内嵌字体)兼容性较好,适合 Yii2/Yii3 中集成:
- 通过 Composer 安装:
composer require smalot/pdfparser - 在控制器或服务类中实例化解析器,加载 PDF 并逐页获取内容
- 注意设置 UTF-8 编码,部分 PDF 中文需手动处理字体映射或启用 Unicode 解析(依赖 PDF 内部编码规范)
Yii2 中封装分页提取服务
建议新建 services/PdfTextExtractor.php:
use Smalot\PdfParser\Parser;
class PdfTextExtractor
{
public function extractByPage($filePath): array
{
$parser = new Parser();
$pdf = $parser->parseFile($filePath);
$pages = $pdf->getPages();
$result = [];
foreach ($pages as $index => $page) {
// 获取纯文本(自动处理换行与空格合并)
$text = $page->getText();
// 可选:简单清洗(去除多余空白行、过滤控制字符)
$text = preg_replace('/\s+/', ' ', trim($text));
$result[$index + 1] = $text ?: '';
}
return $result;
}
}
在控制器中调用:$texts = Yii::$app->pdfExtractor->extractByPage('/path/to/file.pdf');,$texts[1] 即第一页文本。
处理中文乱码与字体缺失问题
若提取结果为方块、空格或乱码,大概率是 PDF 使用了未嵌入的中文字体或采用 CID 字符编码:
- 优先确认 PDF 是否嵌入字体:用 Adobe Acrobat → 文件 → 属性 → 字体,查看是否标注 “Embedded”
- pdfparser 默认尝试 Unicode 解码;若失败,可临时启用实验性解码:
$parser->setOptions(['unicode' => true]); - 对严重缺字 PDF,可结合
poppler-utils(Linux)的pdftotext命令行工具作为备选方案,在 PHP 中执行 shell 调用(需服务器支持且注意安全)
分页内容存入数据库或返回 API
提取后常需结构化存储或分页返回前端:
- 存库示例:每页建一条记录,含
pdf_id、page_number、content(TEXT 类型)、word_count - API 返回示例:
{"page": 3, "text": "第一章 引言……", "length": 248},配合分页参数?page=3&per_page=1 - 注意大文件限制:上传前校验 PDF 大小(如 ≤20MB),解析超时可设
set_time_limit(120)
不复杂但容易忽略细节:PDF 版本、加密状态、扫描件(非文本型)都会导致提取失败,上线前务必覆盖测试样本——含纯文本 PDF、带表格 PDF、含页眉页脚的中文报告 PDF。











