Isso funcionará em maio de 2020 usando PDFminer six em Python3.
Instalando o pacote
$ pip install pdfminer.six
Importando o pacote
from pdfminer.high_level import extract_text
Usando um PDF salvo no disco
text = extract_text('report.pdf')
Ou alternativamente:
with open('report.pdf','rb') as f:
text = extract_text(open('report.pdf','rb'))
Usando PDF já na memória
Se o PDF já estiver na memória, por exemplo, se recuperado da web com a biblioteca de solicitações, ele pode ser convertido em um fluxo usando a io
biblioteca:
import io
response = requests.get(url)
text = extract_text(io.BytesIO(response.content))
Desempenho e confiabilidade em comparação com PyPDF2
PDFminer.six funciona de forma mais confiável do que PyPDF2 (que falha com certos tipos de PDFs), em particular o PDF versão 1.7
No entanto, a extração de texto com PDFminer.six é significativamente mais lenta do que PyPDF2 por um fator de 6.
timeit
Cronometrei a extração de texto com um MBP de 15 "(2018), cronometrando apenas a função de extração (sem abertura de arquivo etc.) com um PDF de 10 páginas e obtive os seguintes resultados:
PDFminer.six: 2.88 sec
PyPDF2: 0.45 sec
O pdfminer.six também ocupa uma grande área de cobertura, exigindo pycryptodome, que precisa do GCC e de outras coisas instaladas, enviando uma imagem docker de instalação mínima no Alpine Linux de 80 MB a 350 MB. PyPDF2 não tem impacto de armazenamento perceptível.