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.
One comment