使用smalot/pdfparser提取PDF文本返回空结果问题求助
使用smalot/pdfparser提取PDF文本时部分无密码PDF返回空结果的问题排查
我尝试使用smalot/pdfparser提取PDF文件文本,但部分无密码、可在Chrome正常打开的PDF返回空结果,其他PDF可正常提取。
我的代码
$parser = new \Smalot\PdfParser\Parser(); // Parse pdf file using Parser library $pdf = $parser->parseFile($file); $metaData = $pdf->getDetails(); print_r($metaData); $pages = $pdf->getPages(); foreach ($pages as $page) { $text = $page->getText(); echo "<div>".$text."</div>"; } echo $file;
执行结果
仅能获取元数据,文本内容为空:
Array ( [Producer] => cairo 1.17.4 (https://cairographics.org [Pages] => 1 ) <div></div>D:\web\D\public\pdf_po/123.pdf
问题原因分析
从元数据能看到该PDF由cairo 1.17.4生成,这类PDF很可能将文本以矢量图形路径的形式绘制,而非存储为PDF标准的可提取文本流对象。smalot/pdfparser的核心逻辑是解析PDF中的文本流节点,无法识别这种图形化的文本,因此返回空结果。
解决方案
- 若PDF文本是图形化的,需使用OCR工具提取:搭配Tesseract OCR引擎,先将PDF页面转为图片,再通过PHP的
tesseract-ocr扩展识别文本。 - 更换PDF解析库:使用
spatie/pdf-to-text(依赖Poppler工具),Poppler支持渲染PDF并提取文本,对图形化文本的处理能力优于smalot/pdfparser。 - 先验证PDF文本属性:用Chrome的“选择文本”功能测试,若无法选中文本,即可确认文本是图形化形式,必须用OCR或渲染类工具处理。
内容的提问来源于stack exchange,提问作者Awan
相关产品推荐
相关产品推荐

