Yii框架需借助第三方库读取加密PDF,推荐smalot/pdfparser或setasign/fpdi-pdf-parser;须验证密码类型与强度,封装为PdfContentReader服务,注意安全存储路径、密码及资源限制。

Yii框架本身不直接支持读取加密PDF文件内容,需借助第三方PDF解析库,并在PHP环境中处理解密逻辑。关键在于:PDF密码正确性验证、解密后的文本提取、与Yii应用的集成方式。
确认PDF加密类型和密码
加密PDF分“所有者密码”(Owner Password)和“用户密码”(User Password)。多数情况下只需用户密码即可打开并提取内容;若只有所有者密码,部分库可能无法解密文本层。建议先用命令行工具(如qpdf --decrypt)或在线工具验证密码有效性及加密强度(如AES-128、RC4)。
选用支持解密的PHP PDF解析库
推荐以下两个成熟方案:
- smalot/pdfparser:轻量、兼容性好,支持带用户密码的PDF解密(需开启openssl扩展),但对强加密(如AES-256)或某些自定义加密可能失败;
- setasign/fpdi-pdf-parser(FPDI系列):底层更稳定,配合setasign/fpdi可安全加载加密PDF,适合生产环境,但API稍复杂。
避免使用已弃用或不维护的库(如pdfparser旧版、tcpdf读取功能有限)。
在Yii中封装PDF解密与文本提取逻辑
建议新建一个服务类(如PdfContentReader),注入到Controller或Service中调用:
- 接收PDF路径和密码作为参数;
- 使用选定库实例化解析器,调用setPassword()或构造时传入密码;
- 捕获解密失败异常(如Smalot\PdfParser\Exception\EncryptedDocumentException),返回明确错误提示;
- 成功后遍历所有页,调用getText()或类似方法提取纯文本;
- 对提取结果做基础清洗(去空行、合并换行、过滤控制字符)。
注意权限与安全性边界
不要在Web请求中暴露PDF原始文件路径或硬编码密码;敏感PDF应存于@app/runtime等非公开目录;密码建议通过配置项或密钥管理服务传入,而非前端提交;批量处理时限制单次文件大小(如≤20MB)和页数(如≤500页),防止内存溢出或DoS风险。



















