Yii不提供PDF文字提取功能,需借助第三方库如smalot/pdfparser(推荐)或OCR方案;该库仅支持可复制PDF,不支持扫描件,中文乱码需检查PDF字体嵌入情况。

Yii本身不提供PDF文字内容提取能力,它只是一个Web应用框架。要从PDF中提取文字,必须借助第三方PHP库(如smalot/pdfparser、setasign/fpdi搭配tcpdf解析层,或调用系统级工具如pdftotext),并在Yii控制器或服务中封装调用逻辑。
推荐方案:用 smalot/pdfparser 解析纯文本内容
这是目前在Yii2项目中最轻量、兼容性好、无需外部依赖的纯PHP方案,适合读取可复制PDF(非扫描件)的文字内容。
- 安装命令:
composer require smalot/pdfparser - 确保PDF不是图片型(扫描件)——该库无法OCR,仅解析内嵌文本流
- 中文支持依赖PDF自身是否嵌入了Unicode映射和字体描述;若提取乱码,需检查源PDF是否含完整ToUnicode CMap
调试案例:在控制器中提取并输出前200字符
以下是一个可直接运行的调试片段(放在SiteController.php中):
use Smalot\PdfParser\Parser;
public function actionExtractPdfText()
{
$pdfPath = Yii::getAlias('@app/runtime/test.pdf'); // 确保文件存在且可读
if (!file_exists($pdfPath)) {
throw new \yii\web\HttpException(404, 'PDF文件未找到');
}
try {
$parser = new Parser();
$pdf = $parser->parseFile($pdfPath);
$text = $pdf->getText(); // 自动合并所有页文本
// 调试:截取前200字符并高亮显示换行/空格
$preview = htmlspecialchars(substr($text, 0, 200));
$preview = str_replace("\n", '<br><span style="color:#d32f2f">[换行]</span>', $preview);
$preview = str_replace(" ", ' <span style="color:#1976d2">[双空格]</span>', $preview);
return $this->asJson([
'success' => true,
'length' => strlen($text),
'preview' => $preview,
'pages' => $pdf->getNumberOfPages(),
]);
} catch (\Exception $e) {
return $this->asJson([
'success' => false,
'error' => $e->getMessage(),
]);
}
}
访问 /index.php?r=site/extract-pdf-text 即可看到结构化返回结果。若返回为空或乱码,大概率是PDF本身未正确嵌入文本(比如由截图转PDF、扫描生成),此时需先走OCR流程。
补充:处理扫描PDF(需OCR)的可行路径
Yii不内置OCR,但可桥接外部服务:
- 本地部署
tesseract:用exec('tesseract '.escapeshellarg($pdfPath).' stdout -l chi_sim')调用(需服务器已安装tesseract-ocr+中文语言包) - 调用云API:如百度OCR、腾讯云OCR,上传PDF二进制流,接收JSON文字结果(注意脱敏与合规)
- 前端预处理:用PDF.js + canvas渲染每页为图像,再通过JS OCR库(如Tesseract.js)提取,避免服务端压力
常见问题快速定位
提取结果为空?检查三点:
- PDF是否能用Adobe Reader复制文字(不能则基本是图)
- 文件路径权限是否正确(
is_readable($pdfPath)返回true) - 是否含加密:
$pdf->getEncrypted()返回true时需先解密(smalot/pdfparser不支持解密,需用setasign/fpdi配合密码)



















