[shellscript] Renomeando vários PDF's de acordo com texto presente no arquivo

Caso real: Vários arquivos em PDF que precisavam ser separados conforme o mês que foram quitados (essa informação consta no corpo do documento) e pode ser referenciada por duas linhas que contém o seguinte formato:

Quitado dd/mm/aaaa

e com um sequêncial numerico único com a linha no formato:

3-EST.000nn 00n

formato do nome após execução do script

MMM-000nn00n.pdf

Exemplo: JAN-00022001.pdf

Dependencias: poppler, grep, sed


#!/bin/bash
# hudsonBomfim ver 300623

MES=("NULL" "JAN" "FEV" "MAR" "ABR" "MAI" "JUN" "JUL" "AGO" "SET" "OUT" "NOV" "DEZ")

for pdf in *.pdf 
do  
    pdftotext "${pdf}"
    nomeArquivo=`basename -s .pdf "${pdf}"`
    mesNumero=`grep -A2 'Quitado' "${nomeArquivo}.txt" | grep -o '/[0-1][0-9]/' | tr -d '/0'`
    novoNome=`sed '10!d;s/3-EST\.//;s/ //' "${nomeArquivo}.txt"`
    mv "${pdf}" "${MES[mesNumero]}-${novoNome}.pdf"
done
rm *.txt

Vale dizer que não funciona para PDF's de documentos feitos a partir de imagens

Vou dar uma contribuição para arquivos JPEG com imagens, usando um arquivo CSV com uma lista de nomes, um nome por linha, na verdade nem precisaria ser CSV.

#!/bin/bash

#Passo 1: Criar arquivo temporário
#Passo 2: Converter JPEG para Texto.
#Passo 3: Pesquisar se no arquivo tem o texto do csv
#Passo 4: Endireitar o texto
#Passo 5: Converter para pdf pesquisavel
#Passo 6: Salvar com o novo nome

#variaveis
#OBS criar uma pasta chamada resultados. 
#Colocar as imagens na pasta image
#precisa de um arquivo de texto chamado data.csv com nomes em cada linha

INPUT=data.csv
IFS=,


#Passo1
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)"
WORK_DIR=`mktemp -d -p "$DIR"`
if [[ ! "$WORK_DIR"  || ! -d "$WORK_DIR" ]]; then
    echo "Não foi criado o diretório temporario"
    exit 1
fi

function cleanup {
    rm -rf "$WORK_DIR"
    echo "Diretório temporário está sendo deletado: $WORK_DIR"
}

trap cleanup EXIT

tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ%/-15 > out

#Passo2

for i in image/*
do
   if [ -f "$i" ]; then
    tesseract "$i" "$WORK_DIR/${i##*/}
    echo $(sed ':a;N;$!ba;s/\n/ /g' "$WORK_DIR/${i##*/}.txt") > "$WORK_DIR/${i##*/}.txt"
   fi
done

#Passo3
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read col1
do 
    for i in $WORK_DIR/*.txt
    do
        string=`cat "$i" | tr "\n" " "`
        cola=`echo $col1 | sed 's/\\r//g'`
        min=1
        colm=${cola^^}
        colmt=`echo $colm | sed 's/ *$//g'` 
        if quant=$(grep -c "$colmt" $i); then
            if [ "$quant" -ge "$min" ]; then
                dir1="${i%.txt}"
                dir2="image/${dir1##*/}
            #passo4
                if [ ! -f "resultado/${i##*/}-$cola.pdf" ]; then
                    convert "$dir2" -deskew 40% "$WORK_DIR/$(basename -- $dir2)"
                
                #passo5
                    tesseract "$dir1" "$dir1" -l por --psm 1 pdf
                #passo6
                    cp "$dir1.pdf" "resultado/${i##*/}-$cola.pdf"
                fi
            fi
        fi
    done
done < $INPUT