La extracción de texto de pdf con pdfminer da múltiples copias.

Estoy tratando de extraer texto de un archivo PDF utilizando PDFMiner (el código que se encuentra en ¿ Extraer texto de un archivo PDF utilizando PDFMiner en python? ). No cambié el código excepto la ruta / a / pdf. Sorprendentemente, el código devuelve varias copias del mismo documento. Obtuve el mismo resultado con otros archivos pdf. ¿Necesito pasar otros argumentos o me estoy perdiendo algo? Cualquier ayuda es muy apreciada. Por si acaso, proporciono el código:

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfpage import PDFPage from cStringIO 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 = file(path, 'rb') interpreter = PDFPageInterpreter(rsrcmgr, device) password = "" maxpages = 0 caching = True pagenos=set() fstr = '' for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True): interpreter.process_page(page) str = retstr.getvalue() fstr += str fp.close() device.close() retstr.close() return fstr print convert_pdf_to_txt("test.pdf") 

Mi respuesta fue un poco incorrecta en el hilo al que está haciendo referencia. Encontré el error y olvidé actualizar mi respuesta.

Debido a que la documentación es bastante escasa con pdfminer, no puedo explicar completamente por qué esto funciona como lo hace. Esperemos que alguien que conozca la biblioteca de pdfminer un poco mejor pueda darnos una idea.

Todo lo que sé es que tienes que hacer text = retstr.getvalue() fuera del bucle for. Solo puedo asumir que se está actualizando retstr como si estuviéramos haciendo final_text += text dentro del bucle for, así que una vez que todo esté terminado solo tenemos que hacer text = retstr.getvalue() para obtener el texto de todas las páginas.

 from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfpage import PDFPage from cStringIO 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 = file(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 print convert_pdf_to_txt("test.pdf") 

Espero que esto haya ayudado!