Spaces:
Sleeping
Sleeping
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() |