Come estrarre il testo da un file PDF?


190

Sto cercando di estrarre il testo incluso in questo file PDF utilizzando Python.

Sto usando il modulo PyPDF2 e ho il seguente 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 eseguo il codice, ottengo il seguente output diverso da quello incluso nel documento PDF:

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

Come posso estrarre il testo come è nel documento PDF?


9
Non ho mai usato quel modulo, ma lo fa fare la differenza, se si apre il file in modalità binaria: pdf_file = open('sample.pdf', 'rb')?
PM 2Ring

2
Grazie per la tua risposta. L'ho provato con la modalità binaria, ma non è cambiato nulla
Semplicità,

3
Copia il testo utilizzando un buon visualizzatore di PDF, il canonico Acrobat Reader di Adobe, se possibile. Ottieni lo stesso risultato? La differenza non è che il testo è diverso, ma il carattere lo è: i codici dei caratteri sono associati ad altri valori. Non tutti i PDF contengono i dati corretti per ripristinarli.
usr2564301,

2
Che il PDF contenga una tabella CMap dei caratteri, quindi le restrizioni e le soluzioni alternative discusse in questo thread sono rilevanti: stackoverflow.com/questions/4203414/… .
guerra il

2
Il PDF contiene infatti un CMAP corretto, quindi è banale convertire la mappatura dei caratteri ad hoc in testo semplice. Tuttavia, è necessaria un'ulteriore elaborazione per recuperare l' ordine corretto del testo. Il renderer PDF Quartz di Mac OS X è un brutto lavoro! Nel suo ordine di rendering originale ottengo "m T'h iuss iisn ga tosam fopllloew DalFo dnogc wumithe ntht eI tutorial" ... Solo dopo aver ordinato per coordinate x ottengo un risultato molto più probabile corretto: "Questo è un documento PDF di esempio I sto usando per seguire insieme al tutorial ".
usr2564301

Risposte:


199

Stavo cercando una soluzione semplice da usare per Python 3.xe Windows. Sembra che non ci sia supporto da textract , il che è un peccato, ma se stai cercando una soluzione semplice per windows / python 3 dai un'occhiata al pacchetto tika , davvero semplice per leggere i pdf.

Tika-Python è un'associazione Python ai servizi REST di Apache Tika ™ che consente a Tika di essere chiamato in modo nativo nella comunità Python.

from tika import parser # pip install tika

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

Nota che Tika è scritto in Java, quindi avrai bisogno di un runtime Java installato


17
Ho provato pypdf2, tika e ho provato e non sono riuscito a installare textract e pdftotext. Pypdf2 ha restituito 99 parole mentre tika ha restituito tutte le 858 parole dalla mia fattura di prova. Quindi ho finito per andare con Tika.
Stian,

8
Amico, ti amo. Non so perché una risposta così buona sia nascosta in StackOverflow. Tutti continuano a dire che dobbiamo usare PyPDF2 o pdfminer ma puzzano. Sono innamorato di tika ora
jxpython,

15
Continuo a ricevere un errore "RuntimeError: impossibile avviare il server Tika".
Nav

3
Risposta Ho cercato tutta la mia vita, perché nessun altro raccomanda Tika? Grazie!
Jacob-Jan Mosselman,

4
Se devi eseguirlo su tutti i file PDF in una directory (ricorsivamente), prendi questo script
Hope

58

Usa textract.

Supporta molti tipi di file, inclusi i PDF

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

24
Textwrap sembra essere un buon wrapper, ma si basa su numerose utility non Python che potrebbero non essere facilmente disponibili su un determinato sistema.
David Brown,

1
Funziona con PDF, epub, ecc. - elabora PDF sui quali anche PDFMiner fallisce.
Ulad Kasach,

come usarlo in aws lambda, ho provato questo, ma si è verificato un errore di importazione per textract
Arun Kumar

5
textractè un wrapper per Poppler:pdftotext(tra gli altri).
onewhaleid,

1
@ArunKumar: per utilizzare qualsiasi cosa in AWS Lambda non incorporata, devi includerlo e tutte le dipendenze extra, nel tuo bundle.
Jeff Learman,

51

Guarda questo codice:

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

L'output è:

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

Utilizzando lo stesso codice per leggere un pdf da 201308FCR.pdf . L'output è normale.

La sua documentazione spiega perché:

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

@VineeshTP: stai ottenendo qualcosa per page_content? Se sì, allora vedi se aiuta usando una codifica diversa da (utf-8)
Quinn

La migliore libreria che ho trovato per leggere il pdf usando Python è 'tika'
Vineesh TP

201308FCR.pdf non trovato.
Chaitanya Bapat,

30

Dopo aver provato textract (che sembrava avere troppe dipendenze) e pypdf2 (che non riuscivano a estrarre il testo dai pdf con cui ho provato) e tika (che era troppo lento) ho finito per usare pdftotextda xpdf (come già suggerito in un'altra risposta) e ho appena chiamato direttamente il binario da python (potrebbe essere necessario adattare il percorso 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')

C'è pdftotext che fa sostanzialmente lo stesso, ma questo presuppone pdftotext in / usr / local / bin mentre lo sto usando in AWS lambda e volevo usarlo dalla directory corrente.

Btw: Per usare questo su lambda devi mettere il binario e la dipendenza libstdc++.sonella tua funzione lambda. Personalmente ho dovuto compilare xpdf. Poiché le istruzioni per questo farebbero saltare in aria questa risposta, le ho messe sul mio blog personale .


4
Oh mio Dio, funziona !! Finalmente una soluzione che estrae il testo nell'ordine corretto! Voglio abbracciarti per questa risposta! (O se non ti piacciono gli abbracci, ecco un caffè / birra virtuale / ...)
DonQuiKong

4
felice che abbia aiutato! Il voto dà la stessa sensazione dell'abbraccio, quindi sto bene!
hansaplast,

semplice ... gr8 fuori dagli schemi!
shantanu pathak,

10

Potresti voler usare xPDF collaudato nel tempo e strumenti derivati ​​per estrarre il testo, poiché pyPDF2 sembra avere ancora vari problemi con l'estrazione del testo.

La risposta lunga è che ci sono molte variazioni su come un testo è codificato all'interno del PDF e che potrebbe richiedere la decodifica della stringa PDF stessa, quindi potrebbe essere necessario mappare con CMAP, quindi potrebbe essere necessario analizzare la distanza tra parole e lettere ecc.

Nel caso in cui il PDF sia danneggiato (ad es. La visualizzazione del testo corretto ma durante la copia genera immondizia) e hai davvero bisogno di estrarre il testo, allora potresti prendere in considerazione la conversione di PDF in immagine (usando ImageMagik ) e quindi usare Tesseract per ottenere testo dall'immagine usando OCR.


-1 perché l'OP richiede la lettura di file PDF in Python e sebbene sia presente un wrapper xpdf per Python, è mal gestito.
cduguet

9

Ho provato molti convertitori Python PDF e mi piace aggiornare questa recensione. Tika è uno dei migliori. Ma PyMuPDF è una buona notizia per l'utente di @ehsaneha.

Ho fatto un codice per confrontarli in: https://github.com/erfelipe/PDFtextExtraction Spero di aiutarti.

Tika-Python è un'associazione Python ai servizi REST di Apache Tika ™ che consente a Tika di essere chiamato in modo nativo nella comunità 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
ringraziamenti speciali per.encode('utf-8', errors='ignore')
Evgeny

AttributeError: il modulo 'os' non ha attributi 'setsid'
keramat

7

Il codice seguente è una soluzione alla domanda in Python 3 . Prima di eseguire il codice, assicurarsi di aver installato la PyPDF2libreria nel proprio ambiente. Se non installato, aprire il prompt dei comandi ed eseguire il comando seguente:

pip3 install PyPDF2

Codice soluzione:

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
Come vorresti salvare tutto il contenuto in un file di testo e utilizzarlo per ulteriori analisi
Rahul Agarwal

7
Questo non risolve il problema menzionato nella domanda reale.
Soumik Rakshit,

7

PyPDF2 in alcuni casi ignora gli spazi bianchi e rende il testo del risultato un casino, ma io uso PyMuPDF e sono davvero soddisfatto che tu possa usare questo link per maggiori informazioni


pymupdf è la migliore soluzione che ho osservato, non richiede ulteriori librerie C ++ come pdftotext o java come tika
Kay,

pymypdf è davvero la soluzione migliore, senza server o librerie aggiuntive e funziona con file in cui PyPDF2 PypDF3 PyPDF4 recupera una stringa di testo vuota. grazie molto!
Andrea Bisello,

per installare pymupdf, eseguire pip install pymupdf==1.16.16. Utilizzando questa versione specifica perché oggi la versione più recente (17) non funziona. Ho optato per pymupdf perché estrae i campi di avvolgimento del testo nel nuovo carattere di riga \n. Quindi sto estraendo il testo da pdf in una stringa con pymupdf e quindi sto usando my_extracted_text.splitlines()per dividere il testo in linee, in un elenco.
Erickfis,

PyMuPDF è stato davvero sorprendente. Grazie.
Erfelipe,

6

pdftotext è il migliore e il più semplice! Anche pdftotext si riserva la struttura.

Ho provato PyPDF2, PDFMiner e pochi altri, ma nessuno di loro ha dato un risultato soddisfacente.


Messaggio come segue durante l'installazione di pdf2text, Collecting PDFMiner (from pdf2text)quindi non capisco questa risposta ora.
zhy

pdf2text e pdftotext sono diversi. È possibile utilizzare il collegamento dalla risposta.
Dharam,

OK. È un po 'confuso.
zhy


5

Il pdf multipagina può essere estratto come testo a singolo tratto invece di fornire il numero di pagina individuale come argomento usando il codice seguente

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

L'unico problema qui è che il contenuto di una nuova pagina sovrascrive l'ultimo
Rahul Agarwal

3

Ecco il codice più semplice per l'estrazione del testo

codice:

# 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()

Raccomandando 'tika'
Vineesh TP

2

Ho trovato una soluzione qui PDFLayoutTextStripper

È buono perché può mantenere il layout del PDF originale .

È scritto in Java ma ho aggiunto un gateway per supportare Python.

Codice di esempio:

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

Output di esempio da PDFLayoutTextStripper : inserisci qui la descrizione dell'immagine

Puoi vedere maggiori dettagli qui Stripper con Python


2

Ho una soluzione migliore rispetto all'OCR e per mantenere l'allineamento della pagina durante l'estrazione del testo da un PDF. Dovrebbe essere di aiuto:

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. L'ultima versione non utilizza più l' codecarg . L'ho risolto rimuovendolo cioèdevice = TextConverter(rsrcmgr, retstr, laparams=laparams)
atomh33ls il

1

Per estrarre testo da PDF utilizzare il codice seguente

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

pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

print(pdfReader.numPages)

pageObj = pdfReader.getPage(0)

a = pageObj.extractText()

print(a)

0

Sto aggiungendo il codice per realizzare questo: sta funzionando bene per me:

# 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

Puoi scaricare tika-app-xxx.jar (più recente) da qui .

Quindi inserisci questo file .jar nella stessa cartella del tuo file di script Python.

quindi inserire il seguente codice nello 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))

Il vantaggio di questo metodo:

meno dipendenza. Il singolo file .jar è più facile da gestire che un pacchetto Python.

supporto multiformato. La posizione source_pdfpuò essere la directory di qualsiasi tipo di documento. (.doc, .html, .odt, ecc.)

aggiornato. tika-app.jar rilascia sempre prima della versione pertinente del pacchetto tika python.

stabile. È molto più stabile e ben mantenuto (alimentato da Apache) rispetto a PyPDF.

svantaggio:

È necessario un jre-headless.


soluzione totalmente non pitonica. Se lo consigli, dovresti creare un pacchetto Python e fare in modo che le persone lo importino. Non raccomandare di usare esecuzioni da riga di comando di codice java in python.
Michael Tamillow,

@MichaelTamillow, se si scrive un codice che verrà caricato in pypi, ammetto che non è una buona idea. Tuttavia, se si tratta solo di uno script Python con Shebang per un utilizzo temporaneo, non è male, vero?
pah8J,

Bene, la domanda non è intitolata "python" - quindi penso che affermare "ecco come farlo in Java" è più accettabile di così. Tecnicamente, puoi fare quello che vuoi in Python. Ecco perché è sia fantastico che terribile. L'uso temporaneo è una cattiva abitudine.
Michael Tamillow,

0

Se lo provi in ​​Anaconda su Windows, PyPDF2 potrebbe non gestire alcuni dei PDF con struttura non standard o caratteri unicode. Ti consiglio di usare il seguente codice se hai bisogno di aprire e leggere molti file pdf - il testo di tutti i file pdf nella cartella con relativo percorso .//pdfs//verrà memorizzato nell'elenco 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 funziona, ma i risultati possono variare. Sto vedendo risultati abbastanza incoerenti dalla sua estrazione dei risultati.

reader=PyPDF2.pdf.PdfFileReader(self._path)
eachPageText=[]
for i in range(0,reader.getNumPages()):
    pageText=reader.getPage(i).extractText()
    print(pageText)
    eachPageText.append(pageText)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.