Como extrair dados de arquivo PDF

O PDF é um formato de arquivo muito utilizado para representar documentos de maneira independente do aplicativo, do hardware e do sistema operacional usados para criá-los - veja no link algumas formas de criar arquivos PDF. No entanto, quem pretende utilizar parte da informação contida no documento acaba tendo de suar um pouco, já que o texto copiado fica com a formatação muito "bagunçada" quando é colado.

Existem programas que extraem o texto puro sem formatação (ASCII), que poderá ser ser utilizado posteriormente por outros programas. O ps2ascii usa o gs1 para extrair o texto ASCII de arquivos PostScriptTM (PS) ou PDF e geralmente já vem instalado junto com o Debian. Veja um exemplo de seu uso:

ps2ascii file_in.pdf file_out.txt

Existem outros programas, cada um com um resultado diferente. Teste diferentes opções até encontrar o que gere um resultado melhor aproveitável para você. Outro opção é o PDFtoText - instalado usando "sudo apt-get install xpdf":

pdftotext file.pdf file.txt # extrai texto puro para arquivo ASCII

Caso necessite manipular o arquivo PDF antes, existe o PDF Toolkit, ou PDFtk - instalado através do comando "sudo apt-get install pdftk". Veja alguns exemplos de sua utilização:

pdftk largepdfile.pdf burst # cria um série de PDFs individuais: pg_01.pdf, pg_02.pdf, etc
pdftk 1.pdf 2.pdf 3.pdf cat output 123.pdf # junta arquivos PDFs em um só
pdftk in.pdf cat 1east 2-end output out.pdf # gira o documento 90º no sentido horário
pdftk secured.pdf input_pw foopass output unsecured.pdf # salva novo arquivo sem senha a partir de arquivo encriptado
pdftk 1.pdf output 1.128.pdf owner_pw foopass # encripta usando senha 128-bits

Com o texto puro, chega a hora de tratar a informação. Nesse ponto, cada caso é um caso. Veja como ficou uma tabela, feita no word/excel e cujo arquivo foi convertido para PDF usando o "pdftotext" (usando o ps2ascii e o mesmo arquivo PDF, o resultado ficou bem diferente, com o mês, os pontinhos e o valor todos na mesma linha, inclusive da tabela que estava ao lado):

Título

JANEIRO
FEVEREIRO
MARÇO
ABRIL
......
......
......
......
56.409
59.038
55.130
41.803

Note que a primeira linha de texto corresponde à primeira linha de números, e assim por diante. Existiam várias tabelas dentro do mesmo arquivo dispostas da mesma forma. Para fazer a correspondência, criei uma variável para receber o número da primeira linha de valores numéricos. Dentro de um laço, para cada mês, deve-se gravar os valores em "colunas" (ou seja, os primeiros valores das tabelas todos na mesma linha e separados por vírgula), apagando os pontos (os valores estavam com pontos para separar casa do milhar, o que não é utilizado em programação).

Para complicar, também quis inverter a posição de duas colunas. Todo o resultado foi gravado com um cabeçalho em um arquivo CSV. Veja como ficou o script:

# Número da linha de início dos valores
na=33
nb=147
nc=90
nd=204

# Gravar valores para cada mês em uma mesma linha e separados por vírgula, apagando os pontos
for (( i=1; i<=12; i++ )); do sed -n "`echo $na`p;`echo $nb`p;`echo $nc`p;`echo $nd`p;" file.txt | sed ':a;N;$!ba;s/\n/,/g' | tr -d '.' >> values_temp
	# avançar para a linha de baixo
	na=$((na+1))
	nb=$((nb+1))
	nc=$((nc+1))
	nd=$((nd+1))
done

echo "LocalA,LocalB,LocalC,LocalD" > values.csv
# trocar coluna 2 com 3 de posição
cat values_temp | awk -F "," ' { t = $2; $2 = $3; $3 = t; print; } ' | tr ' ' ',' > values_temp2
cat values_temp2 >> values.csv
rm values_temp*

O comando sed é executado primeiramente para selecionar as linhas cuja numeração é informada pela variável. Sua saída é encaminhada para outro sed, que substitui a quebra de linha (\n) por uma vírgula. Por último, são apagados os pontos do arquivo.

Para trocar duas colunas de posição, é utilizado o comando AWK, sendo definida a vírgula como parâmetro que separa os campos - a variável t recebe provisoriamente a coluna dois, já que ela recebe a coluna 3, e depois a coluna 3 recebe a coluna que está na variável provisória. Por fim, os espaços em branco criados entre as colunas são substituídos por vírgulas.

Para baixar e extrair dados de arquivo de planilha (XLS), clique no link para ver como fazer via shell script.

Compartilhe o link desse texto, mas se for copiar algum trecho, cite a fonte. Valorize nosso trabalho.
Mais informações na licença de uso do site.

Um Pingback/Trackback