我有一个应用程序,用户可以上传pdf
,转换为text
进行进一步处理。事情是,一些上传的文件是图像PDF,所以转换它不起作用。而不是发送所有的PDF被分割成图像,然后OCR他们,我宁愿只发送那些被证明或检测到的图像,有没有办法做到这一点,我在linux (debian)
环境与php
工作
更新
在寻找最终解决方案时,我遵循了@Andrew的建议,计算生成的txt文件的字数,如果少于10个单词,则进行下一步:PDF转换成图像,以便以后进行OCR识别,这就是我现在正在做的……
// convert any file with pdf extension to text
$cmd = "pdftotext -eol unix '$uploadedfile'";
shell_exec($cmd);
// save original file at the orig directory
rename("$uploadedfile", "orig/$uploadedfile");
// pdftotext renames files to txt so I need the file name with txt extension
$textfile = preg_replace('"\.(pdf|PDF)$"', '.txt', $uploadedfile);
// count words on the generated txt file
$cmd = "wc -w '$textfile' | cut -f1 -d' '";
$wc = shell_exec($cmd);
// proceed if words are less than 10
if ($wc < 10)
{
//take out the pdf extension for directory creation
$imgdir = preg_replace('"\.(pdf|PDF)$"', '', $uploadedfile);
$cmd = "mkdir '$imgdir'";
shell_exec($cmd);
//change pdf extension to jpg for images creation
$imgfile = preg_replace('"\.(pdf|PDF)$"', '.jpg', $uploadedfile);
//convert pdf to images
$cmd = "convert 'orig/$uploadedfile' '$imgdir/$imgfile'";
然后它会出现OCR...
更新2感谢@Mark-Setchell的建议,我修改了一点代码,现在最后一部分是这样的:
//take out the pdf extension for directory creation
$imgdir = preg_replace('"\.(pdf|PDF)$"', '', $uploadedfile);
$cmd = "mkdir '$imgdir'";
shell_exec($cmd);
//convert pdf to images
$cmd = "pdfimages 'orig/$uploadedfile' '$imgdir/$imgdir'";
2条答案
按热度按时间oxf4rvwz1#
您可以使用Poppler包中的
pdfimages
来列出和提取所有原始格式、大小和质量的图像:然后使用
extracted
作为文件名的根来提取它们:mrphzbgm2#
我还没有对世界上的每一个pdf文件进行测试,所以可能会有一些假阳性或假阴性,但这段代码对我来说正好是OP想要做的。当上传的PDF文件中有一些文本时,我使用PHP文本提取库,如果它是一个只有图像的PDF,我会将其发送到几个OCR作为服务端点。(虽然不是OP问题的一部分,但我为什么要发送到多个服务?答:因为我没有发现一个是准确的。通过使用六个,我通常可以找到我正在搜索的文本至少被其中一个识别,但在OCR世界中仍然是命中和错过。当然,如果PDF是基于文本的,提取后的搜索结果是100%准确的。