Yii 不内置 PDF 文本提取能力,需依赖第三方工具:推荐服务端用 pdftotext 命令(准确率高、支持密码),轻量场景可用 smalot/pdfparser(无系统依赖但不支持 OCR),禁用 mpdf 反向渲染;扫描件须走 tesseract 或云 OCR。

Yii 本身不内置 PDF 文本提取能力,它依赖第三方库(如 smalot/pdfparser、setasign/fpdi 配合 tcpdf 解析,或更现代的 spipu/html2pdf + pdf-to-text CLI 工具)。但纯 PHP 实现高质量 PDF 文本提取在 Yii 中并不推荐——PDF 是布局格式,不是文本容器,尤其含扫描件、加密、嵌入字体、横向表格时,纯代码解析极易漏字、乱序、崩格式。
实际项目中,应分场景选择合适方案:
直接调用系统命令提取(最稳,推荐用于服务端可信环境)
Linux/macOS 下安装 pdftotext(poppler-utils)后,PHP 可安全调用:
// 在 controller 或 service 中
$pdfPath = '@app/runtime/uploads/invoice.pdf';
$realPath = \Yii::getAlias($pdfPath);
if (!file_exists($realPath)) {
throw new \Exception('PDF 文件不存在');
}
// 执行 pdftotext 命令(-layout 保留原始换行和空格对齐)
$output = '';
$returnCode = 0;
exec('pdftotext -layout -enc UTF-8 ' . escapeshellarg($realPath) . ' - 2>/dev/null', $output, $returnCode);
if ($returnCode !== 0) {
throw new \Exception('PDF 文本提取失败,请检查 pdftotext 是否已安装');
}
$text = implode("\n", $output);
// $text 就是提取出的纯文本,可进一步 trim、split、正则匹配字段✅ 优势:准确率高、支持密码保护(加 -password xxx)、能处理多数印刷体 PDF
⚠️ 注意:需服务器启用 exec(),且禁用用户可控的 $pdfPath(防命令注入)
使用 PHP 库 smalot/pdfparser(纯 PHP,适合轻量需求)
安装:
composer require smalot/pdfparser
使用示例:
use Smalot\PdfParser\Parser;
$pdfParser = new Parser();
try {
$pdf = $pdfParser->parseFile(\Yii::getAlias('@app/runtime/uploads/sample.pdf'));
$text = $pdf->getText(); // 自动合并所有页文本
} catch (\Exception $e) {
\Yii::error('PDF 解析异常: ' . $e->getMessage());
$text = '';
}✅ 优势:无系统依赖、可集成进 Yii 生命周期
❌ 局限:对含图像 OCR 的 PDF 完全无效;复杂表格/多栏排版易丢失顺序;中文需确保 PDF 内嵌字体编码正确(否则返回空或乱码)
不要这样做:用 mpdf / dompdf 反向“渲染再取 text”
mpdf 是生成 PDF 的库,不是解析器。试图用 $mpdf->WriteHTML(...) 再读取输出流来“还原文本”,逻辑错误、不可靠,且性能极差。
进阶建议:结合 Elasticsearch 或专用 OCR 服务
- 若需搜索大量 PDF 内容 → 用 Elasticsearch +
ingest-attachment插件(见知识库中 ES 7.15 配置) - 若含扫描件/手写体 → 必须走 OCR,推荐调用本地
tesseractCLI:tesseract invoice.pdf stdout -l chi_sim+eng
或对接云 API(百度 OCR、腾讯云 TI-ONE)
基本上就这些。提取 PDF 纯文本不是 Yii 框架层问题,而是数据源预处理环节,选对工具比写多少 Yii 代码都关键。


















