Yii框架需借助外部工具提取PDF文本:先流式下载远程PDF至临时文件并校验文件头,再用smalot/pdfparser本地解析(支持中文、不支持OCR)或调用PDF-Parser-1.0 API处理扫描件,最后清理临时文件并返回结构化结果。

Yii框架本身不直接提供PDF文本提取能力,需借助外部工具或服务完成“远程PDF → 下载 → 解析 → 提取文本”全流程。核心思路是:先用PHP安全下载远程PDF到临时路径,再调用PDF解析库(如spipu/pdf-parser、smalot/pdfparser)或调用API(如Gemini、PDF-Parser-1.0)获取文本内容。
下载远程PDF到本地临时文件
避免使用file_get_contents()加载大文件进内存,推荐流式写入:
- 用
fopen('https://...', 'rb')打开远程URL流 - 用
fopen($tempPath, 'wb')创建临时文件句柄 - 循环
stream_copy_to_stream()分块传输,控制内存占用 - 下载完成后校验文件头是否为
%PDF-,防止返回HTML错误页
用smalot/pdfparser本地解析PDF文本
轻量、纯PHP、支持中文(需PDF内嵌字体),适合非扫描版文档:
- 安装:
composer require smalot/pdfparser - 加载时指定
setUseRawText(true)提升中文识别率 - 逐页调用
$page->getText(),合并后做基础清洗(去空行、合并换行符) - 注意:不支持OCR,扫描PDF会返回空字符串
调用PDF-Parser-1.0 API解析(含扫描件)
适用于需要识别图片型PDF或保留表格结构的场景:
- 部署好PDF-Parser-1.0服务(默认监听
http://localhost:7860) - 用
cURLPOST上传临时PDF文件,Content-Type: multipart/form-data - 接收JSON响应中的
text字段或tables数组 - 解析完成后立即
unlink($tempPath)清理临时文件
在Yii控制器中整合示例
以SiteController为例,封装成可复用动作:
- 接收
url参数(需白名单校验域名,防SSRF) - 生成唯一
$tempFile = Yii::getAlias('@runtime/pdf/') . md5($url) . '.pdf' - 下载→解析→返回JSON:
['status' => 'success', 'text' => $extracted] - 异常时统一返回
400并记录日志(如网络失败、解析超时、格式不支持)


















