Estou tentando extrair o texto incluído neste arquivo PDF usando Python
.
Estou usando o módulo PyPDF2 e tenho o seguinte script:
import PyPDF2
pdf_file = open('sample.pdf')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
print page_content
Quando executo o código, obtenho a seguinte saída, diferente da incluída no documento PDF:
!"#$%#$%&%$&'()*%+,-%./01'*23%4
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
%
Como posso extrair o texto como está no documento PDF?
pdf_file = open('sample.pdf', 'rb')
:?Respostas:
Eu estava procurando uma solução simples para usar em python 3.xe janelas. Parece não haver suporte do textract , o que é lamentável, mas se você estiver procurando por uma solução simples para windows / python 3, verifique o pacote tika , realmente simples para ler pdfs.
Observe que o Tika é escrito em Java, portanto você precisará de um tempo de execução Java instalado
fonte
Use textract.
Ele suporta muitos tipos de arquivos, incluindo PDFs
fonte
textract
é um invólucro paraPoppler:pdftotext
(entre outros).Veja este código:
A saída é:
Usando o mesmo código para ler um pdf em 201308FCR.pdf .A saída é normal.
Sua documentação explica por que:
fonte
Depois de tentar textract (que parecia ter muitas dependências) e pypdf2 (que não conseguia extrair texto dos pdfs com os quais testei) e tika (que era muito lento), acabei usando o
pdftotext
xpdf (como já sugerido em outra resposta) e acabou de chamar o binário diretamente do python (pode ser necessário adaptar o caminho ao pdftotext):Existe o pdftotext que faz basicamente o mesmo, mas isso pressupõe o pdftotext em / usr / local / bin, enquanto eu estou usando isso no AWS lambda e queria usá-lo no diretório atual.
Btw: Para usar isso no lambda, você precisa colocar o binário e a dependência
libstdc++.so
na sua função lambda. Eu, pessoalmente, precisava compilar xpdf. Como instruções para isso explodiriam essa resposta, eu as coloquei no meu blog pessoal .fonte
Você pode usar o xPDF comprovado por tempo e as ferramentas derivadas para extrair texto, pois o pyPDF2 parece ter vários problemas com a extração de texto ainda.
A resposta longa é que existem muitas variações de como um texto é codificado dentro do PDF e que pode ser necessário decodificar a sequência de PDFs, precisar mapear com o CMAP, analisar a distância entre palavras e letras, etc.
Caso o PDF esteja danificado (ou seja, exibindo o texto correto, mas ao copiá-lo com lixo) e você realmente precise extrair texto, convém converter o PDF em imagem (usando o ImageMagik ) e, em seguida, use o Tesseract para obter texto da imagem usando OCR.
fonte
Eu tentei muitos conversores de PDF Python e gostaria de atualizar esta análise. Tika é um dos melhores. Mas PyMuPDF é uma boa notícia para o usuário @ehsaneha.
Eu fiz um código para compará-los em: https://github.com/erfelipe/PDFtextExtraction Espero ajudá-lo.
fonte
.encode('utf-8', errors='ignore')
O código abaixo é uma solução para a pergunta no Python 3 . Antes de executar o código, verifique se você instalou a
PyPDF2
biblioteca em seu ambiente. Se não estiver instalado, abra o prompt de comando e execute o seguinte comando:Código da solução:
fonte
Em alguns casos, o PyPDF2 ignora os espaços em branco e faz com que o texto do resultado seja uma bagunça, mas eu uso o PyMuPDF e estou realmente satisfeito por poder usar este link para obter mais informações
fonte
pip install pymupdf==1.16.16
. Usando esta versão específica, porque hoje a versão mais recente (17) não está funcionando. Optei pelo pymupdf porque extrai os campos de quebra de texto em nova linha de caracteres\n
. Então, estou extraindo o texto de pdf para uma string com pymupdf e depois estou usandomy_extracted_text.splitlines()
para dividir o texto em linhas, em uma lista.O pdftotext é o melhor e mais simples! O pdftotext também reserva a estrutura.
Eu tentei PyPDF2, PDFMiner e alguns outros, mas nenhum deles deu um resultado satisfatório.
fonte
Collecting PDFMiner (from pdf2text)
, por isso não entendo essa resposta agora.Você pode usar o PDFtoText https://github.com/jalan/pdftotext
PDF para texto mantém o recuo do formato de texto, não importa se você possui tabelas.
fonte
O pdf de várias páginas pode ser extraído como texto em uma única extensão, em vez de fornecer o número de página individual como argumento usando o código abaixo
fonte
Aqui está o código mais simples para extrair texto
código:
fonte
Encontrei uma solução aqui PDFLayoutTextStripper
É bom porque pode manter o layout do PDF original .
Está escrito em Java, mas adicionei um Gateway para dar suporte ao Python.
Código de amostra:
Exemplo de saída do PDFLayoutTextStripper :
Você pode ver mais detalhes aqui Stripper com Python
fonte
Eu tenho uma solução melhor do que o OCR e para manter o alinhamento da página enquanto extrai o texto de um PDF. Deve ajudar:
fonte
codec
arg . Eudevice = TextConverter(rsrcmgr, retstr, laparams=laparams)
Para extrair texto de PDF, use o código abaixo
fonte
Estou adicionando código para fazer isso: Está funcionando bem para mim:
fonte
Você pode baixar o tika-app-xxx.jar (mais recente) aqui .
Em seguida, coloque esse arquivo .jar na mesma pasta do seu arquivo de script python.
em seguida, insira o seguinte código no script:
A vantagem deste método:
menos dependência. Um arquivo .jar é mais fácil de gerenciar do que um pacote python.
suporte multi-formato. A posição
source_pdf
pode ser o diretório de qualquer tipo de documento. (.doc, .html, .odt etc.)atualizado. O tika-app.jar sempre é lançado antes da versão relevante do pacote tika python.
estábulo. É muito mais estável e bem mantido (Powered by Apache) do que PyPDF.
desvantagem:
Um jre-headless é necessário.
fonte
Se você tentar no Anaconda no Windows, o PyPDF2 poderá não lidar com alguns dos PDFs com estrutura não padrão ou caracteres unicode. Eu recomendo usar o código a seguir se você precisar abrir e ler muitos arquivos PDF - o texto de todos os arquivos PDF na pasta com caminho relativo
.//pdfs//
será armazenado na listapdf_text_list
.fonte
PyPDF2 funciona, mas os resultados podem variar. Estou vendo resultados bastante inconsistentes de sua extração de resultados.
fonte