Como extrair texto de um arquivo PDF?


190

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?


9
Eu nunca usei esse módulo, mas isso faz diferença se você abrir o arquivo no modo binário pdf_file = open('sample.pdf', 'rb'):?
usar o seguinte comando

2
Obrigado pela sua resposta. Eu tentei isso com o modo binário, mas nada mudou
Simplicity

3
Copie o texto usando um bom visualizador de PDF - o Acrobat Reader canônico da Adobe, se possível. Você obtém o mesmo resultado? A diferença não é que o texto seja diferente, mas a fonte é - os códigos de caracteres são mapeados para outros valores. Nem todos os PDFs contêm os dados corretos para restaurar isso.
precisa saber é o seguinte

2
Como o PDF contém uma tabela CMap de caracteres, as restrições e soluções alternativas discutidas neste encadeamento são relevantes - stackoverflow.com/questions/4203414/… .
dwarring

2
O PDF realmente contém um CMAP correto; portanto, é trivial converter o mapeamento de caracteres ad hoc em texto sem formatação. No entanto, é necessário processamento adicional para recuperar a ordem correta do texto. O renderizador de quartzo PDF do Mac OS X é um trabalho desagradável! Em sua ordem de renderização original, recebo "m Iuss iisn ga tosam fopllloew DalFo dnogc wthitth ntht eI tutorial" ... Somente depois de classificar por x coordenadas eu obtenho um resultado correto muito mais provável: "Este é um exemplo de documento PDF I" estou usando para acompanhar o tutorial ".
precisa saber é o seguinte

Respostas:


199

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.

O Tika-Python é uma ligação do Python aos serviços Apache Tika ™ REST, permitindo que o Tika seja chamado nativamente na comunidade Python.

from tika import parser # pip install tika

raw = parser.from_file('sample.pdf')
print(raw['content'])

Observe que o Tika é escrito em Java, portanto você precisará de um tempo de execução Java instalado


17
Testei o pypdf2, o tika e tentei e não consegui instalar o textract e o pdftotext. Pypdf2 retornou 99 palavras, enquanto tika retornou todas as 858 palavras da minha fatura de teste. Então eu acabei indo com tika.
Stian

8
Cara eu te amo. Não sei por que uma resposta tão boa está oculta no StackOverflow. Todo mundo continua mencionando que precisamos usar PyPDF2 ou pdfminer, mas eles fedem. Eu estou apaixonado por tika agora
jxpython

15
Continuo recebendo o erro "RuntimeError: Não foi possível iniciar o servidor Tika".
Nav

3
Resposta: Estive procurando por toda a minha vida, por que ninguém mais recomenda Tika? Obrigado!
Jacob-Jan Mosselman

4
Se você precisa executar isso em todos os arquivos PDF em um diretório (recursivamente), tomar este script
Esperança

58

Use textract.

Ele suporta muitos tipos de arquivos, incluindo PDFs

import textract
text = textract.process("path/to/file.extension")

24
O textwrap parece ser um bom invólucro, mas depende de vários utilitários que não são do Python que podem não estar disponíveis com facilidade em um determinado sistema.
David Brown

1
Funciona para PDFs, epubs, etc - processa PDFs nos quais até o PDFMiner falha.
Ulad kasash

como usá-lo no AWS lambda, eu tentei isso, mas, erro de importação ocorreu textract fro
Arun Kumar

5
textracté um invólucro para Poppler:pdftotext(entre outros).
Onewhaleid

1
@ArunKumar: Para usar qualquer coisa no AWS Lambda que não esteja embutida, você deve incluí-lo e todas as dependências extras no seu pacote.
Jeff Learman

51

Veja este código:

import PyPDF2
pdf_file = open('sample.pdf', 'rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
print page_content.encode('utf-8')

A saída é:

!"#$%#$%&%$&'()*%+,-%./01'*23%4
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
%

Usando o mesmo código para ler um pdf em 201308FCR.pdf .A saída é normal.

Sua documentação explica por que:

def extractText(self):
    """
    Locate all text drawing commands, in the order they are provided in the
    content stream, and extract the text.  This works well for some PDF
    files, but poorly for others, depending on the generator used.  This will
    be refined in the future.  Do not rely on the order of text coming out of
    this function, as it will change if this function is made more
    sophisticated.
    :return: a unicode string object.
    """

@ VineshTP: Você está recebendo alguma coisa para o page_content? Se sim, então ver se isso ajuda usando uma codificação diferente que não seja (utf-8)
Quinn

Melhor I biblioteca encontrado para a leitura do pdf usando python é 'tika'
Vineesh TP

201308FCR.pdf não encontrado.
Chaitanya Bapat

30

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 pdftotextxpdf (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):

import os, subprocess
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
args = ["/usr/local/bin/pdftotext",
        '-enc',
        'UTF-8',
        "{}/my-pdf.pdf".format(SCRIPT_DIR),
        '-']
res = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = res.stdout.decode('utf-8')

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++.sona sua função lambda. Eu, pessoalmente, precisava compilar xpdf. Como instruções para isso explodiriam essa resposta, eu as coloquei no meu blog pessoal .


4
Oh meu Deus, funciona !! Finalmente, uma solução que extrai o texto na ordem correta! Quero te abraçar por esta resposta! (Ou se você não gosta de abraços, aqui está um café / cerveja / ...)
virtual

4
feliz que ajudou! A votação dá a mesma sensação que um abraço, então eu estou bem!
Hansaplast

simples ... gr8 fora da caixa pensando!
Shantanu pathak 13/08/19

10

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.


-1 porque o OP está solicitando a leitura de pdfs em Python e, embora exista um wrapper xpdf para python, ele é mal mantido.
Cduguet

9

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.

O Tika-Python é uma ligação do Python aos serviços Apache Tika ™ REST, permitindo que o Tika seja chamado nativamente na comunidade Python.

from tika import parser

raw = parser.from_file("///Users/Documents/Textos/Texto1.pdf")
raw = str(raw)

safe_text = raw.encode('utf-8', errors='ignore')

safe_text = str(safe_text).replace("\n", "").replace("\\", "")
print('--- safe text ---' )
print( safe_text )

3
agradecimentos especiais para.encode('utf-8', errors='ignore')
Evgeny

AttributeError: módulo 'os' não tem atributo 'setsid'
keramat 22/02

7

O código abaixo é uma solução para a pergunta no Python 3 . Antes de executar o código, verifique se você instalou a PyPDF2biblioteca em seu ambiente. Se não estiver instalado, abra o prompt de comando e execute o seguinte comando:

pip3 install PyPDF2

Código da solução:

import PyPDF2
pdfFileObject = open('sample.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObject)
count = pdfReader.numPages
for i in range(count):
    page = pdfReader.getPage(i)
    print(page.extractText())

2
Como você salvaria todo o conteúdo em um arquivo de texto e o usaria para uma análise mais aprofundada
Rahul Agarwal

7
Isso não resolve o problema mencionado na pergunta real.
Soumik Rakshit

7

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


pymupdf é a melhor solução observei, não requer bibliotecas adicionais C ++ como pdftotext ou java como tika
Kay

O pymypdf é realmente a melhor solução, sem servidor ou bibliotecas adicionais, e funciona com arquivos em que PyPDF2 PypDF3 PyPDF4 recupera uma sequência de texto vazia. Muito Obrigado!
Andrea Bisello 26/02

para instalar o pymupdf, execute 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 usando my_extracted_text.splitlines()para dividir o texto em linhas, em uma lista.
erickfis 9/04

PyMuPDF foi realmente surpreendente. Obrigado.
erfelipe

6

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.


Mensagem da seguinte maneira ao instalar o pdf2text Collecting PDFMiner (from pdf2text), por isso não entendo essa resposta agora.
zhy 24/09/19

pdf2text e pdftotext são diferentes. Você pode usar o link da resposta.
Dharam

ESTÁ BEM. Isso é um pouco confuso.
Zhy


5

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

import PyPDF2
import collections
pdf_file = open('samples.pdf', 'rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
c = collections.Counter(range(number_of_pages))
for i in c:
   page = read_pdf.getPage(i)
   page_content = page.extractText()
   print page_content.encode('utf-8')

O único problema aqui é que o conteúdo da nova página substitui a última
Rahul Agarwal

3

Aqui está o código mais simples para extrair texto

código:

# importing required modules
import PyPDF2

# creating a pdf file object
pdfFileObj = open('filename.pdf', 'rb')

# creating a pdf reader object
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

# printing number of pages in pdf file
print(pdfReader.numPages)

# creating a page object
pageObj = pdfReader.getPage(5)

# extracting text from page
print(pageObj.extractText())

# closing the pdf file object
pdfFileObj.close()

Recomende 'tika'
Vineesh TP

2

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:

from py4j.java_gateway import JavaGateway

gw = JavaGateway()
result = gw.entry_point.strip('samples/bus.pdf')

# result is a dict of {
#   'success': 'true' or 'false',
#   'payload': pdf file content if 'success' is 'true'
#   'error': error message if 'success' is 'false'
# }

print result['payload']

Exemplo de saída do PDFLayoutTextStripper : insira a descrição da imagem aqui

Você pode ver mais detalhes aqui Stripper com Python


2

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:

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO

def convert_pdf_to_txt(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = open(path, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos=set()


    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
        interpreter.process_page(page)


    text = retstr.getvalue()

    fp.close()
    device.close()
    retstr.close()
    return text

text= convert_pdf_to_txt('test.pdf')
print(text)

Nb. A versão mais recente não usa mais o codecarg . Eu device = TextConverter(rsrcmgr, retstr, laparams=laparams)
corrigi

1

Para extrair texto de PDF, use o código abaixo

import PyPDF2
pdfFileObj = open('mypdf.pdf', 'rb')

pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

print(pdfReader.numPages)

pageObj = pdfReader.getPage(0)

a = pageObj.extractText()

print(a)

0

Estou adicionando código para fazer isso: Está funcionando bem para mim:

# This works in python 3
# required python packages
# tabula-py==1.0.0
# PyPDF2==1.26.0
# Pillow==4.0.0
# pdfminer.six==20170720

import os
import shutil
import warnings
from io import StringIO

import requests
import tabula
from PIL import Image
from PyPDF2 import PdfFileWriter, PdfFileReader
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage

warnings.filterwarnings("ignore")


def download_file(url):
    local_filename = url.split('/')[-1]
    local_filename = local_filename.replace("%20", "_")
    r = requests.get(url, stream=True)
    print(r)
    with open(local_filename, 'wb') as f:
        shutil.copyfileobj(r.raw, f)

    return local_filename


class PDFExtractor():
    def __init__(self, url):
        self.url = url

    # Downloading File in local
    def break_pdf(self, filename, start_page=-1, end_page=-1):
        pdf_reader = PdfFileReader(open(filename, "rb"))
        # Reading each pdf one by one
        total_pages = pdf_reader.numPages
        if start_page == -1:
            start_page = 0
        elif start_page < 1 or start_page > total_pages:
            return "Start Page Selection Is Wrong"
        else:
            start_page = start_page - 1

        if end_page == -1:
            end_page = total_pages
        elif end_page < 1 or end_page > total_pages - 1:
            return "End Page Selection Is Wrong"
        else:
            end_page = end_page

        for i in range(start_page, end_page):
            output = PdfFileWriter()
            output.addPage(pdf_reader.getPage(i))
            with open(str(i + 1) + "_" + filename, "wb") as outputStream:
                output.write(outputStream)

    def extract_text_algo_1(self, file):
        pdf_reader = PdfFileReader(open(file, 'rb'))
        # creating a page object
        pageObj = pdf_reader.getPage(0)

        # extracting extract_text from page
        text = pageObj.extractText()
        text = text.replace("\n", "").replace("\t", "")
        return text

    def extract_text_algo_2(self, file):
        pdfResourceManager = PDFResourceManager()
        retstr = StringIO()
        la_params = LAParams()
        device = TextConverter(pdfResourceManager, retstr, codec='utf-8', laparams=la_params)
        fp = open(file, 'rb')
        interpreter = PDFPageInterpreter(pdfResourceManager, device)
        password = ""
        max_pages = 0
        caching = True
        page_num = set()

        for page in PDFPage.get_pages(fp, page_num, maxpages=max_pages, password=password, caching=caching,
                                      check_extractable=True):
            interpreter.process_page(page)

        text = retstr.getvalue()
        text = text.replace("\t", "").replace("\n", "")

        fp.close()
        device.close()
        retstr.close()
        return text

    def extract_text(self, file):
        text1 = self.extract_text_algo_1(file)
        text2 = self.extract_text_algo_2(file)

        if len(text2) > len(str(text1)):
            return text2
        else:
            return text1

    def extarct_table(self, file):

        # Read pdf into DataFrame
        try:
            df = tabula.read_pdf(file, output_format="csv")
        except:
            print("Error Reading Table")
            return

        print("\nPrinting Table Content: \n", df)
        print("\nDone Printing Table Content\n")

    def tiff_header_for_CCITT(self, width, height, img_size, CCITT_group=4):
        tiff_header_struct = '<' + '2s' + 'h' + 'l' + 'h' + 'hhll' * 8 + 'h'
        return struct.pack(tiff_header_struct,
                           b'II',  # Byte order indication: Little indian
                           42,  # Version number (always 42)
                           8,  # Offset to first IFD
                           8,  # Number of tags in IFD
                           256, 4, 1, width,  # ImageWidth, LONG, 1, width
                           257, 4, 1, height,  # ImageLength, LONG, 1, lenght
                           258, 3, 1, 1,  # BitsPerSample, SHORT, 1, 1
                           259, 3, 1, CCITT_group,  # Compression, SHORT, 1, 4 = CCITT Group 4 fax encoding
                           262, 3, 1, 0,  # Threshholding, SHORT, 1, 0 = WhiteIsZero
                           273, 4, 1, struct.calcsize(tiff_header_struct),  # StripOffsets, LONG, 1, len of header
                           278, 4, 1, height,  # RowsPerStrip, LONG, 1, lenght
                           279, 4, 1, img_size,  # StripByteCounts, LONG, 1, size of extract_image
                           0  # last IFD
                           )

    def extract_image(self, filename):
        number = 1
        pdf_reader = PdfFileReader(open(filename, 'rb'))

        for i in range(0, pdf_reader.numPages):

            page = pdf_reader.getPage(i)

            try:
                xObject = page['/Resources']['/XObject'].getObject()
            except:
                print("No XObject Found")
                return

            for obj in xObject:

                try:

                    if xObject[obj]['/Subtype'] == '/Image':
                        size = (xObject[obj]['/Width'], xObject[obj]['/Height'])
                        data = xObject[obj]._data
                        if xObject[obj]['/ColorSpace'] == '/DeviceRGB':
                            mode = "RGB"
                        else:
                            mode = "P"

                        image_name = filename.split(".")[0] + str(number)

                        print(xObject[obj]['/Filter'])

                        if xObject[obj]['/Filter'] == '/FlateDecode':
                            data = xObject[obj].getData()
                            img = Image.frombytes(mode, size, data)
                            img.save(image_name + "_Flate.png")
                            # save_to_s3(imagename + "_Flate.png")
                            print("Image_Saved")

                            number += 1
                        elif xObject[obj]['/Filter'] == '/DCTDecode':
                            img = open(image_name + "_DCT.jpg", "wb")
                            img.write(data)
                            # save_to_s3(imagename + "_DCT.jpg")
                            img.close()
                            number += 1
                        elif xObject[obj]['/Filter'] == '/JPXDecode':
                            img = open(image_name + "_JPX.jp2", "wb")
                            img.write(data)
                            # save_to_s3(imagename + "_JPX.jp2")
                            img.close()
                            number += 1
                        elif xObject[obj]['/Filter'] == '/CCITTFaxDecode':
                            if xObject[obj]['/DecodeParms']['/K'] == -1:
                                CCITT_group = 4
                            else:
                                CCITT_group = 3
                            width = xObject[obj]['/Width']
                            height = xObject[obj]['/Height']
                            data = xObject[obj]._data  # sorry, getData() does not work for CCITTFaxDecode
                            img_size = len(data)
                            tiff_header = self.tiff_header_for_CCITT(width, height, img_size, CCITT_group)
                            img_name = image_name + '_CCITT.tiff'
                            with open(img_name, 'wb') as img_file:
                                img_file.write(tiff_header + data)

                            # save_to_s3(img_name)
                            number += 1
                except:
                    continue

        return number

    def read_pages(self, start_page=-1, end_page=-1):

        # Downloading file locally
        downloaded_file = download_file(self.url)
        print(downloaded_file)

        # breaking PDF into number of pages in diff pdf files
        self.break_pdf(downloaded_file, start_page, end_page)

        # creating a pdf reader object
        pdf_reader = PdfFileReader(open(downloaded_file, 'rb'))

        # Reading each pdf one by one
        total_pages = pdf_reader.numPages

        if start_page == -1:
            start_page = 0
        elif start_page < 1 or start_page > total_pages:
            return "Start Page Selection Is Wrong"
        else:
            start_page = start_page - 1

        if end_page == -1:
            end_page = total_pages
        elif end_page < 1 or end_page > total_pages - 1:
            return "End Page Selection Is Wrong"
        else:
            end_page = end_page

        for i in range(start_page, end_page):
            # creating a page based filename
            file = str(i + 1) + "_" + downloaded_file

            print("\nStarting to Read Page: ", i + 1, "\n -----------===-------------")

            file_text = self.extract_text(file)
            print(file_text)
            self.extract_image(file)

            self.extarct_table(file)
            os.remove(file)
            print("Stopped Reading Page: ", i + 1, "\n -----------===-------------")

        os.remove(downloaded_file)


# I have tested on these 3 pdf files
# url = "http://s3.amazonaws.com/NLP_Project/Original_Documents/Healthcare-January-2017.pdf"
url = "http://s3.amazonaws.com/NLP_Project/Original_Documents/Sample_Test.pdf"
# url = "http://s3.amazonaws.com/NLP_Project/Original_Documents/Sazerac_FS_2017_06_30%20Annual.pdf"
# creating the instance of class
pdf_extractor = PDFExtractor(url)

# Getting desired data out
pdf_extractor.read_pages(15, 23)

0

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:

import os
import os.path

tika_dir=os.path.join(os.path.dirname(__file__),'<tika-app-xxx>.jar')

def extract_pdf(source_pdf:str,target_txt:str):
    os.system('java -jar '+tika_dir+' -t {} > {}'.format(source_pdf,target_txt))

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_pdfpode 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.


solução totalmente não pitônica. Se você recomenda isso, deve criar um pacote python e solicitar que as pessoas o importem. Não recomende o uso de execuções de código java na linha de comando em python.
Michael Tamillow

@ MichaelTamillow, se escrever um código que será carregado no pypi, admito que não é uma boa ideia. No entanto, se é apenas um script python com shebang para uso temporário, não é ruim, não é?
precisa saber é

Bem, a pergunta não é intitulada "python" - então eu acho que declarar "aqui está como fazer isso em Java" é mais aceitável do que isso. Tecnicamente, você pode fazer o que quiser no Python. É por isso que é incrível e terrível. O uso temporário é um mau hábito.
Michael Tamillow

0

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 lista pdf_text_list.

from tika import parser
import glob

def read_pdf(filename):
    text = parser.from_file(filename)
    return(text)


all_files = glob.glob(".\\pdfs\\*.pdf")
pdf_text_list=[]
for i,file in enumerate(all_files):
    text=read_pdf(file)
    pdf_text_list.append(text['content'])

print(pdf_text_list)

-1

PyPDF2 funciona, mas os resultados podem variar. Estou vendo resultados bastante inconsistentes de sua extração de resultados.

reader=PyPDF2.pdf.PdfFileReader(self._path)
eachPageText=[]
for i in range(0,reader.getNumPages()):
    pageText=reader.getPage(i).extractText()
    print(pageText)
    eachPageText.append(pageText)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.