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:

  1. 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.
  2. 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.

🔗 Ti piace Techelopment? Dai un'occhiata al sito per tutti i dettagli!

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 .pdf e 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

  1. Esecuzione dello script: Aprire il terminale nella cartella in cui è presente lo script ed eseguire:
    python pdf_merger_splitter.py
  2. 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.
  3. Per estrarre pagine: Specificare il file di origine e indicare l'intervallo (es. dalla pagina 1 alla 3).

📍 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.pdf o /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...

  1. Aprite la cartella o il file nel vostro File Explorer (Windows) o Finder (Mac).
  2. Trascinatelo direttamente dentro la finestra del Terminale.
  3. Il terminale scriverà automaticamente il percorso completo e corretto per voi!
  4. Premete Invio.

🛠️ Come recuperare il percorso manualmente

Se preferite copiarlo ed incollarlo, ecco come fare sui vari sistemi:

🪟 Su Windows

  1. Selezionate il file o la cartella.
  2. 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".
  3. 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

  1. Fai clic con il tasto destro (o due dita sul trackpad) sul file o sulla cartella.
  2. Tieni premuto il tasto Option (⌥) sulla tastiera.
  3. Nel menu comparirà la voce "Copia [Nome] come percorso" (Copia come pathname).
  4. 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
  • Mac / Linux:
    • File: /Users/mario/Desktop/fattura.pdf
    • Cartella: /Users/mario/Documents/PDF_Da_Unire

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_pdf ed estrai_pagine in 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