Php 将PDF转换为PNG以便Tesseract处理

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

我现在对Imagemagick和Tesseract有意见

我正在为PHP中的文档开发一个命令行分类器。其思想是,它接收PDF文档,并使用。我认为必要的步骤如下:

  • 将PDF转换为PNG文件
  • 从PNG文件中提取文本
  • 在机器学习库中运行文本以对其进行分类
  • 其主命令如下所示:

    <?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在加载输入图像后调用它,要么为输出图像设置所需的像素密度,要么什么都不做。我不确定。