You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PdfParser无法提取受保护/特殊字体PDF文本的解决咨询

从受保护/特殊字体PDF提取文本:PdfParser失效后的解决办法

问题还原

我正在用PdfParser提取PDF里的文本,但碰到一些带复制保护或者用了特殊字体的PDF就失效了。运行代码后啥错误警告都没有,就是输出空白,试了utf-8编码也没用。我的代码如下:

// Include Composer autoloader if not already done.
error_reporting(E_ALL);
ini_set('display_errors', 1);
include 'vendor/autoload.php';

// Parse pdf file and build necessary objects.
$parser = new \Smalot\PdfParser\Parser();
$pdf = $parser->parseFile('tests.pdf');

// Retrieve all pages from the pdf file.
$pages = $pdf->getPages();

// Loop over each page to extract text.
foreach ($pages as $page) {
    echo utf8_encode($page->getText());
}
?>

解决思路

先给你个明确答案:受复制保护的PDF大多是可以提取文本的,但PdfParser在这类场景下确实不太顶用,得分情况处理。下面是我踩过坑后总结的方案:

1. 先搞清楚PDF的保护类型

  • 仅权限限制的PDF:这种PDF其实底层文本是存在的,只是加了“禁止复制”的权限锁。你可以先用Ghostscript移除权限,再用PdfParser处理。
    终端里跑这条命令:

    gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=unprotected.pdf -c ".setpdfwrite <</PermissionsFile null>> setdistillerparams" -f tests.pdf
    

    之后用你的代码解析生成的unprotected.pdf就行。

  • 扫描件/图像型PDF:这种PDF本质就是一张张图片,根本没有文本层,PdfParser肯定拿不到内容。这种情况得用OCR工具,比如Tesseract。步骤是:
    先把PDF转成图片(还是用Ghostscript):

    gs -dSAFER -dBATCH -dNOPAUSE -r300 -sDEVICE=png16m -sOutputFile=page-%03d.png tests.pdf
    

    再用Tesseract识别单张图片:

    tesseract page-001.png output.txt -l eng
    

    在PHP里可以用exec()或者shell_exec()调用这些命令,再读取生成的output.txt就行。

2. 特殊字体的情况

有些PDF用了自定义编码的特殊字体,PdfParser没法正确映射字符。这种时候换用Poppler工具包的pdftotext命令会靠谱很多,它对特殊字体的兼容性比PdfParser好太多:

pdftotext tests.pdf output.txt

同样在PHP里调用命令行,直接读output.txt的内容就OK。

3. 给你的代码加个调试环节

虽然没报错,但可以加几行代码看看问题出在哪:

  • 先确认PDF对象是否正常创建:
    var_dump($pdf); // 看看有没有页面数量、文档信息这些内容
    
  • 查看单页的原始数据:
    foreach ($pages as $page) {
        var_dump($page->getDetails()); // 看看页面里有没有文本块相关的字段
    }
    
    如果getDetails()里找不到文本相关的内容,那基本就能确定要么是图像型PDF,要么是权限限制导致文本被屏蔽了。

内容的提问来源于stack exchange,提问作者V.p. Dixit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:37:49