Composer 无法安装 PDFParser 是因为其真实包名为 smalot/pdfparser,且已停止维护、不兼容 PHP 8+;推荐使用 spatie/pdf-to-text(依赖系统 pdftotext)或 hexadog/php-pdf-parser(纯 PHP 替代分支)。

Composer 无法直接安装 PDFParser 库,因为 PDFParser 不是一个标准的 Composer 包名 —— 它是 smalot/pdfparser 这个开源库的常用简称,而该库已多年未维护,PHP 8+ 下大概率报错或解析失败。
为什么 composer require pdfparser 会失败
执行该命令时,Composer 会去 Packagist 搜索名为 pdfparser 的包,但实际不存在。常见错误包括:
Could not find package pdfparser- 或误装到其他同名但不相关的包(如废弃的
setasign/fpdi衍生包) - 即使手动指定
smalot/pdfparser,也会遇到php: ^5.3 || ^7.0的版本限制,与当前主流 PHP 8.1/8.2 冲突
推荐替代方案:spatie/pdf-to-text(轻量 + PHP 8 兼容)
这是目前最稳妥的实操选择:底层调用系统 pdftotext(来自 Poppler 工具集),不依赖 PHP 扩展,纯二进制解析,准确率高、无内存溢出风险。
安装步骤:
- 先确保系统已安装
pdftotext:
Ubuntu/Debian:sudo apt install poppler-utils
macOS:brew install poppler
Windows:下载 poppler-windows 并将Library\bin加入 PATH - 再运行:
composer require spatie/pdf-to-text - 基础用法示例:
$pdf = new \Spatie\PdfToText\Pdf('document.pdf');
$text = $pdf->text(); // 返回纯字符串内容
如果必须用纯 PHP 解析(无系统依赖)
可考虑 hexadog/php-pdf-parser —— 这是 smalot/pdfparser 的活跃分支,已适配 PHP 8.0+,修复了对象引用、xref 解析等关键 bug。
- 安装:
composer require hexadog/php-pdf-parser - 注意它默认只解析文本流,不处理字体映射或加密 PDF;若 PDF 含中文,需额外确认是否嵌入字体及编码方式
- 简单示例:
$parser = new \Hexadog\PdfParser\Parser();
$pdf = $parser->parseFile('chinese.pdf');
$text = $pdf->getText(); // 可能返回乱码,需配合 iconv 或 mb_convert_encoding 处理
容易被忽略的解析陷阱
PDF 不是文档格式,而是图形指令集合。这意味着:
- 没有“段落”概念 ——
getText()返回的是按渲染顺序拼接的字符串,换行/空格可能丢失 - 扫描版 PDF(图片型)完全无法提取文字,
spatie/pdf-to-text会返回空字符串,且不报错 -
hexadog/php-pdf-parser对含 JavaScript 或 AES-256 加密的 PDF 直接抛异常,需提前用qpdf --decrypt预处理 - 大文件(>50MB)建议加超时和内存限制:
ini_set('max_execution_time', 120);










