yii不内置pdf文字提取功能,需用smalot/pdfparser等第三方库;推荐轻量纯php的pdfparser,安装后可直接在yii2/yii3中解析文本,但需注意中文乱码、扫描版pdf、大文件及安全校验问题。

Yii 本身不内置 PDF 文字提取功能,需借助第三方 PHP 库(如 Smalot/PdfParser 或 setasign/Fpdi + TCPDF 组合)完成解析。推荐使用轻量、维护活跃、纯 PHP 实现的 Smalot/PdfParser,它无需系统级依赖(如 pdftotext 或 Poppler),兼容 Yii2 和 Yii3。
安装 PdfParser 扩展
在项目根目录执行:
composer require smalot/pdfparser
安装后即可在控制器或服务类中直接 use 使用,无需额外配置。
在 Yii2 控制器中提取 PDF 文字
以下为可直接运行的示例代码(假设放在 SiteController.php 中):
// use Smalot\PdfParser\Parser;
public function actionExtractPdf()
{
$pdfPath = '@app/uploads/sample.pdf'; // 确保路径存在且可读
$realPath = Yii::getAlias($pdfPath);
if (!is_file($realPath)) {
throw new \yii\web\HttpException(404, 'PDF 文件不存在');
}
try {
$parser = new Parser();
$pdf = $parser->parseFile($realPath);
$text = $pdf->getText(); // 提取全部页面的纯文本(含换行与空格)
// 可选:按页拆分
$pages = $pdf->getPages();
$textsByPage = [];
foreach ($pages as $i => $page) {
$textsByPage[$i] = $page->getText();
}
return $this->asJson([
'success' => true,
'content' => trim($text),
'pages' => $textsByPage,
]);
} catch (\Exception $e) {
return $this->asJson([
'success' => false,
'error' => $e->getMessage(),
]);
}
}
处理常见问题的实用建议
-
中文乱码? PdfParser 默认不处理字体映射,若 PDF 内嵌字体未正确声明或含 CID 字体(常见于中文 PDF),
getText()可能返回空或乱码。此时需配合$page->getDetails()查看原始字符编码,或改用支持 TrueType/CID 的方案(如调用系统pdftotext -enc UTF-8命令,需服务器允许 exec)。 - 扫描版 PDF? PdfParser 仅解析文本图层,对图片型 PDF(即扫描件)完全无效。必须先用 OCR 工具(如 Tesseract)识别,再集成到 Yii 中 —— 这属于另一技术栈,不可跳过。
-
大文件卡顿? 解析过程是内存敏感型操作。建议限制上传 PDF 大小(如 ≤5MB),并在
php.ini中适当调高memory_limit和max_execution_time。 -
安全注意:不要直接解析用户上传未校验的 PDF。务必检查 MIME 类型(
finfo_file)、扩展名、文件头(以%PDF-开头),并置于非 Web 可访问目录。
Yii3 中的等效写法(简要说明)
Yii3 使用 PSR-4 自动加载,用法几乎一致:
use Smalot\PdfParser\Parser; // 在 action 或 Service 中 $parser = new Parser(); $pdf = $parser->parseFile($path); $text = $pdf->getText();
只需确保 composer install 已执行,且命名空间引入正确。











