2012-04-17 135 views
1

我使用Ghostscript的剥离从PDF文件图像转换成JPG和运行的Tesseract保存TXT内容是这样的:PHP的exec()和正方体进“”无法打开输入文件”

  • Ghostscript的位于C:\发动机\ GS \
  • 超正方体于c:\发动机\的tesseract \
  • 腹板位于PDF/JPG/TXT DIR =文件/ tmp/

代码:

$pathgs = "c:\\engine\\gs\\"; 
$pathtess = "c:\\engine\\tesseract\\"; 
$pathfile = "file/tmp/" 

// Strip images 
putenv("PATH=".$pathgs); 
$exec = "gs -dNOPAUSE -sDEVICE=jpeg -r300 -sOutputFile=".$pathfile."strip%d.jpg ".$pathfile."upload.pdf -q -c quit"; 
shell_exec($exec); 

// OCR 
putenv("PATH=".$pathtess); 
$exec = "tesseract.exe '".$pathfile."strip1.jpg' '".$pathfile."ocr' -l eng"; 
exec($exec, $msg); 
print_r($msg); 
echo file_get_contents($pathfile."ocr.txt"); 

剥图像(它只是1页)工作正常,但正方体呼应:

Array 
    (
    [0] => Tesseract Open Source OCR Engine v3.01 with Leptonica 
    [1] => Cannot open input file: 'file/tmp/strip1.jpg' 
) 

,并且不产生ocr.txt文件,从而导致成“未能打开流”在PHP的错误。

  • 复制strip1.jpg到C:/发动机/的tesseract /文件夹并从命令运行超正方体(超正方体strip1.jpg ocr.txt -l ENG)运行没有任何问题。
  • 用exec(c:/ engine/tesseract/tesseract ...)替换putenv()报价返回am错误
  • 我将strip1.jpg保留在Tesseract文件夹中并运行exec(tesseract'c:/ engine '...)返回am错误
  • 离开path/strip1.jpg附近的apostrophs返回一个空数组作为消息,并且不会创建ocr.txt文件。
  • 将命令直接写入exec()引用而不是使用$ exec不会进行更改。

我到底做错了什么?任何帮助深表感谢:-)

brgds 大卫

+0

而不是相对路径(文件/ tmp/strip1.jpg),请尝试一个完全合格的路径? – halfer 2012-04-17 21:12:03

+0

@halfer:我已经尝试了许多不同的路径 - 也是从c:到tmp的完整路径 - 有和没有apostroph - 但没有做任何改变。 错误的是在路径/文件名附近有引导者,所以我将它们全部留下。 exec(dir路径)清楚地给出了/ file/tmp文件夹的内容以及strip1.jpg。 它看起来像tesseract找到文件,但在操作开始之前崩溃,返回没有$味精和没有ocr.txt。但为什么它从命令行而不是在PHP中工作? Ghostscript根本不担心这一点。 – droehn 2012-04-19 17:50:32

回答

0

可能PHP中缺少的环境变量是这里的问题。看看my question here看设置是否HOMEPATH排序?

0

Halfer,你让我很快乐:-)

不完全的方式在您的文章描述,但这样的:

$path = str_replace("index.php", "../".$pathfile, $_SERVER['SCRIPT_FILENAME']); 

$descriptors = array(
    0 => array("pipe", "r"), 
    1 => array("pipe", "w"), 
    2 => array("pipe", "w") 
); 
$cwd = $pathtess; 
$command = "tesseract ".$path."strip1.jpg" ".$path."ocr -l eng"; 

$process = proc_open($command, $descriptors, $pipes, $cwd); 

if(is_resource($process)) { 
    fclose($pipes[0]); 
    fclose($pipes[1]); 
    fclose($pipes[2]); 
    proc_close($process); 
} 

echo file_get_contents($path."ocr.txt"); 

感谢您的支持! brgds David

+0

出于兴趣,问题是什么?我看不到任何环境内容。 – halfer 2012-04-19 21:33:01

+0

如果我只知道;我正式尝试了/ file/tmp的完整路径,但是在exec()下却没有成功。随着proc_open它的作品,这是主要的事情。无论如何,我会尝试在exec()下运行此路径,以排除在学习期间出现的错误。 – droehn 2012-04-20 07:02:40

+0

啊,至少它解决了,这是主要的东西':)'。 – halfer 2012-04-20 09:08:40