Php 将PDF转换为PNG以便Tesseract处理
我现在对Imagemagick和Tesseract有意见 我正在为PHP中的文档开发一个命令行分类器。其思想是,它接收PDF文档,并使用。我认为必要的步骤如下:Php 将PDF转换为PNG以便Tesseract处理,php,imagemagick,tesseract,Php,Imagemagick,Tesseract,我现在对Imagemagick和Tesseract有意见 我正在为PHP中的文档开发一个命令行分类器。其思想是,它接收PDF文档,并使用。我认为必要的步骤如下: 将PDF转换为PNG文件 从PNG文件中提取文本 在机器学习库中运行文本以对其进行分类 其主命令如下所示: <?php namespace Matthewbdaly\LetterClassifier\Commands; use Symfony\Component\Console\Command\Command; use Sym
<?php
namespace Matthewbdaly\LetterClassifier\Commands;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputArgument;
use League\Pipeline\Pipeline;
use Matthewbdaly\LetterClassifier\Stages\ConvertPdfToPng;
use Matthewbdaly\LetterClassifier\Stages\ReadFile;
class Processor extends Command
{
protected function configure()
{
$this->setName('process')
->setDescription('Processes a file')
->setHelp('This command processes a file')
->addArgument('file', InputArgument::REQUIRED, 'File to process');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$file = $input->getArgument('file');
$pipeline = (new Pipeline)
->pipe(new ConvertPdfToPng)
->pipe(new ReadFile);
$pipeline->process($file);
}
}
<?php
namespace Matthewbdaly\LetterClassifier\Stages;
use Imagick;
class ConvertPdfToPng
{
public function __invoke($file)
{
$tmp = tmpfile();
$uri = stream_get_meta_data($tmp)['uri'];
$img = new Imagick($file);
$img->setResolution(300, 300);
$img->setImageDepth(8);
$img->setImageFormat('png');
$img->writeImage($uri);
return $tmp;
}
}
=> """
Am sum\n
\n
mm“ m mun SuHrkw-l\n
n m 51mm\n
\n
mm\n
\n
um um\n
\n
ms Murine\n
1 Elm: 51mm\n
Emnuumn\n
\n
a mu\n
\n
m Mm 2m-\n
Dav st-n-m.\n
\n
P‘Eualanfl ma lumnflarvlmamrmy ”Hay ”mum-m-\n
we we “mum-m n: "mum,“ m mun\n
\n
vm [harem\n
\n
Am smrm
"""
这不是我想要分类的信的内容——文本被弄乱了。如果我从shell中运行以下命令,它们将按预期工作,以转换字母的文本并将其写入输出文件:
convert -density 300 Quote.pdf output.png
tesseract output.png output
如果我在Tesseract阶段硬编码文件的路径,指向使用convert
命令生成的output.png
,那么就可以了。所以我很有信心,问题在于生成PNG文件的步骤。我没有使用Imagemagick的经验,所以我不确定为什么不能处理该文件,但似乎有一个我缺少的设置
有人能告诉我问题出在哪里吗?我怀疑问题是Imagick在调用
setResolution()之前读取了PDF
尝试实例化空的IMagick对象,设置解析,然后读取文件:
<?php
namespace Matthewbdaly\LetterClassifier\Stages;
use thiagoalessio\TesseractOCR\TesseractOCR;
class ReadFile
{
public function __invoke($file)
{
$uri = stream_get_meta_data($file)['uri'];
$ocr = new TesseractOCR($uri);
$output = $ocr->lang('eng')->run();
eval(\Psy\Sh());
}
}
$img = new Imagick();
$img->setResolution(300, 300);
$img->readImage($file);
这正是问题所在——它现在正按预期工作。非常感谢。读取图像后调用setResolution()
有什么意义?为什么会导致问题?@MatthewDaly在加载输入图像后调用它,要么为输出图像设置所需的像素密度,要么什么都不做。我不确定。