Yii框架不内置PDF解析能力,需借助smalot/pdfparser等第三方库;推荐使用轻量纯PHP的pdfparser,通过Composer安装并注册为应用组件,调用parseFile()和getText()提取文本,注意扫描版PDF需OCR预处理。

Yii 框架本身不内置 PDF 内容解析能力,需借助第三方 PHP 库(如 smalot/pdfparser、setasign/fpdi 或 spipu/html2pdf 的反向工具)实现 PDF 文字提取。推荐使用轻量、纯 PHP、无需扩展依赖的 smalot/pdfparser,兼容 Yii 2 和 Yii 3。
安装 pdfparser 扩展并注册为 Yii 组件
在项目根目录执行:
composer require smalot/pdfparser
接着在 Yii 配置文件(config/web.php 或 config/main.php)中注册为应用组件:
'components' => [
'pdfParser' => [
'class' => 'smalot\PdfParser\Parser',
],
],
这样即可在任意地方通过 Yii::$app->pdfParser 调用解析器实例。
基础用法:读取 PDF 文本内容
在控制器或服务类中,按如下方式提取文字:
- 先用
file_get_contents()或上传后临时路径加载 PDF 二进制流 - 调用
parseFile()或parseContent()获取文档对象 - 遍历页面,用
getText()提取纯文本
示例代码:
$parser = Yii::$app->pdfParser;
$pdf = $parser->parseFile('/path/to/document.pdf');
$text = '';
foreach ($pdf->getPages() as $page) {
$text .= $page->getText() . "\n";
}
// $text 即为整份 PDF 的可读文本内容
注意事项与常见问题
- 扫描版 PDF 无法提取文字:pdfparser 只处理含文本图层的 PDF(即“可选中文字”的 PDF),对图片型 PDF 需先结合 OCR(如 Tesseract)识别,Yii 中需额外调用 shell 命令或封装 OCR SDK
-
中文乱码或缺失:部分 PDF 使用自定义字体映射,pdfparser 默认可能忽略。可尝试启用解码选项:
$parser->setOptions(['ignore_invalid_encoding' => true]) -
大文件内存溢出:解析超 50MB PDF 时建议设置 PHP 内存限制:
ini_set('memory_limit', '512M'); -
不支持表单/注释/加密 PDF:若 PDF 有密码保护,需先用其他工具解密;表单字段内容不会被
getText()返回
进阶:封装成 Yii 行为或服务类
为复用性考虑,可新建 common/services/PdfExtractor.php:
namespace common\services;
use smalot\PdfParser\Parser;
class PdfExtractor
{
public function extractText(string $filePath): string
{
$parser = new Parser();
$pdf = $parser->parseFile($filePath);
$text = '';
foreach ($pdf->getPages() as $page) {
$text .= trim($page->getText()) . "\n";
}
return trim($text);
}
}
然后在控制器中直接调用:
$extractor = new PdfExtractor(); $content = $extractor->extractText($uploadedFile->tempName);
更进一步,可配合 Yii 文件上传、事务、缓存等机制构建完整 PDF 内容处理流程。


















