Solución:
Aquí hay un ejemplo práctico de extracción de texto de un archivo PDF utilizando la versión actual de PDFMiner (septiembre de 2016)
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
La estructura de PDFMiner cambió recientemente, por lo que debería funcionar para extraer texto de los archivos PDF.
Editar : Sigue funcionando a partir del 7 de junio de 2018. Verificado en la versión 3.x de Python
Editar: la solución funciona con Python 3.7 el 3 de octubre de 2019. Usé la biblioteca de Python pdfminer.six
, lanzado en noviembre de 2018.
excelente respuesta de DuckPuncher, para Python3 asegúrese de instalar pdfminer2 y haga:
import io
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
def convert_pdf_to_txt(path):
rsrcmgr = PDFResourceManager()
retstr = io.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)
fp.close()
device.close()
text = retstr.getvalue()
retstr.close()
return text
Esto funciona en mayo de 2020 usando PDFminer six en Python3.
Instalando el paquete
$ pip install pdfminer.six
Importando el paquete
from pdfminer.high_level import extract_text
Usando un PDF guardado en disco
text = extract_text('report.pdf')
O alternativamente:
with open('report.pdf','rb') as f:
text = extract_text(f)
Usando PDF que ya está en la memoria
Si el PDF ya está en la memoria, por ejemplo, si se recupera de la web con la biblioteca de solicitudes, se puede convertir a una secuencia utilizando el io
Biblioteca:
import io
response = requests.get(url)
text = extract_text(io.BytesIO(response.content))
Rendimiento y confiabilidad en comparación con PyPDF2
PDFminer.six funciona de manera más confiable que PyPDF2 (que falla con ciertos tipos de PDF), en particular PDF versión 1.7
Sin embargo, la extracción de texto con PDFminer.six es significativamente más lenta que PyPDF2 en un factor de 6.
He cronometrado la extracción de texto con timeit
en un MBP de 15 “(2018), cronometrando solo la función de extracción (sin apertura de archivos, etc.) con un PDF de 10 páginas y obtuve los siguientes resultados:
PDFminer.six: 2.88 sec
PyPDF2: 0.45 sec
pdfminer.six también tiene una huella enorme, que requiere pycryptodome que necesita GCC y otras cosas instaladas empujando una imagen de ventana acoplable de instalación mínima en Alpine Linux de 80 MB a 350 MB. PyPDF2 no tiene un impacto de almacenamiento notable.