File size: 5,805 Bytes
5b23667
49d5d56
 
 
 
 
 
5b23667
49d5d56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84360b0
49d5d56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84360b0
 
49d5d56
 
84360b0
49d5d56
84360b0
49d5d56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84360b0
49d5d56
84360b0
49d5d56
 
 
 
 
 
84360b0
49d5d56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84360b0
 
49d5d56
 
 
 
 
 
 
84360b0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import streamlit as st
import PyPDF2
import os
import io
import re # Per l'uso delle espressioni regolari
import uuid # Per la generazione di UUID
from datetime import datetime # Per ottenere il timestamp

# Funzione per estrarre testo dal PDF
def extract_text_from_pdf(pdf_file):
    """
    Estrae il testo dalla prima pagina di un PDF.
    """
    try:
        # Crea un oggetto BytesIO dal file caricato per permettere a PyPDF2 di leggerlo
        # Questo è importante perché Streamlit passa un UploadedFile che potrebbe non essere seekable o leggibile direttamente
        # da PyPDF2 senza essere avvolto in un buffer di byte.
        pdf_reader = PyPDF2.PdfReader(io.BytesIO(pdf_file.read()))
        if pdf_reader.pages:
            first_page = pdf_reader.pages[0]
            text = first_page.extract_text()
            return text
        else:
            return ""
    except Exception as e:
        st.error(f"Errore durante l'estrazione del testo dal PDF: {e}")
        return ""

# Funzione principale dell'app Streamlit
def app():
    st.set_page_config(layout="centered", page_title="Rinominatore PDF Intelligente")
    st.title("📄 Rinominatore di PDF Intelligente")
    st.markdown("""
        Carica uno o più file PDF. Il programma tenterà di leggere il contenuto della prima pagina
        per suggerire un nuovo nome per ciascun file. Il naming seguirà il formato:
        `1006373999_DDT[NUMERO_DOCUMENTO]_TIMESTAMP_UUID.pdf`.
        """)

    # Permette il caricamento di più file PDF
    uploaded_files = st.file_uploader("Carica i tuoi file PDF", type="pdf", accept_multiple_files=True)

    if uploaded_files:
        st.success(f"{len(uploaded_files)} file caricati con successo!")
        
        st.subheader("Suggerisci Nomi e Scarica PDF Rinominati:")
        
        for i, uploaded_file in enumerate(uploaded_files):
            st.markdown(f"---")
            st.markdown(f"**Elaborazione file: {uploaded_file.name}**")
            
            # Sposta il puntatore del file all'inizio per ogni elaborazione
            uploaded_file.seek(0) 
            
            # Estrai il testo dalla prima pagina del PDF
            extracted_text = extract_text_from_pdf(uploaded_file)
            
            sequence_number = ""
            if extracted_text:
                st.text_area(f"Anteprima testo estratto da '{uploaded_file.name}':", extracted_text[:500], height=100, key=f"text_area_{i}")
                
                # Cerca il numero di sequenza con espressione regolare "DOCUM. NR. DEL PAG. XXXXXXXXXXX"
                match = re.search(r"DOCUM\. NR\. DEL PAG\.\s*(\d+)", extracted_text)
                if match:
                    sequence_number = match.group(1)
                    st.info(f"Numero DDT rilevato: **{sequence_number}**")
                else:
                    st.warning("Numero DDT (es. 'DOCUM. NR. DEL PAG. 12345') non trovato in questo PDF. Il nome suggerito userà un placeholder per la sequenza.")
                    sequence_number = "" # Assicura che sia una stringa vuota se non trovato

            else:
                st.warning(f"Impossibile estrarre testo da '{uploaded_file.name}'. Il nome suggerito sarà basato sul nome originale.")
                sequence_number = "" # Assicura che sia una stringa vuota se non c'è testo

            # Componenti per il nuovo nome del file
            codice_ddt_fixed = "1006373999"
            
            # TIMESTAMP: AAAAMMGGhhmmssSSS (fino ai millisecondi)
            current_timestamp = datetime.now().strftime("%Y%m%d%H%M%S%f")[:-3] 
            
            # UUID: generatore univoco di 5 caratteri
            unique_uuid_5_chars = uuid.uuid4().hex[:5] 

            # Costruisci il nome suggerito con '_DDT' prima della sequenza
            if sequence_number:
                suggested_name_base = f"{codice_ddt_fixed}_DDT{sequence_number}_{current_timestamp}_{unique_uuid_5_chars}"
            else:
                # Fallback se il numero di sequenza non è trovato
                base_original_name = os.path.splitext(uploaded_file.name)[0]
                # Pulisci il nome originale da caratteri non validi per i nomi file
                clean_original_name = "".join(c if c.isalnum() or c in ('_', '-') else '_' for c in base_original_name)
                # Limita la lunghezza del fallback del nome originale per evitare nomi troppo lunghi
                suggested_name_base = f"{codice_ddt_fixed}_DDT_NOSEQ_{clean_original_name[:10]}_{current_timestamp}_{unique_uuid_5_chars}"
            
            new_filename_input = st.text_input(
                f"Nuovo nome suggerito per '{uploaded_file.name}' (senza estensione .pdf):", 
                value=suggested_name_base, 
                key=f"filename_input_{i}" # Chiave unica per ogni widget
            )

            final_new_filename = f"{new_filename_input.strip()}.pdf"

            # Prepara il contenuto del PDF originale per il download con il nuovo nome
            # Sposta il puntatore del file caricato all'inizio prima di leggerlo di nuovo
            uploaded_file.seek(0)
            pdf_bytes = uploaded_file.read()

            st.download_button(
                label=f"Scarica {final_new_filename}",
                data=pdf_bytes,
                file_name=final_new_filename,
                mime="application/pdf",
                key=f"download_btn_{i}" # Chiave unica per ogni pulsante
            )
            # Messaggio di successo più conciso e immediatamente sotto il pulsante di download
            st.success(f"PDF pronto come '{final_new_filename}'!")

    else:
        st.info("Carica uno o più file PDF per iniziare il processo di rinominazione.")


# Punto di ingresso dell'applicazione Streamlit
if __name__ == "__main__":
    app()