¿Cómo extraer texto de un archivo PDF?

190

Estoy tratando de extraer el texto incluido en este archivo PDF usando Python.

Estoy usando el módulo PyPDF2 y tengo el siguiente 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

Cuando ejecuto el código, obtengo el siguiente resultado que es diferente del incluido en el documento PDF:

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

¿Cómo puedo extraer el texto tal como está en el documento PDF?

Sencillez
fuente
9
Nunca he usado ese módulo, pero ¿hay alguna diferencia si abres el archivo en modo binario pdf_file = open('sample.pdf', 'rb'):?
PM 2Ring
2
Gracias por su respuesta. Intenté eso con el modo binario, pero nada cambió
Simplicidad
3
Copie el texto usando un buen visor de PDF, el Adobe Acrobat Reader canónico, si es posible. ¿Obtienes el mismo resultado? La diferencia no es que el texto sea ​​diferente, sino que la fuente es: los códigos de caracteres se asignan a otros valores. No todos los archivos PDF contienen los datos correctos para restaurar esto.
usr2564301
2
Ese PDF contiene una tabla CMap de caracteres, por lo que las restricciones y las soluciones discutidas en este hilo son relevantes: stackoverflow.com/questions/4203414/… .
luchando el
2
De hecho, el PDF contiene un CMAP correcto, por lo que es trivial convertir la asignación de caracteres ad hoc en texto sin formato. Sin embargo, se necesita un procesamiento adicional para recuperar el orden correcto del texto. ¡El renderizador de PDF de cuarzo de Mac OS X es un trabajo desagradable! En su orden de representación original, obtengo "m T'h iuss iisn ga tosam fopllloew DalFo dnogc wumithe ntht eI tutorial" ... Solo después de ordenar por coordenadas x obtengo un resultado correcto mucho más probable: "Este es un documento PDF de muestra I Estoy usando para seguir junto con el tutorial ".
usr2564301

Respuestas:

199

Estaba buscando una solución simple para Python 3.xy Windows. Parece que no hay soporte de textract , lo cual es desafortunado, pero si está buscando una solución simple para Windows / Python 3, consulte el paquete tika , realmente sencillo para leer archivos PDF.

Tika-Python es un enlace de Python a los servicios REST de Apache Tika ™ que permite llamar a Tika de forma nativa en la comunidad de Python.

from tika import parser # pip install tika

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

Tenga en cuenta que Tika está escrito en Java, por lo que necesitará un tiempo de ejecución de Java instalado

DJK
fuente
17
Probé pypdf2, tika e intenté y no pude instalar textract y pdftotext. Pypdf2 devolvió 99 palabras, mientras que tika devolvió las 858 palabras de mi factura de prueba. Así que terminé yendo con tika.
Stian
8
Hombre te amo No sé por qué una respuesta tan buena está oculta en StackOverflow. Todos siguen mencionando que necesitamos usar PyPDF2 o pdfminer, pero apestan. Estoy enamorado de tika ahora
jxpython
15
Sigo recibiendo el error "RuntimeError: no se puede iniciar el servidor Tika".
Nav
3
Respuesta He estado buscando toda mi vida, ¿por qué nadie más recomienda Tika? ¡Gracias!
Jacob-Jan Mosselman
44
Si necesita ejecutar esto en todos los archivos PDF en un directorio (recursivamente), tome este script
Hope
58

Usa textract.

Admite muchos tipos de archivos, incluidos archivos PDF

import textract
text = textract.process("path/to/file.extension")
Jakobovski
fuente
24
Textwrap parece ser un buen contenedor, pero se basa en numerosas utilidades que no son de Python que pueden no estar fácilmente disponibles en un sistema dado.
David Brown
1
Funciona para archivos PDF, epubs, etc. - procesa archivos PDF en los que incluso PDFMiner falla.
Ulad Kasach
cómo usarlo en aws lambda, probé esto pero, ocurrió un error de importación de extracto de texto
Arun Kumar
55
textractes un contenedor para Poppler:pdftotext(entre otros).
onewhaleid
1
@ArunKumar: Para usar cualquier cosa en AWS Lambda que no esté integrada, debe incluirla y todas las dependencias adicionales en su paquete.
Jeff Learman
51

Mira 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')

El resultado es:

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

Usando el mismo código para leer un pdf de 201308FCR.pdf . La salida es normal.

Su documentación explica por qué:

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.
    """
Quinn
fuente
@VineeshTP: ¿Está obteniendo algo para page_content? En caso afirmativo, vea si ayuda utilizando una codificación diferente a (utf-8)
Quinn
La mejor biblioteca que encontré para leer el pdf usando python es 'tika'
Vineesh TP
201308FCR.pdf no encontrado.
Chaitanya Bapat
30

Después de probar textract (que parecía tener demasiadas dependencias) y pypdf2 (que no podía extraer texto de los archivos PDF con los que probé) y tika (que era demasiado lento) terminé usando pdftotextxpdf (como ya se sugirió en otra respuesta) y acabo de llamar el binario de python directamente (es posible que deba adaptar la ruta a 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')

Hay pdftotext que hace básicamente lo mismo, pero esto supone pdftotext en / usr / local / bin, mientras que estoy usando esto en AWS lambda y quería usarlo desde el directorio actual.

Por cierto: para usar esto en lambda, necesita poner el binario y la dependencia libstdc++.soen su función lambda. Yo personalmente necesitaba compilar xpdf. Como las instrucciones para esto explotarían esta respuesta, las puse en mi blog personal .

hansaplast
fuente
44
¡Dios mío, funciona! ¡Finalmente, una solución que extrae el texto en el orden correcto! ¡Quiero abrazarte por esta respuesta! (O si no te gustan los abrazos, aquí hay un café / cerveza virtual ...)
DonQuiKong
44
me alegro de que haya ayudado! ¡Votar da la misma sensación que abrazar, así que estoy bien!
Hansaplast
simple ... gr8 fuera de la caja de pensamiento!
Shantanu Pathak
10

Es posible que desee utilizar xPDF probado con el tiempo y herramientas derivadas para extraer texto, ya que pyPDF2 parece tener varios problemas con la extracción de texto todavía.

La respuesta larga es que hay muchas variaciones sobre cómo se codifica un texto dentro de PDF y que puede requerir decodificar la cadena de PDF, luego puede necesitar mapear con CMAP, luego puede necesitar analizar la distancia entre palabras y letras, etc.

En caso de que el PDF esté dañado (es decir, que muestre el texto correcto pero al copiarlo da basura) y realmente necesite extraer texto, entonces puede considerar convertir el PDF a imagen (usando ImageMagik ) y luego usar Tesseract para obtener texto de la imagen usando OCR.

Eugene
fuente
-1 porque el OP está pidiendo leer archivos PDF en Python, y aunque hay un contenedor xpdf para python, está mal mantenido.
cduguet
9

He probado muchos convertidores de PDF de Python y me gusta actualizar esta revisión. Tika es una de las mejores. Pero PyMuPDF es una buena noticia del usuario @ehsaneha.

Hice un código para compararlos en: https://github.com/erfelipe/PDFtextExtraction Espero poder ayudarte.

Tika-Python es un enlace de Python a los servicios REST de Apache Tika ™ que permite llamar a Tika de forma nativa en la comunidad de 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 )
erfelipe
fuente
3
agradecimiento especial por.encode('utf-8', errors='ignore')
Evgeny
AttributeError: el módulo 'os' no tiene el atributo 'setsid'
keramat
7

El siguiente código es una solución a la pregunta en Python 3 . Antes de ejecutar el código, asegúrese de haber instalado la PyPDF2biblioteca en su entorno. Si no está instalado, abra el símbolo del sistema y ejecute el siguiente comando:

pip3 install PyPDF2

Código de solución:

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())
Steffi Keran Rani J
fuente
2
¿Cómo guardarías todo el contenido en un archivo de texto y lo usarías para un análisis posterior
Rahul Agarwal
77
Esto no resuelve el problema mencionado en la pregunta real.
Soumik Rakshit
7

PyPDF2 en algunos casos ignora los espacios en blanco y hace que el texto resultante sea un desastre, pero uso PyMuPDF y estoy realmente satisfecho de que pueda usar este enlace para obtener más información

ehsaneha
fuente
pymupdf es la mejor solución que observé, no requiere bibliotecas C ++ adicionales como pdftotext o java como tika
Kay
pymypdf es realmente la mejor solución, no hay servidores o bibliotecas adicionales, y funciona con archivos donde PyPDF2 PypDF3 PyPDF4 recupera una cadena de texto vacía. ¡muchas gracias!
Andrea Bisello
para instalar pymupdf, ejecuta pip install pymupdf==1.16.16. Usando esta versión específica porque hoy la versión más nueva (17) no está funcionando. Opté por pymupdf porque extrae campos de ajuste de texto en una nueva línea de caracteres \n. Entonces extraigo el texto de pdf a una cadena con pymupdf y luego lo uso my_extracted_text.splitlines()para dividir el texto en líneas, en una lista.
erickfis
PyMuPDF fue realmente sorprendente. Gracias.
erfelipe
6

pdftotext es el mejor y más simple! pdftotext también se reserva la estructura también.

Probé PyPDF2, PDFMiner y algunos otros, pero ninguno de ellos dio un resultado satisfactorio.

Dharam
fuente
Mensaje como sigue al instalar pdf2text, Collecting PDFMiner (from pdf2text)por lo que no entiendo esta respuesta ahora.
zhy
pdf2text y pdftotext son diferentes. Puedes usar el enlace de la respuesta.
Dharam
OKAY. Eso es un poco confuso.
zhy
5

El PDF de varias páginas se puede extraer como texto en una sola extensión en lugar de proporcionar un número de página individual como argumento utilizando el código siguiente

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')
Yogui
fuente
El único problema aquí es que el contenido de la nueva página sobrescribe la última
Rahul Agarwal
3

Aquí está el código más simple para extraer 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()
infinito
fuente
Recomiendo 'tika'
Vineesh TP
2

Encontré una solución aquí PDFLayoutTextStripper

Es bueno porque puede mantener el diseño del PDF original .

Está escrito en Java, pero he agregado una puerta de enlace para admitir Python.

Código de muestra:

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']

Salida de muestra de PDFLayoutTextStripper : ingrese la descripción de la imagen aquí

Puedes ver más detalles aquí Stripper con Python

aunque
fuente
2

Tengo un mejor trabajo que el OCR y mantener la alineación de la página mientras extraigo el texto de un PDF. Debería ser de ayuda:

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)
Anit Chakraborty
fuente
Nótese bien. La última versión ya no usa el codecargumento . Lo arreglé eliminándolo, es decirdevice = TextConverter(rsrcmgr, retstr, laparams=laparams)
atomh33ls
1

Para extraer texto de PDF, use el siguiente código

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

pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

print(pdfReader.numPages)

pageObj = pdfReader.getPage(0)

a = pageObj.extractText()

print(a)
Elavarasan r
fuente
0

Estoy agregando código para lograr esto: está funcionando bien para mí:

# 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)
Ritesh Shanker
fuente
0

Puede descargar tika-app-xxx.jar (más reciente) desde aquí .

Luego, coloque este archivo .jar en la misma carpeta de su archivo de script de Python.

luego inserte el siguiente código en el 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))

La ventaja de este método:

Menos dependencia. El archivo .jar único es más fácil de administrar que un paquete de Python.

Soporte multiformato. La posición source_pdfpuede ser el directorio de cualquier tipo de documento. (.doc, .html, .odt, etc.)

A hoy. tika-app.jar siempre se publica antes de la versión relevante del paquete tika python.

estable. Es mucho más estable y está bien mantenido (Desarrollado por Apache) que PyPDF.

desventaja:

Un jre-headless es necesario.

pah8J
fuente
Solución totalmente no pitónica. Si recomienda esto, debe crear un paquete de Python y hacer que la gente lo importe. No recomiendo usar ejecuciones de línea de comandos de código java en python.
Michael Tamillow
@MichaelTamillow, si escribo un código que se va a cargar en pypi, admito que no es una buena idea. Sin embargo, si es solo un script de Python con shebang para uso temporal, no está mal, ¿no?
pah8J
Bueno, la pregunta no se titula "python", por lo que creo que decir "aquí está cómo hacerlo en Java" es más aceptable que esto. Técnicamente, puedes hacer lo que quieras en Python. Por eso es asombroso y terrible. El uso temporal es un mal hábito.
Michael Tamillow
0

Si lo prueba en Anaconda en Windows, PyPDF2 podría no manejar algunos de los PDF con estructura no estándar o caracteres unicode. Recomiendo usar el siguiente código si necesita abrir y leer muchos archivos pdf: el texto de todos los archivos pdf en la carpeta con la ruta relativa .//pdfs//se almacenará en la 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)
DovaX
fuente
-1

PyPDF2 funciona, pero los resultados pueden variar. Estoy viendo resultados bastante inconsistentes de su extracción 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)
bmc
fuente