smalot/pdfparser是Yii项目中提取PDF文本的首选方案,纯PHP实现、无需扩展依赖,支持元数据提取与多页文本获取,但不支持扫描件OCR和加密PDF。

Yii 是一个 PHP 框架,本身不内置 PDF 解析能力,也没有官方 PDF 解析组件。所以“Yii 怎么解析 PDF 提取文本”这个问题,核心不在 Yii,而在于你选用的底层 PDF 处理库——Yii 只负责调用和组织逻辑。
Yii 项目中常用 PDF 文本提取方案
实际开发中,Yii(2.x 或 3.x)通常通过以下成熟 PHP 库来完成 PDF 文本提取,无需自己写 OCR 或布局分析源码:
- tcpdf:侧重生成 PDF,不推荐用于提取(无 extract_text 方法)
- smalot/pdfparser:轻量、纯 PHP 实现,适合原生 PDF(非扫描件),支持元数据+基础文本提取
- setasign/fpdi-tcpdf + pdfparser 组合:用于带加密或需先解密再读取的场景
- spipu/html2pdf 不适用——这是生成工具,不是解析器
最实用的代码示例(基于 smalot/pdfparser)
在 Yii2 中,推荐用 smalot/pdfparser,它稳定、无扩展依赖、支持中文(只要 PDF 内嵌字体)。安装方式:
composer require smalot/pdfparser
在控制器中使用(如 SiteController.php):
use Smalot\PdfParser\Parser;
public function actionExtractText()
{
$pdfPath = '@app/web/uploads/report.pdf';
if (!file_exists($pdfPath)) {
throw new \yii\web\HttpException(404, 'PDF 文件不存在');
}
$parser = new Parser();
$pdf = $parser->parseFile($pdfPath);
$text = $pdf->getText(); // 自动遍历所有页,返回纯文本字符串
return $this->asJson(['success' => true, 'text' => trim($text)]);
}
注意:$pdf->getText() 已内部处理多页、编码、空行合并等,无需手动循环 pages。
扫描版 PDF?PHP 生态基本不直接支持
如果 PDF 是图片型(如手机拍照转的 PDF),smalot/pdfparser 会返回空——因为它不带 OCR 功能。此时必须换技术栈:
- PHP 调用系统级 OCR 工具(如
tesseract+pdftoppm):先转图再识别,配置复杂、性能低、中文效果一般 - 更推荐:用 Yii 做接口层,后端交给 Python 服务(如 PDF-Parser-1.0 或 pdfplumber)处理,PHP 只负责上传和结果中转
- 不建议在 Yii 里硬写 OCR 逻辑——没有成熟开源 PHP OCR 引擎能对标 PaddleOCR 或 Tesseract
为什么别自己写“源码”解析 PDF
PDF 是二进制结构化格式(含对象流、交叉引用表、字体字典等),直接解析极易出错。例如:
- 文字可能被拆成多个操作符(
Tj,TJ)分散在不同内容流中 - 中文字体常嵌入为 CID 字体,需查 ToUnicode 表才能映射到 Unicode
- 阅读顺序可能与绘制顺序相反,导致段落颠倒
这些细节已有 smalot/pdfparser 等库封装好。自己重写不仅耗时,还容易漏掉边界情况。











