使用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
相关产品推荐
相关产品推荐

