2017-07-11 28 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」。你將如何繼續劇本? –