Topic: Associare comando di creazione csv in GUI  (Letto 361 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline marioma86

  • python unicellularis
  • *
  • Post: 15
  • Punti reputazione: 0
    • Mostra profilo
Associare comando di creazione csv in GUI
« il: Marzo 30, 2021, 21:32 »
Buonasera a tutti, con il supporto del forum sono riuscito a scrivere un programma che mi permette di creare un file csv a partire da un pdf:
import pdftotext
import csv


with open('18567.pdf', 'rb') as pdf_file:
    pdf = pdftotext.PDF(pdf_file)

lines = pdf[0].splitlines()[20:23]

table = []

for line in lines:
    table.append(line.split())

with open("prova2pdf.csv", "w") as csv_file:
    writer = csv.writer(csv_file, delimiter=";")
    writer.writerows(table)


A questo punto vorrei implementare un programma che mi permetta, attraverso un'interfaccia grafica, di selezionare il pdf e poi creare il csv; di seguito il codice che ho scritto ma che purtroppo genera errori:


from tkinter import *
import tkinter.messagebox
import tkinter.filedialog

def apri_esplora():
        open_file = tkinter.filedialog.askopenfile()


def crea_csv():
        import pdftotext
        import csv
        with open(open_file, 'rb') as pdf_file:
                pdf = pdftotext.PDF(open_file)
                lines = pdf[0].splitlines()[20:23]
        table = []
        for line in lines:
            table.append(line.split())

        with open("prova2pdf.csv", "w") as csv_file:
            writer = csv.writer(csv_file, delimiter=";")
            writer.writerows(table)

def chiudi_programma():
    ris = tkinter.messagebox.askyesno("Uscita","Sei sicuro di chiudere il programma?")
    if ris == True:
        finestra.destroy()

#Creazione finestra
finestra = Tk()
finestra.geometry("500x300")
finestra.title("Esplora risorse!")


#creazione menu
barra_dei_menu = Menu(finestra) #barra dei menu che appartiene alla finestra
menu_opzioni = Menu(barra_dei_menu,tearoff=0) #creo un menu che appartiene alla barra creata primac
barra_dei_menu.add_cascade(label="File",menu=menu_opzioni) #il menu che fa parte della barra dei menu è a tendina
#aggiungo i comandi con le etichette del menu
menu_opzioni.add_command(label="Apri esplora risorse",command=apri_esplora)
menu_opzioni.add_command(label="Crea csv",command=crea_csv)
menu_opzioni.add_command(label="Esci",command=chiudi_programma)

finestra.config(menu=barra_dei_menu) #configuriamo il menu come menu della finestra


finestra.mainloop()


Qualcuno di voi riesce ad aiutarmi?
Grazie in anticipo

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 385
  • Punti reputazione: 0
    • Mostra profilo
Re:Associare comando di creazione csv in GUI
« Risposta #1 il: Marzo 31, 2021, 08:05 »
Se avrò tempo, nel fine settimana, Ti farò un breve esempio, intanto guardaTi le classi, senza, parlando di GUI, non si va da nessuna parte.

Ciao

Offline marioma86

  • python unicellularis
  • *
  • Post: 15
  • Punti reputazione: 0
    • Mostra profilo
Re:Associare comando di creazione csv in GUI
« Risposta #2 il: Marzo 31, 2021, 21:55 »
Grazie mille... nel frattempo farò anch'io altre prove...

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 385
  • Punti reputazione: 0
    • Mostra profilo
Re:Associare comando di creazione csv in GUI
« Risposta #3 il: Aprile 03, 2021, 12:31 »
Allora, @marioma, come promesso ho fatto un piccolo esempio in tkinter che apre e legge un file PDF (utilizzando il Tuo modo, vedi metodo di callback "_sel_file(self)") permette di impostare il separatore, eliminare le righe non interessanti, elaborare una riga manualmente (pensata per le intestazioni che possono avere spazi in più) e preparare automaticamente blocchi di righe dati (funziona per righe), magari dopo aver corretto qualche imprecisione di lettura, e, in fine, di generare un file csv (non utilizzo la libreria, però).
Per esporre i dati utilizzo due textbox cui è disattivato il ritorno a capo automatico, una serie di pulsanti attivati secondo il contesto permettono le "manipolazioni" se necessarie.

Appena fatto il primo test, sembra funzionare, "potrebbero" anche processarsi più pdf, eliminando l'intero contenuto in self.pdf_text e caricando un altro pdf ed aggiungere i dati, ma questo non lo ho sperimentato.

Spero Tu abbia guardato le classi, perché non vi è alcun aiuto nel codice, troppo grosso anche se è il minimo sindacale, ci vorrebbero molti accorgimenti in più, in ogni caso la documentazione può essere di grande aiuto per ciò che è oscuro e "decifrare" è un ottimo esercizio.

Spero Ti sia utile
# -*- coding: utf-8 -*-

import os
import tkinter as tk
import tkinter.messagebox as msgb
import tkinter.filedialog as fdlg
import pdftotext

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('PDF => CSV')
        p_file = tk.Frame(self)
        p_file.grid(row=0, column=0, sticky='ew')
        self.bt_sel_file = tk.Button(p_file, text='Seleziona PDF',
                                     padx=5, pady=5,
                                     command=self._sel_file)
        self.bt_sel_file.grid(row=0, column=0, sticky='ew')
        self.bt_close_file = tk.Button(p_file, text='Chiudi PDF',
                                       padx=5, pady=5,
                                       command=self._close_file)
        self.bt_close_file.grid(row=0, column=1, sticky='ew')
        self.bt_make_csv = tk.Button(p_file, text='Crea CSV',
                                     padx=5, pady=5,
                                     command = self._make_csv)
        self.bt_make_csv.grid(row=0, column=2, sticky='ew')
        self.bt_close = tk.Button(p_file, text='Esci',
                                  padx=5, pady=5,
                                  command=self.destroy)
        self.bt_close.grid(row=0, column=3, sticky='ew')
        p_file.grid_columnconfigure(0, uniform=1, weight=1)
        p_file.grid_columnconfigure(1, uniform=1, weight=1)
        p_file.grid_columnconfigure(2, uniform=1, weight=1)
        p_file.grid_columnconfigure(3, uniform=1, weight=1)
        p_text = tk.Frame(self)
        p_text.grid(row=1, column=0, sticky='nsew')
        lbl = tk.Label(p_text, text='Righe testo estratte dal PDF',
                       justify='left', padx=5, pady=5, anchor='w')
        lbl.grid(row=0, column=0, columnspan=3, sticky='ew')
        self.pdf_text = tk.Text(p_text, height=15, bg='#D5E711',
                                wrap='none', padx=5, pady=5)
        self.pdf_text.grid(row=1, column=0, sticky='nsew')
        v_scr_1 = tk.Scrollbar(p_text, orient=tk.VERTICAL,
                               command=self.pdf_text.yview)
        self.pdf_text.configure(yscrollcommand=v_scr_1.set)
        v_scr_1.grid(row=1, column=1, sticky='ns')
        h_scr_1 = tk.Scrollbar(p_text, orient=tk.HORIZONTAL,
                               command=self.pdf_text.xview)
        self.pdf_text.configure(xscrollcommand=h_scr_1.set)
        h_scr_1.grid(row=2, column=0, sticky='ew')
        p_bt_file = tk.Frame(p_text)
        p_bt_file.grid(row=1, column=2, sticky='ns')
        lbl = tk.Label(p_bt_file, text='Car. separatore:', anchor='w',
                       padx=5, pady=5)
        lbl.grid(row=0, column=0)
        self.e_sep = tk.Entry(p_bt_file, width=3)
        self.e_sep.grid(row=1, column=0)
        self.bt_del_line = tk.Button(p_bt_file, text='Elimina righe',
                                     padx=5, pady=5, command=self._del_select_rows)
        self.bt_del_line.grid(row=3, column=0, sticky='nsew')
        self.bt_trasf_line = tk.Button(p_bt_file, text='Trasferisci riga',
                                       padx=5, pady=5, command=self._data_transfer)
        self.bt_trasf_line.grid(row=4, column=0, sticky='nsew')
        self.bt_elab_lines = tk.Button(p_bt_file, text='Elabora righe',
                                       padx=5, pady=5, command=self._elab_rows)
        self.bt_elab_lines.grid(row=5, column=0, sticky='nsew')
        p_bt_file.grid_rowconfigure(2, uniform=2, weight=1)
        p_bt_file.grid_rowconfigure(3, uniform=2, weight=1)
        p_bt_file.grid_rowconfigure(4, uniform=2, weight=1)
        p_bt_file.grid_rowconfigure(5, uniform=2, weight=1)
        p_text.grid_columnconfigure(0, weight=1)
        p_text.grid_rowconfigure(1, weight=1)
        p_csv = tk.Frame(self)
        p_csv.grid(row=2, column=0, sticky='nsew')
        lbl = tk.Label(p_csv, text='Righe elaborate per il CSV',
                       justify='left', padx=5, pady=5, anchor='w')
        lbl.grid(row=0, column=0, columnspan=2, sticky='ew')
        self.csv_text = tk.Text(p_csv, height=15, bg='#E7D011',
                                wrap='none', padx=5, pady=5)
        self.csv_text.grid(row=1, column=0, sticky='nsew')
        v_scr_2 = tk.Scrollbar(p_csv, orient=tk.VERTICAL,
                               command=self.csv_text.yview)
        self.csv_text.configure(yscrollcommand=v_scr_2.set)
        v_scr_2.grid(row=1, column=1, sticky='ns')
        h_scr_2 = tk.Scrollbar(p_csv, orient=tk.HORIZONTAL,
                               command=self.csv_text.xview)
        self.csv_text.configure(xscrollcommand=h_scr_2.set)
        h_scr_2.grid(row=2, column=0, sticky='ew')
        p_csv.grid_columnconfigure(0, weight=1)
        p_csv.grid_rowconfigure(1, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(1, weight=1)
        self.grid_rowconfigure(2, weight=1)

        self.init_dir = os.getenv('HOME')
        self._initialize()

    def _initialize(self):
        self.e_sep.delete(0, 'end')
        self.e_sep.insert(0, ';')
        self.bt_sel_file.configure(state='normal')
        self.bt_close_file.configure(state='disabled')
        self.bt_make_csv.configure(state='disabled')
        self.bt_close.configure(state='normal')
        self.bt_del_line.configure(state='disabled')
        self.bt_trasf_line.configure(state='disabled')
        self.bt_elab_lines.configure(state='disabled')
        self.pdf_text.delete('1.0', 'end')
        self.pdf_text.configure(state='disabled')
        self.csv_text.delete('1.0', 'end')
        self.csv_text.configure(state='disabled')

    def _sel_file(self):
        f_types =[('File pdf', '*.pdf')]
        try:
            f = fdlg.askopenfile(parent=self,
                                 initialdir = self.init_dir,
                                 title='Selezione PDF',
                                 mode='rb',
                                 filetypes=f_types)
            lines = None
            if f:
                self.init_dir = os.path.dirname(f.name)
                pdf = pdftotext.PDF(f)
                f.close()
                lines = pdf[0].splitlines()
            if lines:
                self._set_data(lines)
        except OSError:
            msgb.showerror(title='Apertura fallita', message='Errore lettura file')

    def _set_data(self, data=None):
        if not data: return
        self.pdf_text.configure(state='normal')
        for row in data:
            self.pdf_text.insert('end', row +'\n')
        self.pdf_opened = True
        self._evaluate_state()
   
    def _evaluate_state(self):
        if len(self.pdf_text.get('1.0', 'end-1c')) == 0:
            self.bt_close_file.configure(state='disabled')
            self.bt_del_line.configure(state='disabled')
            self.bt_trasf_line.configure(state='disabled')
            self.bt_elab_lines.configure(state='disabled')
        else:
            self.bt_close_file.configure(state='normal')
            self.bt_del_line.configure(state='normal')
            self.bt_trasf_line.configure(state='normal')
            self.bt_elab_lines.configure(state='normal')
        if len(self.csv_text.get('1.0', 'end-1c')) == 0:
            self.bt_make_csv.configure(state='disabled')
        else:
            self.bt_make_csv.configure(state='normal')

        # endline, endcolumn = text.index('end').split('.')
        # currentline, currentcolum = text.index('current').split('.')
        # self.Text.delete(line_number + '.0', line_number + '.end + 1 char')

    def _get_rows_intervall(self):
        if self.pdf_text.tag_ranges(tk.SEL):
            init_index = self.pdf_text.index(tk.SEL_FIRST)
            end_index = self.pdf_text.index(tk.SEL_LAST)
        else:
            init_index = self.pdf_text.index(tk.INSERT)
            end_index = init_index
        first = int(init_index.split('.')[0])
        last = int(end_index.split('.')[0])
        return [x for x in range(first, last+1)]

    def _del_select_rows(self):
        rows = self._get_rows_intervall()
        if not rows: return
        rows.reverse()
        for n in rows:
            self.pdf_text.delete(str(n)+'.0', str(n)+'.end + 1 char')
        self._evaluate_state()

    def _data_transfer(self):
        current = self.pdf_text.index(tk.INSERT)
        row = current.split('.')[0]
        text = self.pdf_text.get(row + '.0', row + '.end')
        self.csv_text.configure(state='normal')
        self.csv_text.insert('end', text +'\n')
        self.csv_text.configure(state='disabled')
        self.pdf_text.delete(row + '.0', row + '.end + 1 char')
        self._evaluate_state()
   
    def _elab_rows(self):
        rows = self._get_rows_intervall()
        if not rows: return
        sep = self.e_sep.get()
        if len(sep) != 1: return
        if not sep: return
        self.csv_text.configure(state='normal')
        for n in rows:
            text = self.pdf_text.get(str(n)+'.0', str(n)+'.end')
            words = text.split()
            text = sep.join(words)
            self.csv_text.insert('end', text +'\n')
        self.csv_text.configure(state='disabled')
        rows.reverse()
        for n in rows:
            self.pdf_text.delete(str(n)+'.0', str(n)+'.end + 1 char')
        self._evaluate_state()

    def _close_file(self):
        self._initialize()

    def _make_csv(self):
        f_types = [('Comma separed values', '*.csv')]
        f_name = fdlg.asksaveasfilename(parent=self,
                                        initialdir = self.init_dir,
                                        title='Creazione CSV',
                                        confirmoverwrite=False,
                                        filetypes=f_types)
        if not f_name: return
        self.csv_text.configure(state='normal')
        text = self.csv_text.get('1.0', 'end-1c')
        try:
            with open(f_name, 'w') as f:
                f.write(text)
        except OSError:
            msgb.showerror(title='Generazione fallita',
                           message='Errore scrittura file')
            return
        self.csv_text.delete('1.0', 'end')
        self.csv_text.configure(state='disabled')
        self._evaluate_state()


if __name__ == '__main__':
    app = App()
    app.mainloop()
« Ultima modifica: Aprile 03, 2021, 12:39 da nuzzopippo »

Offline marioma86

  • python unicellularis
  • *
  • Post: 15
  • Punti reputazione: 0
    • Mostra profilo
Re:Associare comando di creazione csv in GUI
« Risposta #4 il: Aprile 03, 2021, 22:00 »
Grazie mille @nuzzopippo per il codice, ma soprattutto per gli spunti formativi... è da poco che ho iniziato a scrivere codice in python, provenendo da c++, ed alla fine il concetto di classe non mi è nuovo...
Il codice è perfetto! Ora sto cercando di modificarlo per fargli leggere un pdf con più di una pagina, visto che questo se non sbaglio permette di leggere file pdf composti da una sola pagina...

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 385
  • Punti reputazione: 0
    • Mostra profilo
Re:Associare comando di creazione csv in GUI
« Risposta #5 il: Aprile 04, 2021, 07:17 »
Il codice è perfetto! Ora sto cercando di modificarlo per fargli leggere un pdf con più di una pagina, visto che questo se non sbaglio permette di leggere file pdf composti da una sola pagina...

... già, tanto perfetto che Ti permette di leggere solo la prima pagina ;) ... è solo uno spunto di esempio buttato li per il Tuo codice, ove, all'istruzione
lines = pdf[0].splitlines()

Dici di leggere la prima pagina

Se vuoi leggerle tutte, modifica la funzione di callback "_sel_file(self):" in questo modo:
    def _sel_file(self):
        f_types =[('File pdf', '*.pdf')]
        try:
            f = fdlg.askopenfile(parent=self,
                                 initialdir = self.init_dir,
                                 title='Selezione PDF',
                                 mode='rb',
                                 filetypes=f_types)
            lines = None
            if f:
                self.init_dir = os.path.dirname(f.name)
                pdf = pdftotext.PDF(f)
                f.close()
                for i in range(len(pdf)):
                    lines = pdf[i].splitlines()
                    if lines:
                        self._set_data(lines)
        except OSError:
            msgb.showerror(title='Apertura fallita', message='Errore lettura file')

Attenzione però, non so cosa succederebbe per pdf molto estesi, forse sarebbe meglio implementare dei "sezionamenti" nei dati da leggere, a poche pagine per volta.

... per quanto riguarda, poi, l'insieme del codice è uno scriptino giusto buttato li, non ho trovato alcuna documentazione sul modulo "pdftotext", quindi non c'è alcuna gestione di eventuali errori nella lettura di pdf mal formattati, poi, come gestirebbe dati stringa (e quindi con spazi interni)?, etc. ... in sostanza, un approccio fatto bene richiederebbe un "modello" molto più consistente e basato su librerie ben documentate, il modello implementato può andare bene giusto per casi ben precisi.

Bene che Tu abbia concetti sulle classi ma non trascurare di approfondire il discorso in python, personalmente ho avuto alcune "sorprese" rispetto al java da cui provenivo.

Ciao e buona pasqua

Offline marioma86

  • python unicellularis
  • *
  • Post: 15
  • Punti reputazione: 0
    • Mostra profilo
Re:Associare comando di creazione csv in GUI
« Risposta #6 il: Aprile 04, 2021, 09:08 »
@nuzzopippo per l'utilizzo che devo farne leggere una pagina soltanto va più che bene  :D visto che di solito i pdf sono di una sola pagina... file di più pagine è residuale.
Comunque sto approfondendo il linguaggio python in quanto ha davvero tantissime applicazioni ed ha una sintassi molto intuitiva.

Grazie ancora per il supporto e Buona Pasqua.

Alla prossima :glasses-cool:

Offline marioma86

  • python unicellularis
  • *
  • Post: 15
  • Punti reputazione: 0
    • Mostra profilo
Re:Associare comando di creazione csv in GUI
« Risposta #7 il: Aprile 09, 2021, 00:23 »
@nuzzopippo ho seguito il tuo consiglio e sto approfondendo le classi.
Per migliorare eventualmente il progetto volevo chiederti se, secondo te, fosse possibile una volta definite le righe da importare nel csv, scegliere anche quali colonne eventualmente eliminare (perchè non serve indicarle nel csv) e scegliere, eventualmente, come delimitatore la tabulazione.
Per apportare queste modifiche, ora ho creato un workflow utilizzando Knime, un software di data science; vorrei, però, integrare questa funzione direttamente nel codice dell'applicativo.

Pensi che possano essere delle modifiche fattibili?

Grazie in anticipo

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 385
  • Punti reputazione: 0
    • Mostra profilo
Re:Associare comando di creazione csv in GUI
« Risposta #8 il: Aprile 09, 2021, 16:48 »
Per migliorare eventualmente il progetto volevo chiederti se, secondo te, fosse possibile una volta definite le righe da importare nel csv, scegliere anche quali colonne eventualmente eliminare (perchè non serve indicarle nel csv) e scegliere, eventualmente, come delimitatore la tabulazione.
...
Pensi che possano essere delle modifiche fattibili?

Per quanto riguarda le colonne è fattibilissimo con modeste modifiche al precedente esempio, così come "penso" sia semplice definire la tabulazione quale delimitatore ... per quest'ultimo puno ho da consultare la docs, però, è un particolare problema che non mi son mai posto (tendo a non complicarmi la vita, perché affrontare "problemi di codifica" quando posso evitarli?)

Non conosco Knime, data-science e data-mining sono al di la delle mie (modeste) capacità culturali ma non ho dubbi che possano essere tranquillamente gestite in ambiti GUI ... in fin dei conti, una applicazione è come plastilina nelle mani di un programmatore, può modellarla come vuole, unico limite la sua "manualità".

Se trovo il tempo, e mi riesce, nel fine settimana proverò a realizzare quelle due varianti sulla base di quanto già proposto prima, se realizzo provvederò in qualche modo a rendere disponibile il codice (che certo diventerà eccessivo per un post)

... Ti confesso che mi stai solleticando una qualche "idea", magari, poi, la dico.

Ciao
« Ultima modifica: Aprile 09, 2021, 17:00 da nuzzopippo »

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 385
  • Punti reputazione: 0
    • Mostra profilo
Re:Associare comando di creazione csv in GUI
« Risposta #9 il: Aprile 11, 2021, 09:38 »
Allora @marioma86, come promesso ho implementato le due "varianti" richieste, il codice è di 376 righe, puoi trovarlo qua assieme a qualche striminzita spiegazione, è minimale come gestione ma permette di eliminare colonne dati e sostituire il separatore con la tabulazione codificata in carattere utf esadecimale a 32 bit, attento a quest'ultimo particolare (leggiti lo How-To) se utilizzi windows (e quindi codifica windows-1252") avrai errore a meno che non codifichi l'intero file in utf o non utilizzi altra codificha alternativa del carattere.

Se ritieni di implementare una versione utilizzante knime, quando la fai fatti sentire, io sono sempre curioso.

Ciao

Offline marioma86

  • python unicellularis
  • *
  • Post: 15
  • Punti reputazione: 0
    • Mostra profilo
Re:Associare comando di creazione csv in GUI
« Risposta #10 il: Aprile 13, 2021, 08:15 »
Grazie @nuzzopippo, sto facendo qualche test "sul campo" e finora il risultato è soddisfacente con tutti i documenti che ho utilizzato.
Stavo pensando una cosa, è possibile selezionare tutte le righe ed importarle nella text box in basso in modo massivo, oppure bisogna procedere riga per riga?

Cerchiamo di migliorare il progetto perchè mi sembra davvero interessante  :D  ;)

Grazie mille

Ciao

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 385
  • Punti reputazione: 0
    • Mostra profilo
Re:Associare comando di creazione csv in GUI
« Risposta #11 il: Aprile 13, 2021, 08:51 »
Ciao @marioma

Grazie @nuzzopippo, sto facendo qualche test "sul campo" e finora il risultato è soddisfacente con tutti i documenti che ho utilizzato.
Stavo pensando una cosa, è possibile selezionare tutte le righe ed importarle nella text box in basso in modo massivo, oppure bisogna procedere riga per riga?

Si, è possibile.
Come detto in precedenza, devi considerare una applicazione come creta, la modelli come vuoi, a patto di sapere cosa si voglia fare e come farla.


Cerchiamo di migliorare il progetto perchè mi sembra davvero interessante  :D  ;)

È qualcosa di vicino alla "idea" cui ho accennato un paio di post fa, personalmente manipolo parecchio i pdf sul lavoro, non utilizzo, però, python, ma la linea di comando linux, in quel s.o. vi sono parecchi tools molto efficaci per fare più o meno tutto ciò che si vuole.

Anche python offre molti tools in merito ai pdf, forse anche troppi, l'idea che avevo in mente è proporre a Te ed a eventuali altri "aspiranti apprendisti" interessati (in cui ricado anche io) di tudiarci e discutere sull'argomento senza fretta e senza ben precise finalità, provando varie librerie e soluzioni e raffinando, nel tempo, gli approcci adottati ... un percorso di studio comune, di fondo.

Per quanto mi riguarda, quando ho un po' di tempo sto già cercando di affrontare tale faccenda, partendo dalla considerazione che molti dei documenti che tratto sono in realtà scansioni, quindi immagini, che su linux tratto tramite imagemagick e tesseract ... ho idea di replicare ciò che faccio con python, sotto linux al momento (non ho sistemi windows disponibili), al momento mi sto costruendo un viewer a singola pagina di documento pdf, al momento sono sulla interfacci utente, che inizialmente è in tkinter e successivamente proverò a farlo con le wx, quando completerò l'interfaccia che voglio realizzare proverò varie librerie per formare l'immagine ed estrarre il testo, tanto in modalità ocr, quanto in modalità "diretta".

Se Tu o altri siete interessati, fatemelo sapere che provvederò a rendere disponibili i vari step e, magari ne discutiamo qui ... ovviamente, nel caso, mi aspetto che gli "interessati" mettano "del loro", tanto come idee quanto come soluzioni alternative
 ... se poi, ci fosse qualche esperto ad indicare le (certamente tante) pecche, sarebbe il massimo ;)

Ciao.

Offline marioma86

  • python unicellularis
  • *
  • Post: 15
  • Punti reputazione: 0
    • Mostra profilo
Re:Associare comando di creazione csv in GUI
« Risposta #12 il: Aprile 13, 2021, 20:05 »
@nuzzopippo fortunatamente sono solo io che gestisco il progetto, quindi posso sviluppare in autonomia ogni miglioramento  ;)

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 385
  • Punti reputazione: 0
    • Mostra profilo
Re:Associare comando di creazione csv in GUI
« Risposta #13 il: Aprile 15, 2021, 07:35 »
Ottima cosa, la libertà ...  aspetto di vedere come "modelli" il Tuo ultimo quesito .

N.B. - le tecniche le hai già nel codice trattato ;)

Offline marioma86

  • python unicellularis
  • *
  • Post: 15
  • Punti reputazione: 0
    • Mostra profilo
Re:Associare comando di creazione csv in GUI
« Risposta #14 il: Aprile 21, 2021, 07:37 »
Ottima cosa, la libertà ...  aspetto di vedere come "modelli" il Tuo ultimo quesito .

N.B. - le tecniche le hai già nel codice trattato ;)

Ciao @nuzzopippo, in questi giorni sto testando quotidianamente in ufficio il programma ed è davvero molto utile.
Ieri, però, mi sono imbattuto in un file (che ti allego) in cui il codice articolo e comunque una stringa, ma suddiviso da spazi (ne indico uno come esempio: 26 01 001 41R); avendo degli spazi al suo interno, purtroppo come puoi immaginare quando vado a creare il csv quegli spazi vengono sostituiti dal separatore.
Stavo cercando di buttare giù una procedura affinchè in questo caso consideri il campo come una stringa unica, ma mi sono arenato...  :question: :question:

Grazie in anticipo

p.s. purtroppo non riesco ad allegare il file pdf di prova, ma spero di essere stato chiaro