如何区分;“文本”;PDF文件和;“图像”;PHP中的PDF?

如何区分;“文本”;PDF文件和;“图像”;PHP中的PDF?,php,pdf,tesseract,ghostscript,xpdf,Php,Pdf,Tesseract,Ghostscript,Xpdf,我最近设置了一个Linux服务器,可以使用Xpdf中的pdftotext命令将基于文本的PDF转换为文本,还可以使用gs(Ghostscript)和tesseract命令组合将基于图像的PDF转换为文本 当我已经知道PDF是基于文本还是基于图像时,这两种解决方案都非常有效。但是,为了自动化将许多PDF转换为文本的过程,我需要能够判断PDF是基于文本还是基于图像,以便知道在PDF上运行哪一组过程 PHP中是否有任何方法可以分析PDF并判断它是基于文本的还是基于图像的,这样我就知道是在PDF上使用X

我最近设置了一个Linux服务器,可以使用Xpdf中的
pdftotext
命令将基于文本的PDF转换为文本,还可以使用
gs
(Ghostscript)和
tesseract
命令组合将基于图像的PDF转换为文本

当我已经知道PDF是基于文本还是基于图像时,这两种解决方案都非常有效。但是,为了自动化将许多PDF转换为文本的过程,我需要能够判断PDF是基于文本还是基于图像,以便知道在PDF上运行哪一组过程


PHP中是否有任何方法可以分析PDF并判断它是基于文本的还是基于图像的,这样我就知道是在PDF上使用Xpdf还是Ghostscript/Tesseract?

比较输出并确定OCR运行产生的文本是否与Xpdf运行的输出相同,这是一个非常简单的任务。如果是不可识别的PDF文本(例如非常小的字母),xpdf可以提取文本,您甚至会以大量不必要的胡言乱语结束

我建议只从PDF和OCR中提取图像,而不是完整的PDF。这边

  • 你不必比较文本[1]
  • 根据图像如何包含到PDF中,您也可能获得更好的OCR结果
  • 此外,您还可以避免不必要的OCR文本,该文本包含为明文
由于您已经在使用xpdf,因此可以使用
pdfimages-all
来提取图像


[1] 这并不是100%正确,因为PDF可能是一个三明治式PDF,在图像的“后面”已经有一个OCRD文本层。

我认为Kurt Pfeifle的答案非常好:使用
pdffonts
-这也是Xpdf/Poppler的一部分-列出PDF使用的字体


如果它使用任何字体,则它包含文本。如果不是,它只包含图像。

如果两者都有呢?会发生这种情况吗?如果是,在文件上运行Xpdf的
pdftotext
就足够了吗?不管是哪种方式,无论是两种还是三种不同类型的PDF,我都需要能够区分它们,以便知道如何处理它们以将文本输出。谢谢。我会对PDF运行两个脚本,然后你需要对输出进行比较。是的,我有点担心这是唯一的解决方案。Xpdf在转换为文本方面非常快,但是
gs
/Tesseract过程非常慢。也许我可以先把所有的东西都处理成文本,然后作为一个单独的过程,在事实发生后,检查文本哪里不好,然后对它进行图像处理。关于如何检测什么是“好”文本和什么是“坏”文本,有什么建议吗?谢谢。您可以将文本分解为单词,然后使用
pspell\u check
查看给定块中的拼写错误数与总单词数之比。对不起,我不知道你建议我做什么。我应该将所有PDF文件转换为图像,然后不加区别地进行OCR,还是您推荐其他内容?Tesseract的OCR过程非常缓慢,因此我希望尽量避免对PDF进行OCR。@HartleySan我的意思是使用工具提取嵌入的图像,并仅在这些图像上运行OCR工具。我在原来的回答中补充了一些细节。