Convertendo PDF em Texto (problema de colunas)

70 views
Skip to first unread message

Paulo Marques

unread,
Nov 14, 2013, 8:06:38 AM11/14/13
to py...@googlegroups.com
Caros,

   Estou convertendo documentos PDF em texto com a rotina que vocês disponibilizaram. Tais documentos são apresentados em colunas conforme abaixo:

   Este é um texto     Meu nome  é    Minha dúvida se
   exemplo do tipo     Paulo e sou    refere  à  como
   de PDF que  es-     analista de    converter  PDFs
   tou convertendo     sistemas.      em colunas.

   Quando o texto é convertido, fica assim:

   Este é um texto
   Meu nome é
   Minha dúvida se
   exemplo do tipo
   Paulo e sou
   refere à como
   de PDF que es-
   analista de
   converter PDFs
   tou convertendo
   sistemas.
   em colunas.

   Sugestões?

Abs,
Paulo


Flavio Coelho

unread,
Nov 15, 2013, 3:14:59 AM11/15/13
to py...@googlegroups.com

Já tentou converter PDF para HTML e depois para texto?

--
You received this message because you are subscribed to the Google Groups "PyPLN" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pypln+un...@googlegroups.com.
To post to this group, send email to py...@googlegroups.com.
Visit this group at http://groups.google.com/group/pypln.
For more options, visit https://groups.google.com/groups/opt_out.
Message has been deleted

Paulo Marques

unread,
Nov 15, 2013, 9:24:58 AM11/15/13
to py...@googlegroups.com
Estou usando o script que vocês disponibilizaram. Pelo que entendi, ele faz extamente isso... :(
Estou tentando outras alternativas, como o pyPDF. embora ele extraia as colunas corretamente, existem algus erros de espaçamento, conforme abaixo, pois creio que ele faz alguma coisa como os softwares de OCR.

PDF: "Este é um teste de extraçāo de texto de PDF"
TXT: "Este éum testede extraçāode texto dePDF"

Imaginando que minha busca é por "extraçāo de texto" o resultado seria nulo.

Sendo assim, segui o teste buscando string.replace(" ","") em txt.replace(" ",""). Obviamente funciona, mas acredito que tenha que entender o que "acontece" no entorno da string encontrada.

Continuarei buscando uma soluçāo.

ABS,
PAULO

Álvaro Justen [Turicas]

unread,
Nov 18, 2013, 1:19:44 PM11/18/13
to py...@googlegroups.com
Paulo, será que o pyPDF não coloca algum "caractere invisível" onde
deveriam ser os espaços? Se sim, daria para os substituirmos por
espaço -- em alguns conversores isso acontece.
Para verificar quais caracteres existem na string, execute:

print repr(variavel_que_contem_a_string)

Caso você consiga resultados melhores com o pyPDF do que com a solução
que estamos usando agora, podemos fazer uma mudança em nosso código
para incorporar o pyPDF.

[]s
Álvaro Justen "Turicas"
http://turicas.info/ http://twitter.com/turicas
http://CursoDeArduino.com.br/ http://github.com/turicas
+55 21 9 9898-0141


2013/11/15 Paulo Marques <pepcm...@gmail.com>:

Paulo Marques

unread,
Nov 21, 2013, 6:16:16 AM11/21/13
to py...@googlegroups.com
Caros,

   Desculpem pelo post longo. Fiz o teste com uma página do DOU e segue abaixo o resultado:

--------------------------------------------------------
Texto CTRL-C - CTRL-V de parte da página do DOU
===============================================
PORTARIA No- 484, DE 11 DE OUTUBRO DE 2006
O Diretor-Geral do Hospital dos Servidores do Estado, nomeado
na forma da Portaria MS/1634/2005, publicada no DOU/No-
176, de 13/09/2005, no uso das atribuições subdelegadas pela Portaria
CGRH/SAA/MS/N o- 655/99, publicada no BS/CGSG/SAA/MS N.o-
36, volume I, de 03 de setembro de 1999, resolve:
Exonerar a pedido, a contar de 01 de agosto de 2006, ao
servidor PAULO DIAS BARROSO, Médico, matrícula 3188095, código
430060, Classe "A", Padrão "I", do Quadro de Pessoal Ativo
deste Ministério, lotado no Hospital dos Servidores do Estado (SIPAR
33433.007358/2006-26).
LESLIE DE ALBUQUERQUE ALOAN


--------------------------------------------------------
pdftotext -layout
=================
 <!ID735713-0  PORTARIA N o 484, DE 11 DE OUTUBRO DE 2006

                                                  -

                                  PAULO MARCHIORI BUSS
 PORTARIA N o 420, DE 13 DE OUTUBRO DE
2006
                                                                                       -


                          O Diretor-Geral do Hospital dos Servidores do
Estado, no-
                                                                                O
DIRETOR
DO
HOSPITAL
GERAL
DE
BONSUCESSO,




















meado
na
forma
da
Portaria
MS/1634/2005,
publicada
no
DOU/N
o






-
        DIRETORIA DE RECURSOS HUMANOS                                 no
uso de suas atribuições conferidas pela Portaria PT/GM n o 731, de

    -

                 176, de 13/09/2005, no uso das atribuições subdelegadas
pela Portaria
                                                                      07/04/2006,
publicada
no
DOU
n o
69,
de
10/04/2006,
resolve:
                                                                                                         -

                 CGRH/SAA/MS/N o 655/99, publicada no BS/CGSG/SAA/MS N. o

                                     -
          -
                     PORTARIAS DE 16 DE OUTUBRO DE 2006
         <!ID734087-0




                                                                                Conceder
aposentadoria
voluntária
integral
através
do
pro-
                                                                      cesso
n o
250042/001565/2006,
a
ROSANGELA
DAS
NEVES
AL-




36,
volume
I,
de
03
de
setembro
de
1999,
resolve:
        A Diretora de Recursos Humanos da Fundação Oswaldo
MEIDA, matrícula SIAPE 0626431 (Identificação Única 006264311),
               Exonerar a pedido, a contar de 01 de agosto de
2006, ao
Cruz, no uso da competência que lhe foi delegada pela Portaria da
ocupante do cargo de Enfermeiro, Nível Superior, Classe “S”, Padrão
servidor PAULO DIAS BARROSO, Médico, matrícula 3188095, có-
Presidência n o 037/92-PR, de 01 de junho de 1992, resolve:
              -
                                                                      “III”,
do
Quadro
de
Pessoal
deste
Ministério,
lotada
no
Hospital


digo
430060,
Classe
"A",
Padrão
"I",
do
Quadro
de
Pessoal
Ativo
                                                                      Geral
de
Bonsucesso,
com
fundamento
no
artigo
3°,
incisos
I,
II,
III

deste
Ministério,
lotado
no
Hospital
dos
Servidores
do
Estado
(SIPAR
N o 656 - Aposentar por Invalidez o servidor Antonio Rodrigues de
  -                                                                   da
Emenda Constitucional n ° 47/2005, observado o parágrafo único
33433.007358/2006-26).
Souza, mat. SIAPE 464349, ocupante do cargo de Técnico, NI-M-III,     da
citada Emenda, com proventos integrais, incorporando-se 23%
do Quadro de Pessoal Permanente desta Instituição, com fundamento
(vinte e tres por cento) de Adicional por Tempo de Serviço, 160% da
                                LESLIE DE ALBUQUERQUE ALOAN


--------------------------------------------------------
pdftotext -raw
==============
<!ID735713-0PORTARIA No- 484, DE 11 DE OUTUBRO DE 2006
O Diretor-Geral do Hospital dos Servidores do Estado, no-
meado na forma da Portaria MS/1634/2005, publicada no DOU/No-
176, de 13/09/2005, no uso das atribuições subdelegadas pela Portaria
CGRH/SAA/MS/No- 655/99, publicada no BS/CGSG/SAA/MS N.o-
36, volume I, de 03 de setembro de 1999, resolve:
Exonerar a pedido, a contar de 01 de agosto de 2006, ao
servidor PAULO DIAS BARROSO, Médico, matrícula 3188095, có-
digo 430060, Classe "A", Padrão "I", do Quadro de Pessoal Ativo
deste Ministério, lotado no Hospital dos Servidores do Estado (SIPAR
33433.007358/2006-26).
LESLIE DE ALBUQUERQUE ALOAN

--------------------------------------------------------
pdftotext sem parametros
========================
PORTARIA N o 484, DE 11 DE OUTUBRO DE 2006

O Diretor-Geral do Hospital dos Servidores do Estado, nomeado na forma da
Portaria MS/1634/2005, publicada no DOU/N o
176, de 13/09/2005, no uso das atribuições subdelegadas pela Portaria
CGRH/SAA/MS/N o 655/99, publicada no BS/CGSG/SAA/MS N. o
36, volume I, de 03 de setembro de 1999, resolve:
Exonerar a pedido, a contar de 01 de agosto de 2006, ao
servidor PAULO DIAS BARROSO, Médico, matrícula 3188095, código 430060,
Classe "A", Padrão "I", do Quadro de Pessoal Ativo
deste Ministério, lotado no Hospital dos Servidores do Estado (SIPAR
33433.007358/2006-26).
LESLIE DE ALBUQUERQUE ALOAN

--------------------------------------------------------

   A pior opção para mim é usar o "-layout".

   A opção "-raw" talvez precise de um tratamento posterior, pois a quebra
de linha é mantida idêntica ao que está no PDF, ou seja, é possível que
um nome seja quebrado de uma linha para outra.

   Se não utilizar parâmetros, o pdftotext tenta ajeitar o texto, mas não
é perfeito.

   Acredito que utilizar o -raw com alguma coisa como abaixo:

   if linha[-1] == "-":
      linha = linha[:-1].replace("\n","")
   else:
      linha = linha.replace("\n"," ")


Abs,
Paulo

==============================================================================

Paulo Marques

unread,
Nov 23, 2013, 12:21:05 PM11/23/13
to py...@googlegroups.com
Caros,

   Fiz um script que converte com a opção -raw para um temporário. Após a conversão, o script lê o temporário e realiza trata a hifenização de forma simples:

                 fout = codecs.open("filedefinitivo.txt", "w", "utf-8")
                 for linha in filetmp:
                     if linha.replace("\n","")[-1] == "-":
                        saida = linha.replace("\n","")[:-1]
                     else:
                        saida = linha.replace("\n"," ")
                     fout.write(saida)
                     fout.write("\n")
 
   Isto funcionou muito bem para mim, embora o arquivo agora tenha apenas uma linha.

Abs,
Paulo

Álvaro Justen [Turicas]

unread,
Dec 6, 2013, 7:37:46 AM12/6/13
to py...@googlegroups.com
Paulo,

Infelizmente não temos como fugir muito desse problema, pois o formato
PDF se propõe a organizar visualmente os dados e não possui
informações sobre a estrutura dos dados (se é uma tabela, se são duas
colunas etc.). Existem vários softwares que usam heurísticas para, por
exemplo, identificar e extrair tabelas, mas todas elas são baseadas
nas *posições* dos elementos. Leia esse texto para saber mais sobre:

Lendo sobre o assunto encontrei uma biblioteca escrita completamente
em Python que lê PDFs, a PDFMiner:
http://www.unixuser.org/~euske/python/pdfminer/index.html
Para instalá-la, basta executar:
pip install pdfminer
Ela vem com um utilitário chamado pdf2txt.py que converte arquivos
PDFs para texto (ou HTML). Você poderia fazer testes com esse
aplicativo, usando seus dados, por favor?
2013/11/23 Paulo Marques <pepcm...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages