Topic: Aiuto interfaccia grafica per lettura pdf ed estrazione dati in csv/txt  (Letto 219 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline marioma86

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
Buonasera a tutti...
Sono nuovo sul forum e volevo chiedervi gentilmente supporto su una procedura che vorrei mettere in atto in azienda.
Al fine di eliminare l'inserimento manuale dei documenti di trasporto che riceviamo in formato pdf (ridurre al minimo il tempo dedicato al data-entry a favore dell'analisi); vorrei creare in tkinter un'interfaccia grafica che mi permetta di scegliere il file pdf ed estrarre da esso il testo di cui ho bisogno (sempre nello stesso form) in modo da creare successivamente un tracciato .txt/csv per l'importazione nel gestionale aziendale.
Qualcuno di voi potrebbe aiutarmi? Ho già creato l'interfaccia grafica, ma ancora non sono riuscito a scrivere il codice per l'upload del file e l'estrazione dallo stesso.

Vi ringrazio in anticipo per la disponibilità
« Ultima modifica: Febbraio 08, 2021, 11:37 da marioma86 »

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 381
  • Punti reputazione: 0
    • Mostra profilo
Re:Aiuto Estrazione dati da pdf in .txt
« Risposta #1 il: Febbraio 08, 2021, 11:38 »
Ciao @marioma86

Cosa intendi con "upload dei file"?

Poi, leggo che stai agendo su processi lavorativi ... attento agli errori di codifica ;)
I files pdf sono oggetti tutt'altro che semplici da trattare, python ha diverse librerie tanto per crearli (tipo reportlab, fornita nella libreria base, almeno nei sistemi linux che utilizzo) quanto per manipolarli, ed esempio pypdf2 ma, come dicevo, non sono semplici da trattare, Ti faccio un esempio di cosa si va incontro estraendo indiscriminatamente del testo, utilizzando il pdf del tutorial di python tradotto da @RicPol :

>>> import PyPDF2
>>> f_name = 'pytutorial-it-readthedocs-io-it-python3.9.pdf'
>>> f = open(f_name, 'rb')
>>> r_pdf = PyPDF2.PdfFileReader(f)
>>> page = r_pdf.getPage(18)
>>> print(page.extractText())
CAPITOLO
4
Altristrumentiperilcontrollodi
Oltrea
while
dicuiabbiamogiàparlato,Pythonutilizzaleconsueteistruzioniperilcontrollodelcomuni
amoltilinguggi,conqualchepeculiarità.
4.1
...

... come puoi arguire dall'output su NON è una strada in discesa e molto potrebbe dipendere anche da come sono fatti i pdf da trattare, fossero, p.e., prodotti da scansioni entrerebbero in gioco processi di ocr, tempo fa vidi delle utilità per l'estrazioni di dati tabellari da pdf (non ricordo dove), etc., comunque è un argomento ampio da vedere e non immediato, sarebbe bene avere un esempio mirato su cui ragionare.

Confesso, per altro, che non mi sono mai interessato molto di tale problematica, i tools linux in materia rendono semplici molte operazioni sui pdf, comunque la Tua problematica potrebbe essere un interessante spunto di studio, esponila più dettagliatamente, indicando anche quali sono le Tue difficoltà.

[Edit] Fermo restando quanto sopra, ho fatto un po' di ricerche in rete riguardo l'estrazione di testo da pdf, provado vari esempi reperiti in giro, risultati decisamente più buoni li ho ottenuti con pdfminer
ti posto un test con quest'ultima libreria per la stessa pagina :
Python 3.8.5 (default, Jul 28 2020, 12:59:40) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> 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
>>> f_name = 'pytutorial-it-readthedocs-io-it-python3.9.pdf'
>>> pages = range(18,19)
>>> def convert(fname, pages=None):
    if not pages:
        pagenums = set()
    else:
        pagenums = set(pages)

    output = StringIO()
    manager = PDFResourceManager()
    converter = TextConverter(manager, output, laparams=LAParams())
    interpreter = PDFPageInterpreter(manager, converter)

    infile = open(fname, 'rb')
    for page in PDFPage.get_pages(infile, pagenums):
        interpreter.process_page(page)
    infile.close()
    converter.close()
    text = output.getvalue()
    output.close
    return text

>>> testo = convert(f_name, pages)
>>> print(testo)
CAPITOLO 4

Altri strumenti per il controllo di flusso

Oltre a while di cui abbiamo già parlato, Python utilizza le consuete istruzioni per il controllo del flusso, comuni
a molti linguggi, con qualche peculiarità.

4.1 Istruzione if
...

rimane, comunque, un argomento da studiarci su per poter operare "come si deve"
« Ultima modifica: Febbraio 08, 2021, 16:44 da nuzzopippo »

Offline marioma86

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
Ciao @nuzzopippo, innanzitutto grazie per il tempo e le risorse dedicati a questo post!
Cerco di risponderti per punti:
1- per quanto riguarda la procedura che ho in mente e vorrei implementare, deriva da una necessità... ad oggi nel nostro gestionale vengono caricati manualmente i documenti di trasporto (costituiti da tante righe quanti sono gli articoli acquistati) inserendo le singole righe; movimentando varie decine di documenti al giorno costituiti in media da 5/7 pagine ognuno, puoi immaginare quanto tempo il collega che si occupa del magazzino impiega per caricare questi documenti.
Avevo pensato, perciò, di iniziare a sviluppare un programma py, possibilmente ad interfaccia grafica (da cui poi vorrei generare un exe in modo tale che per i miei colleghi possa risultare user friendly), che una volta acquisito il file pdf del documento, estragga soltanto alcune colonne, essendo il form sempre lo stesso, per poi generare un tracciato csv oppure txt da importare nel gestionale stesso;

2- ho iniziato a lavorare con le librerie tkinter all'interfaccia grafica visto che sono d'accordo con te che il pdf è un formato ostico che non è semplice manipolare; nel frattempo, ho consultato degli esempi pypdf2 e tabula... mi sono rivolto al forum per avere un supporto e soprattutto un feedback da voi

Nel frattempo grazie mille per gli spunti

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 381
  • Punti reputazione: 0
    • Mostra profilo
Capisco, anche io manipolo spesso i pdf per problemi d'ufficio ma, come detto, utilizzo direttamente la linea di comando linux.

Comunque, suddividerei l'approccio, l'interfaccia grafica è secondaria, oltre che complicata se non hai pregressa esperienza sulla programmazione con framework grafici.
Se dovessi affrontare un argomento del genere, personalmente, mi concentrerei in primo luogo all'estrazione del testo interessante dai pdf e magari comporlo in formato csv, direttamente da script a linea di comando. Solo dopo aver efficacemente risolto detto argomento mi progetterei l'interfaccia grafica ed il resto da dare agli utenti.

Per altro se, come dici, il form  è sempre lo stesso mi concentrerei sui metodi utili per "quel" form ... certo, però, un tale approccio potrebbe costituire un problema in caso di una futura variazione del form.

Offline marioma86

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
Grazie mille per i suggerimenti... ho iniziato ad avere questo approccio.
Anche io sono riuscito a buttare giù delle righe di codice che mi permettano di estrapolare testo dal pdf, ma per adesso da riga di comando.
La mia idea finale sarebbe quella di creare, per n formati standard di documento che riceviamo da altrettanti n fornitori, un eseguibile in modo tale che ogni collega possa utilizzarlo senza avere competenze particolari...

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 381
  • Punti reputazione: 0
    • Mostra profilo
Nel caso siano dati "tabellari", prova a dare una guardata a camelot, è una libreria "specializzata" in cui ero incappato tempo fa in una discussione altrove.