[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