Yii本身不内置PDF文本提取功能,需借助smalot/pdfparser等第三方库;核心流程为PHP后端读取PDF→解析器提取文本→控制器返回结构化JSON结果,支持按页拆分、异常捕获及中文处理。

Yii本身不内置PDF文本提取功能,需借助第三方库(如smalot/pdfparser或setasign/fpdi搭配tcpdf)完成解析。核心思路是:PHP后端读取PDF文件→调用解析器提取纯文本→在Yii控制器中返回结构化结果。下面给出可直接运行的完整实操路径。
一、安装PDF解析依赖
推荐使用轻量、稳定、支持中文的smalot/pdfparser(基于PHP原生实现,无需扩展):
- 执行命令安装:
composer require smalot/pdfparser - 确保PDF文件编码为UTF-8或含中文字体嵌入(否则中文可能乱码或为空)
- 若处理扫描版PDF(图片型),此库无法识别——需先用OCR工具(如
MinerU或tesseract)转为可搜索PDF
二、编写Yii控制器方法
在controllers/PdfController.php中添加:
use Smalot\PdfParser\Parser;
public function actionExtractText()
{
$filePath = '@app/uploads/sample.pdf'; // 替换为实际路径
if (!file_exists(Yii::getAlias($filePath))) {
throw new \yii\web\HttpException(404, 'PDF文件不存在');
}
try {
$parser = new Parser();
$pdf = $parser->parseFile(Yii::getAlias($filePath));
$text = $pdf->getText(); // 提取全部页面文本(含换行与空格)
// 可选:按页拆分
$pages = [];
foreach ($pdf->getPages() as $i => $page) {
$pages[] = [
'page' => $i + 1,
'text' => trim($page->getText())
];
}
return $this->asJson([
'success' => true,
'pages' => $pages,
'total' => count($pages),
'preview' => mb_substr($text, 0, 200, 'UTF-8') . '...'
]);
} catch (\Exception $e) {
return $this->asJson([
'success' => false,
'error' => $e->getMessage()
]);
}
}
三、前端调用与展示示例
在视图中用AJAX请求该接口,并渲染结果:
- 确保PDF已上传至
@app/uploads/目录(生产环境建议校验MIME类型和大小) - 返回的
pages数组可直接用于Vue/React渲染分页预览,或送入全文检索(如Elasticsearch) - 如需保留原始段落结构,避免
getText()的过度合并,可改用$page->getDetails()['content']获取原始PDF操作符流(需自行解析BT/ET块)
四、常见问题与绕过技巧
遇到提取失败时,优先检查以下几点:
-
加密PDF:若报“Cannot parse encrypted PDF”,需先解密——可用
yii2tech/balance组件中的加密工具辅助,或用qpdf --decrypt命令行预处理 -
表格/图文混排丢失:
pdfparser不还原布局,仅提取字符流。如需结构化表格,应改用tabula-javaCLI封装或MinerU(专为中文PDF设计,支持多栏、公式、页眉页脚分离) -
性能瓶颈:大文件(>50MB)建议异步处理+队列(如Yii的
yii\queue),并加超时限制(set_time_limit(120))



















