推荐使用Smalot/PdfParser类库提取PDF内容,它轻量、纯PHP实现、无需外部依赖,且对中文PDF支持良好;需注意文件路径、校验、Unicode解码及结构化提取。

Yii框架中提取PDF文件内容,推荐使用 Smalot/PdfParser 类库——它轻量、纯PHP实现、无需外部依赖(如Ghostscript),且对中文PDF支持良好(需注意编码和字体处理)。
安装与配置
在Yii项目根目录执行:
- 添加依赖:
composer require smalot/pdfparser - 若因国内网络问题失败,先配置镜像:
composer config repo.packagist composer https://packagist.phpcomposer.com,再重试 - 安装完成后,类库会自动注册到Composer自动加载机制,无需手动require或修改Autoloader
在Controller中使用示例
以下代码可直接用于任意控制器动作(如actionExtractPdf()):
// 引入命名空间(PHP 7+ 推荐写法)
use Smalot\PdfParser\Parser;
// 指定PDF文件路径(务必用绝对路径)
$pdfPath = Yii::getAlias('@webroot') . '/uploads/invoice.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(); // 提取纯文本(含换行与空格,结构较原始)
// 可选:获取元信息(作者、创建时间、页数等)
$details = $pdf->getDetails();
// 输出或返回结果(调试用)
var_dump([
'text_length' => strlen($text),
'first_200' => mb_substr($text, 0, 200, 'UTF-8'),
'pages' => $details['Pages'] ?? 'unknown',
'creator' => $details['Creator'] ?? '',
]);
} catch (\Exception $e) {
Yii::error('PDF解析失败:' . $e->getMessage(), 'pdf-parser');
throw new \yii\web\ServerErrorHttpException('文档解析异常,请检查PDF是否损坏');
}
中文PDF常见问题处理
如果提取出的中文显示为乱码或空白,通常不是编码问题,而是PDF内嵌字体缺失或未正确映射。解决方法:
- 确认PDF本身可复制中文:用Adobe Reader或系统预览打开,尝试手动复制文字——若无法复制,说明PDF是图片型或字体未嵌入,Parser无法提取
-
启用Unicode解码(仅限v1.0+):部分版本支持
$pdf->getText(true)强制启用Unicode模式,提升中文识别率 -
避免依赖getText()做结构化提取:它返回的是“平面文本流”,不保留表格/列布局。如需结构化数据(如发票字段),建议结合正则匹配关键行:
preg_match('/金额[::]\s*(\d+\.?\d*)/', $text, $matches)
进阶:封装为Yii组件或服务
为复用性考虑,可将其封装为独立服务:
- 在
@common/components/PdfExtractor.php中定义类,注入Parser实例 - 提供
extractText(string $path): string和extractFields(array $patterns): array等方法 - 在配置中注册为应用组件,便于全局调用:
'pdfExtractor' => ['class' => 'common\components\PdfExtractor']











