2017-07-11 25 views
1

我想编写一个脚本,它可以运行一个命令到OCR pdfs,在写入文本文件后删除生成的图像。将使用GNU并行的两个命令组合起来用于OCR项目

我想要结合的两个命令如下。

该命令创建文件夹,提取从每个PDFpgm,并将它们添加到每个文件夹中:

time find . -name \*.pdf | parallel -j 4 --progress 'mkdir -p {.} && gs -dQUIET -dINTERPOLATE -dSAFER -dBATCH -dNOPAUSE -dPDFSETTINGS=/screen -dNumRenderingThreads=4 -sDEVICE=pgmraw -r300 -dTextAlphaBits=4 -sProcessColorModel=DeviceGray -sColorConversionStrategy=Gray -dOverrideICC -o {.}/{.}-%03d.pgm {}' 

此命令不会在OCR并删除所得到的图像(pgm):

time find . -name \*.pgm | parallel -j 4 --progress 'tesseract {} {.} -l deu_frak && rm {.}.pgm' 

我想要合并这两个命令,以便脚本在每个OCR之后删除pgm图像。如果我运行上述命令,第一个命令将提取图像并占用我的磁盘空间,然后第二个命令将执行OCR,并且只有在这之后删除图像作为最后一步。

所以,

  1. 从PDF
  2. 创建文件夹
  3. 提取PGM从PGM
  4. OCR为TXT
  5. 删除PGM图像,这只是已使用(失踪)

基本上,我希望这4个步骤按此顺序完成,每个PDF分开,并非全部PDF处于打开状态CE。我怎样才能做到这一点?

编辑:

我解决我的问题,第一次尝试是建立以下命令:

time find . -name \*.pdf | parallel -j 4 -m --progress --eta 'mkdir -p {.} && gs -dQUIET -dINTERPOLATE -dSAFER -dBATCH -dNOPAUSE -dPDFSETTINGS=/screen -dNumRenderingThreads=4 -sDEVICE=pgmraw -r300 -dTextAlphaBits=4 -sProcessColorModel=DeviceGray -sColorConversionStrategy=Gray -dOverrideICC -o {.}/{.}-%03d.pgm {}' && time find . -name \*.pgm | parallel -j 4 --progress --eta 'tesseract {} {.} -l deu_frak && rm {.}.pgm' 

然而,正方体不会找到语言包。

回答

2

更新回答

我没有测试此,请在你的文件的一小部分的副本运行它。通过运行

#!/bin/bash 

# Declare a function for "parallel" to call 
doit() { 
    # Get name of PDF with and without extension 
    withext="$1" 
    noext="$2" 
    echo "DEBUG: Processing $withext into $noext" 

    # Make output directory 
    mkdir -p "$noext" 

    # Extract as PGM into subdirectory 
    gs ... -o "$noext"/"${noext}-%03d.pgm $withext" 

    # Go to target directory or die with error message 
    cd "$noext" || { echo ERROR: Failed to cd to $noext ; exit 1; } 

    # OCR and remove each PGM 
    n=0 
    for f in *pgm; do 
     echo "DEBUG: OCR $f into $n" 
     tesseract "$f" "$n" -l deu_frak 
     echo "DEBUG: Remove $f" 
     rm "$f" 
     ((n=n+1)) 
    done 
} 

# Ensure the function is exported to subshells 
export -f doit 

find . -name \*.pdf -print0 | parallel -0 doit {} {.} 

您应该能够测试doit()功能,无需parallel:您可以DEBUG:在开始关闭的消息,如果你是幸福的,看起来不错

doit someFile.pdf someFile 

原来的答案

如果你想为每个参数做很多事情,在GNU并行,最简单的方法是声明一个bash函数,然后调用它。

它看起来像这样:

# Declare a function for "parallel" to call 
doit() { 
    echo "$1" "$2" 
    # mkdir something 
    # extract PGM 
    # do OCR 
    # delete PGM 
} 

# Ensure the function is exported to subshells 
export -f doit 

find some files -print0 | parallel -0 doit {} {.} 
+2

请报$ 1和$ 2 - 否则你-print0的使用并没有真正有所作为:'回声 “$ 1” “$ 2”'。 –

+1

使用函数增加了奖励:在单个文件上测试非常简单。 –

+0

嗨马克塞切尔,感谢提出一个解决方案。看上去不错!不幸的是,我不能通过将'n'粘贴我的命令到你的脚本来使它工作。请注意,我是这样的初学者。你会如此善良,以创建一个可行的解决方案与我的命令?这将是太棒了!想象一下,您将在名为** test **的文件夹中具有“PDF”。你将如何继续剧本? –