Yii不内置PDF解析能力,需用smalot/pdfparser等第三方库提取文本;须确保PDF含可复制文字、使用绝对路径、检查文件可读性,并注意扫描件、排版、字体及内存限制问题。

Yii 本身不内置 PDF 内容解析能力,读取 PDF 文本需借助第三方 PHP 库(如 smalot/pdfparser 或 setasign/fpdi + tcpdf 组合),不能直接用 file_get_contents() 获取可读文字——那只会得到二进制或乱码。核心思路是:用专用解析器打开 PDF 文件,提取其文本层(前提是 PDF 含可选文字内容,非纯扫描图)。
使用 smalot/pdfparser 解析本地 PDF 文本
这是最轻量、专为文本提取设计的库,兼容 Yii2,支持中文(需 PDF 自身含 Unicode 字符映射)。
- 安装依赖:
composer require smalot/pdfparser - 确保 PDF 是“可复制文本”的(非图片型 PDF),否则返回空字符串
- 文件路径必须为服务器绝对路径(如
Yii::getAlias('@webroot/uploads/report.pdf')),不能传 URL 或相对路径
控制器中读取 PDF 文本的完整示例
以下代码放在控制器方法中(如 SiteController::actionReadPdf()),假设 PDF 存于 @webroot/uploads/sample.pdf:
use yii\web\Controller;
use Smalot\PdfParser\Parser;
class SiteController extends Controller
{
public function actionReadPdf()
{
$pdfPath = Yii::getAlias('@webroot/uploads/sample.pdf');
// 检查文件是否存在且可读
if (!is_file($pdfPath) || !is_readable($pdfPath)) {
throw new \yii\web\HttpException(404, 'PDF 文件不存在或不可读');
}
try {
$parser = new Parser();
$pdf = $parser->parseFile($pdfPath);
$text = $pdf->getText(); // 提取全部文本(含换行和空格)
// 可选:清理多余空白,适配前端显示
$cleanText = preg_replace('/\s+/', ' ', trim($text));
return $this->asJson(['success' => true, 'content' => $cleanText]);
} catch (\Exception $e) {
return $this->asJson(['success' => false, 'error' => $e->getMessage()]);
}
}
}
注意事项与常见问题
该方案不是万能的,需注意以下限制:
-
扫描件 PDF 无法提取文字:若 PDF 是拍照/OCR 前的图片,
getText()返回空,需先调用 OCR 服务(如 Tesseract)转成文字 - 表格和多栏排版会错乱:PDFParser 按字符流顺序提取,不保留原始布局;复杂结构建议导出为 HTML 后再解析
- 中文支持依赖 PDF 内嵌字体:若 PDF 使用了未嵌入的中文字体,可能显示为方块或乱码;可用 Adobe Acrobat 检查“文档属性 → 字体”确认
-
大文件慎用:解析百页以上 PDF 可能超内存;建议加
ini_set('memory_limit', '256M');或分页处理
替代方案:仅需展示 PDF(不读内容)
如果目标只是让用户在线查看而非提取文字,直接用 Yii 的 sendFile() 更安全高效:
return Yii::$app->response->sendFile($filePath, 'report.pdf', [
'mimeType' => 'application/pdf',
'inline' => true // 浏览器内联显示,非下载
]);



















