Multiplier PDF par OCR en ligne de commande sous Linux (Ubuntu)

Je voulais appliquer l'OCR au fichier PDF sur la ligne de commande, j'ai donc écrit un script bash pour l'OCR avec le nom de fichier ocrize.

Si vous utilisez ocrize, veuillez exécuter la commande suivante à l'avance pour installer les packages requis.

$ sudo apt install tesseract-ocr-jpn imagemagick
#Tesseract va multiplier les PDF japonais verticaux par OCR-ocr-jpn-Besoin de vert.

Exécutez ocrize comme suit (rendez-le exécutable avec chmod à l'avance).

$ ./ocrize input.pdf
# or
$ ocrize input.pdf #Par exemple/usr/local/Lorsque ocrize est placé dans un endroit où passe le chemin, tel que bin.

La procédure d'application de l'OCR au fichier PDF input.pdf sur la ligne de commande est expliquée ci-dessous.

Étape 0 Préparation

Avant d'appliquer l'OCR à input.pdf, stockez le nom de fichier dans une variable et créez un répertoire de stockage principal.

$ stem="input" #Nom de fichier sans extension.
$ dir="${file}.temp"
$ mkdir ${dir} # input.Un répertoire temporaire est créé.

Étape 1 Divisez le fichier PDF en fichiers image

Utilisez la commande convert d'ImageMagick pour diviser input.pdf en fichiers image.

$ convert -density 300 -geometry 1000 ${stem}.pdf ${dir}/${stem}.png

Plus la valeur de l'option -density est élevée, meilleure est la qualité de l'image, mais si vous spécifiez une valeur plus grande, vous devez changer la ressource d'ImageMagick.

Lorsque la commande ci-dessus est exécutée, le fichier dans lequel input.pdf est divisé en pages et converti en PNG est sorti sous le répertoire input.temp comme indiqué ci-dessous.

$ ls ${dir}
input-0.png   input-1.png   input-2.png  input-3.png

Si vous obtenez l'erreur suivante avec la commande convert, modifiez le policy.xml d'ImageMagick (dans mon environnement, policy.xml était directement sous / etc / ImageMagick-6).

Error.1 convert: not authorized

Modifions le droit de la balise de stratégie dont le domaine est codeur et le modèle est PDF comme suit afin que le PDF puisse être lu et écrit.

<policy domain="coder" rights="read|write" pattern="PDF" />

Error.2 convert-im6.q16: cache resources exhausted

Nous sommes à court de mémoire, corrigeons donc la balise de stratégie avec la ressource de domaine. Dans mon cas, j'ai corrigé l'endroit où le nom est la mémoire et le disque.

<policy domain="resource" name="memory" value="1GiB"/>
<policy domain="resource" name="disk" value="2GiB"/>

Vous pouvez vérifier la ressource avec la commande suivante.

$  identify -list resource
# or
$  identify -list Resource

Étape 2 Créez un PDF avec OCR appliqué à partir du fichier image

L'OCR est appliqué à chaque fichier image sous le répertoire input.temp.

$ N=$(ls ${dir} | grep -c '' | awk '{printf "%d", $1-1}')
$ for n in $(seq 0 ${N}); do tesseract -l jpn+eng ${dir}/${stem}-${n}.png ${dir}/${stem}-${n} pdf; done

La langue de reconnaissance est spécifiée par l'option «-l». Si vous voulez d'abord reconnaître en japonais puis en anglais, spécifiez jpn + eng.

Étape 3 Combinez les fichiers PDF avec OCR en un seul

Utilisez la commande pdfunite pour combiner plusieurs fichiers PDF en un seul.

$ pdfunite $(for n in $(seq 0 ${N}); do echo ${dir}/${stem}-${n}.pdf; done) ocrized-${stem}.pdf

Les fichiers PDF sont sortis dans l'ordre des pages avec «for» afin que l'ordre des pages ne soit pas interrompu. Après exécution, ocrized-input.pdf, qui est input.pdf multiplié par OCR, sera créé directement sous le répertoire courant.

Enfin, supprimez le répertoire input.temp et vous avez terminé!

$ rm -r ${dir}

ocrize

Ce qui suit est un script bash qui résume le contenu ci-dessus. Enregistrez-le sous le nom de fichier ʻocrize` et utilisez-le.

#! /bin/bash

if [ $# -eq 1 ]; then
    file=$1
    ext=$(echo ${file} | rev | cut -d '.' -f 1 | rev)
    dir=${file}.temp
    if [ -d ${dir} ]; then
        echo "${dir} allready exists. Please remove this directory."
        exit 1
    fi
    if [ ${ext} = "pdf" -o ${ext} = "PDF" ]; then
        if [ ! -f ${file} ]; then
            echo "${file} dose not exist."
            exit 1
        fi
        stem=$(echo ${file} | rev | cut -c 5- | rev)
        mkdir ${dir}
        echo "1: Converting PDF to PNG."
        convert -density 300 -geometry 1000 ${file} ${dir}/${stem}.png
        echo "1: Finished."
       	N=$(ls ${dir} | grep -c '' | awk '{printf "%d", $1-1}')
        echo "2: OCRizing."
        for n in $(seq 0 ${N}); do
            p=$(echo "${n} ${N}" | awk '{printf "%5.1f", ($1+1)/($2+1)*100}')
            echo -ne "Progress: [${p} %]\r"
            tesseract -l jpn+eng ${dir}/${stem}-${n}.png ${dir}/${stem}-${n} pdf >& /dev/null
            rm ${dir}/${stem}-${n}.png
        done
        echo "2: Finished.        "
        echo "3: Merging PDF files."
        #pdftk $(for n in $(seq 0 ${N}); do echo ${dir}/${stem}-${n}.pdf; done) output ocrized-${pdffile}
        pdfunite $(for n in $(seq 0 ${N}); do echo ${dir}/${stem}-${n}.pdf; done) ocrized-${file}
        echo "3: Finished."
        rm -r ${dir}
    else
        echo "Extension must be pdf or PDF."
        exit 1
    fi
else
    echo "Usage: $ ocrize input.pdf"
    exit 1
fi

Lorsque vous exécutez ʻocrize`, le script s'exécute comme suit.

$ ./ocrize input.pdf
1: Converting PDF to PNG.
convert-im6.q16: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG `input.pdf.temp/input.png' @ warning/png.c/MagickPNGWarningHandler/1654.
1: Finished.
2: OCRizing.
Progress: [ 84.4 %]

Quelques secondes plus tard,

1: Converting PDF to PNG.
convert-im6.q16: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG `input.pdf.temp/input.png' @ warning/png.c/MagickPNGWarningHandler/1654.
1: Finished.
2: OCRizing.
2: Finished.        
3: Merging PDF files.
3: Finished.

URL de référence

Recommended Posts

Multiplier PDF par OCR en ligne de commande sous Linux (Ubuntu)
Commande df facile sur Linux
Rechercher des fichiers volumineux sous Linux à partir de la ligne de commande
Convertir un PDF en documents par OCR
Achèvement de la commande docker sous Linux
Conversion GSI_DEM en geotiff → conversion UTM → conversion ascii uniquement sur la ligne de commande Ubuntu
Continuez à recevoir RSS sur la ligne de commande
Commande de vérification d'état utilisée (parfois) sous Linux
Exécutez bootgen sur Debian GNU / Linux, Ubuntu
Comment installer php7.4 sur Linux (Ubuntu)
Sur Ubuntu Linux, définissez Tab sur q
Vous recherchez commandlinefu sur la ligne de commande
Compilation du noyau Linux (Linux 5.x sur Ubuntu 20.04)
Commande Linux n ° 4
Commande Linux n ° 3
Ubuntu Linux 20.04
Commande Linux n ° 5
Afficher rapidement le code QR sur la ligne de commande
[Note] Installez wxPython 3.x sur Linux Mint (Ubuntu)
Linux: renommez le processus affiché par la commande ps
Mise en évidence de la syntaxe sur la ligne de commande à l'aide de Pygments
Mes réflexions sur le modèle d'application de ligne de commande python2.6
Linux: comprendre les informations affichées par la commande top
Essayez de créer une nouvelle commande sous Linux
Convertir XLSX en CSV sur la ligne de commande
Exécutez Route53 sur la ligne de commande à l'aide de l'AWS-CLI.
Pensez aux interfaces sélectives sur la ligne de commande
Comment mettre Pyenv sur Amazon Linux et Ubuntu pour créer un environnement Python 3.6.0