Unificatore ed Estrattore PDF in Python (PDF Merger/Splitter): Addio Limiti e Rischi di Privacy dei siti web
![]() |
Quante volte vi è capitato di dover unire due documenti PDF o estrarre qualche pagina specifica e di ricorrere al primo sito web gratuito trovato su Google?
Sebbene questi servizi siano comodi, portano con sé due grandi problemi:
- Privacy e Sicurezza: State caricando documenti potenzialmente confidenziali (fatture, contratti, dati personali) su server terzi di cui spesso non conoscete le politiche di gestione dati.
- Limiti operativi: Dimensione massima del file, numero limitato di operazioni giornaliere o fastidiosi banner pubblicitari.
La soluzione? Costruirsi una propria utility locale in Python. Non solo è incredibilmente semplice da realizzare, ma funziona istantaneamente, è sicura al 100% e non impone alcun limite.
Gli Ingredienti: Perché usiamo pypdf
Per questo progetto utilizziamo pypdf (il successore moderno e mantenuto della storica libreria PyPDF2). È una libreria pure-Python leggera, veloce e facilissima da integrare.
Per installarla, aprite il terminale ed eseguite:
pip install pypdf
Architettura dello Script
Il nostro script copre due esigenze principali:
- Unione (Merge): Scansiona una cartella target, trova tutti i file
.pdfe li fonde in un unico documento ordinato alfabetico. - Estrazione (Split/Extract): Prende un file PDF e genera un nuovo documento mantenendo solo l'intervallo di pagine desiderato (es. dalla pagina 2 alla 5).
Abbiamo strutturato il codice sia come modulo riutilizzabile sia con un'interfaccia a riga di comando (CLI) guidata e interattiva.
Il Codice Completo
Ecco il sorgente completo pronto all'uso. Salvatelo come pdf_merger_splitter.py:
import os
from pathlib import Path
from pypdf import PdfReader, PdfWriter
def unisci_pdf(cartella_input: str, file_output: str) -> None:
"""Unisce tutti i file PDF presenti nella cartella specificata in un unico file."""
cartella_input = cartella_input.strip().strip('"').strip("'")
path_cartella = Path(cartella_input)
if not path_cartella.exists() or not path_cartella.is_dir():
print(f"❌ Errore: La cartella '{cartella_input}' non esiste.")
return
# Recupera e ordina tutti i file .pdf nella cartella
file_pdf = sorted([f for f in path_cartella.glob("*.pdf")])
if not file_pdf:
print(f"⚠️ Nessun file PDF trovato in '{cartella_input}'.")
return
merger = PdfWriter()
print(f"🔍 Trovati {len(file_pdf)} file PDF. Inizio unione...")
for pdf in file_pdf:
print(f" └─ Aggiunta di: {pdf.name}")
merger.append(str(pdf))
file_output = file_output.strip().strip('"').strip("'")
merger.write(file_output)
merger.close()
print(f"✅ Unione completata con successo! Salvato in: {file_output}\n")
def estrai_pagine(
file_input: str, file_output: str, pagina_inizio: int, pagina_fine: int
) -> None:
"""Estrae un intervallo specifico di pagine (base 1) da un PDF e le salva in un nuovo file."""
file_input = file_input.strip().strip('"').strip("'")
path_file = Path(file_input)
if not path_file.exists():
print(f"❌ Errore: Il file '{file_input}' non esiste.")
return
reader = PdfReader(path_file)
writer = PdfWriter()
totale_pagine = len(reader.pages)
# Validazione degli intervalli
if pagina_inizio < 1 or pagina_fine > totale_pagine or pagina_inizio > pagina_fine:
print(
f"❌ Errore: Intervallo non valido. Il documento contiene {totale_pagine} pagine."
)
return
# pypdf usa indicizzazione 0-based, convertiamo da 1-based
for idx in range(pagina_inizio - 1, pagina_fine):
writer.add_page(reader.pages[idx])
file_output = file_output.strip().strip('"').strip("'")
with open(file_output, "wb") as f_out:
writer.write(f_out)
print(
f"✅ Estratte le pagine da {pagina_inizio} a {pagina_fine} con successo!"
)
print(f"📂 Salvato in: {file_output}\n")
def main():
print("=" * 50)
print(" 📄 UTILITY GESTIONE PDF (Local & Private)")
print("=" * 50)
print("1. Unisci tutti i PDF (in ordine alfabetico) di una cartella")
print("2. Estrai intervallo di pagine da un PDF")
print("3. Esci")
scelta = input("\nSeleziona un'opzione (1-3): ").strip()
if scelta == "1":
cartella = input("Percorso della cartella contenente i PDF: [Trascina qui la cartella per fare prima]").strip()
output = input(
"Nome del file di output (es. unito.pdf) [Default: unito.pdf]: "
).strip()
if not output:
output = "unito.pdf"
unisci_pdf(cartella, output)
elif scelta == "2":
file_in = input("Percorso del file PDF sorgente: [Trascina qui il file per fare prima]").strip()
file_out = input(
"Nome del file di output [Default: estratto.pdf]: "
).strip()
if not file_out:
file_out = "estratto.pdf"
try:
p_inizio = int(input("Pagina iniziale (da 1): "))
p_fine = int(input("Pagina finale: "))
estrai_pagine(file_in, file_out, p_inizio, p_fine)
except ValueError:
print("❌ Errore: Inserire numeri interi validi per le pagine.")
elif scelta == "3":
print("Arrivederci!")
else:
print("Opzione non valida.")
if __name__ == "__main__":
main()
Come Usarlo
- Esecuzione dello script: Aprire il terminale nella cartella in cui è presente lo script ed eseguire:
python pdf_merger_splitter.py - Per unire più PDF: Inserire la cartella in cui si trovano i file. Lo script li leggerà in ordine alfabetico e genererà il file combinato.
- Per estrarre pagine: Specificare il file di origine e indicare l'intervallo (es. dalla pagina
1alla3).
📍 Dove viene salvato il file finale?
Dipende da come digitate il nome del file di output:- Nome semplice (es.
unito.pdf): Il file verrà salvato nella stessa cartella in cui state eseguendo lo script Python (la cartella di lavoro corrente del terminale). - Percorso completo (es.
C:\Utenti\Mario\Desktop\unito.pdfo/Users/mario/Desktop/unito.pdf): Il file verrà generato esattamente nella cartella di destinazione specificata.
Guida Pratica ai Percorsi (Path): Come non sbagliare mai
Il percorso dei file (Path) è da sempre lo scoglio principale quando si usano strumenti da riga di comando. Un piccolo errore di battitura o una spaziatura sbagliata bastano a far fallire lo script.
Ecco una guida pratica con i metodi più semplici per indicare i percorsi senza impazzire, sia su Windows che su Mac.
💡 Il Trucco Definitivo: Drag & Drop (Trascina e Rilascia)
Non serve scrivere il percorso a mano. Quando lo script vi chiede:
Percorso della cartella... oppure Percorso del file PDF sorgente...
- Aprite la cartella o il file nel vostro File Explorer (Windows) o Finder (Mac).
- Trascinatelo direttamente dentro la finestra del Terminale.
- Il terminale scriverà automaticamente il percorso completo e corretto per voi!
- Premete Invio.
🛠️ Come recuperare il percorso manualmente
Se preferite copiarlo ed incollarlo, ecco come fare sui vari sistemi:
🪟 Su Windows
- Selezionate il file o la cartella.
- Premete la combinazione di tasti
Ctrl + Shift + C(copia come percorso).- In alternativa: Fai clic con il tasto destro sul file/cartella e seleziona "Copia come percorso".
- Incollate nel terminale con
Ctrl + V.
Nota per Windows: Se il percorso contiene virgolette (es:
"C:\I Miei Documenti\file.pdf"), potrete lasciarle o rimuoverle: lo script Python o la shell le gestirà senza problemi.
🍎 Su Mac
- Fai clic con il tasto destro (o due dita sul trackpad) sul file o sulla cartella.
- Tieni premuto il tasto
Option(⌥) sulla tastiera. - Nel menu comparirà la voce "Copia [Nome] come percorso" (Copia come pathname).
- Incollate nel terminale con
Cmd + V.
📌 Esempi Pratici di Sintassi
I percorsi possono essere scritti in due modi: Assoluti (partono dalla radice del disco) o Relativi (partono da dove vi trovate).
1. Percorsi Assoluti (Consigliati per non sbagliare)
Puntano alla posizione esatta all'interno del computer, a prescindere da dove sia salvato lo script Python.
- Windows:
- File:
C:\Utenti\Mario\Desktop\fattura.pdf - Cartella:
C:\Utenti\Mario\Documents\PDF_Da_Unire
- File:
- Mac / Linux:
- File:
/Users/mario/Desktop/fattura.pdf - Cartella:
/Users/mario/Documents/PDF_Da_Unire
- File:
2. Percorsi con Spazi
Se la cartella o il file contiene degli spazi (es. I Miei Documenti), assicurati di racchiudere il percorso tra virgolette se lo inserisci manualmente, oppure usa semplicemente il metodo Drag & Drop citato sopra che gestirà gli spazi automaticamente.
3. Percorsi Relativi (Per utenti più pratici)
Se aprite il terminale già all'interno della cartella in cui si trovano i vostri PDF, vi basterà usare i nomi dei file o il punto .:
- Per la cartella corrente: basta digitare
.(un singolo punto significa "la cartella dove mi trovo ora"). - Per un file nella stessa cartella: basta scrivere il nome, es.
documento.pdf.
🧱 Esempio di Utilizzo Passo-Passo
Ecco cosa vedrete a schermo durante l'esecuzione del programma usandolo con il drag & drop:
==================================================
📄 UTILITY GESTIONE PDF (Local & Private)
==================================================
1. Unisci tutti i PDF (in ordine alfabetico) di una cartella
2. Estrai intervallo di pagine da un PDF
3. Esci
Seleziona un'opzione (1-3): 1
Percorso della cartella contenente i PDF: [Trascina qui la cartella per fare prima] -> C:\Users\Mario\Desktop\Contratti
Nome del file di output (es. unito.pdf) [Default: unito.pdf]: contratti_2026_completo.pdf
🔍 Trovati 3 file PDF. Inizio unione...
└─ Aggiunta di: 01_gennaio.pdf
└─ Aggiunta di: 02_febbraio.pdf
└─ Aggiunta di: 03_marzo.pdf
✅ Unione completata con successo! Salvato in: contratti_2026_completo.pdf
Perché l'approccio di questo tool vince
- 100% Offline: I vostri dati restano esclusivamente sul vostro computer.
- Nessun Limite: Potete unire file da 5 GB o migliaia di pagine senza rallentamenti o contatori di tentativi esauriti.
- Automazione Estendibile: Potete importare le funzioni
unisci_pdfedestrai_paginein altri script più complessi (es. per processare automaticamente report o fatture mensili).
Techelopment ha già pensato a tutto 😊
👉 Il programma completo mostrato nell’articolo è disponibile su GitHub, così da poter essere scaricato, eseguito e adattato facilmente alle proprie esigenze.
Follow me #techelopment
Official site: www.techelopment.it
facebook: Techelopment
instagram: @techelopment
X: techelopment
Bluesky: @techelopment
telegram: @techelopment_channel
whatsapp: Techelopment
youtube: @techelopment
