Lab

Unire più PDF in un unico file senza usare siti web

7 min di lettura
Pila alta di documenti tenuti insieme da graffette colorate su una scrivania di legno, con un paio di occhiali in primo piano
Windows macOS Linux
Foto: Kindel Media · Pexels · Licenza Pexels

Script Python · versione 1.0.0 · verificato

unisci_pdf.py

Script autonomo che gira solo sul tuo computer. Nessun upload, nessuna telemetria.

Formato
Script Python (.py)
Dimensione
3,3 KB
Python
3.9 o superiore
Licenza
MIT
Richiede
pypdf
Rete
Offline

Crea, rinomina o sposta file solo se lo chiedi tu (per esempio per il report o la quarantena). Il codice è leggibile riga per riga nel file scaricato.

Verifica integrità

SHA-256 di unisci_pdf.py

c3544a599bc038d28106641f9be437a37637a9dc52162cf0551ca36c213e19b9

Calcola lo SHA-256 del file scaricato e confrontalo con questo: Confronta hash · Come si verifica

Unisci più PDF in un solo file sul tuo PC con Python e pypdf in un venv — senza caricare documenti d'identità o contratti su siti web.

Cercare «unire PDF gratis», aprire il primo sito e trascinare la scansione della carta d’identità o un contratto firmato è comodo. Ha un difetto strutturale: stai consegnando i documenti al server di qualcuno che non controlli. Anche se la pagina promette di cancellarli «dopo un’ora», non hai un modo tecnico per verificarlo.

Qui unisci due o più PDF sul tuo PC, con Python e la libreria pypdf, in un ambiente isolato (venv). Nessun upload: i file restano sul disco. Alla fine hai uno script riusabile ogni volta che serve un fascicolo senza cloud.

ℹ️ Nota / Prerequisito operativo
Serve Python già installato. Percorso principale: Windows; sotto trovi i comandi completi per macOS e Linux.
Se manca Python: Windows, macOS, Linux.
Pattern cartelle/venv: struttura minima di un progetto Python.

Perché evitare i merge PDF online

I servizi gratuiti di manipolazione PDF possono profilare, conservare più a lungo di quanto dichiarano o finire in un breach del provider. Per documenti d’identità, contratti, referti o buste paga il rischio non è teorico.

🚨 Avviso critico — Documenti d’identità
Non caricare documenti d’identità reali, contratti, referti o buste paga su portali web gratuiti di «merge/convert PDF». Preferisci sempre un calcolo locale.

Unire in locale significa: le pagine le combina il tuo processore. L’unico pezzo esterno è scaricare pypdf una volta dentro il venv (poi lavori offline).

Scheda tecnica dello script

Parametro Stato Dettaglio operativo
Accesso alla rete Network-access Nessuno in esecuzione Dopo pip install pypdf lo script non apre connessioni: legge e scrive solo file locali.
Modifica dei file Writes-files Nuovo file Crea un PDF di output (default documento_unito.pdf). Gli originali non vengono sovrascritti.
Dipendenza pip pypdf Libreria pura Python (niente compilatore C). Solo nel venv del progetto.
Modalità input CLI ibrida Args o cartella Con argomenti: ordine esplicito. Senza argomenti: tutti i .pdf della cartella, ordine alfabetico.

Download: unisci_pdf.py
SHA-256: c3544a599bc038d28106641f9be437a37637a9dc52162cf0551ca36c213e19b9
Repository: lunoffice/unire-pdf-locale (MIT, release v1.0.0)

Passaggio 1 — Cartella e PDF di prova

  1. Crea una cartella unire-pdf (es. in Documenti), oppure clona il repo (Opzione B sotto).
  2. Mettici due o tre PDF di prova (non i documenti veri al primo run): documento_a.pdf, documento_b.pdf.
  3. Assicurati che unisci_pdf.py sia nella stessa cartella.

Windows (Prompt dei comandi):

cd %USERPROFILE%\Documents
mkdir unire-pdf
cd unire-pdf

Windows (PowerShell):

cd $env:USERPROFILE\Documents
mkdir unire-pdf
cd unire-pdf

macOS / Linux:

cd ~/Documents
mkdir unire-pdf
cd unire-pdf

Opzione A — Download dal sito

Salva unisci_pdf.py dalla scheda download in cima a questa pagina nella cartella unire-pdf. Controlla lo SHA-256 (guida opzionale: verificare un download con SHA-256).

Opzione B — Da GitHub

git clone https://github.com/lunoffice/unire-pdf-locale.git unire-pdf
cd unire-pdf

Senza git: Code → Download ZIP sul repository, oppure prendi il singolo file dalla release v1.0.0. Stesso contenuto e stesso SHA-256 della scheda download.

Passaggio 2 — venv e installazione di pypdf

Non installare pypdf «a sistema». Isola tutto in un venv.

Creare e attivare

Windows:

python -m venv .venv
.\.venv\Scripts\activate.bat

In PowerShell: .\.venv\Scripts\Activate.ps1 (se i criteri di esecuzione bloccano lo script, usa il Prompt dei comandi con .bat).

macOS / Linux:

python3 -m venv .venv
source .venv/bin/activate

Quando è attivo vedi (.venv) all’inizio del prompt.

Installare pypdf

Windows:

python -m pip install pypdf

macOS / Linux:

python3 -m pip install pypdf

💡 Consiglio pratico — python -m pip
Così il pip è quello del Python attivo nel venv, non un altro interprete del PATH.

Passaggio 3 — Lo script

Il file scaricabile è lo stesso che trovi qui. Logica:

  1. Se passi file in CLI → li unisce in quell’ordine.
  2. Se non passi nulla → prende tutti i .pdf della cartella corrente (ordine alfabetico), escludendo il file di output.
  3. Scrive un nuovo PDF; non modifica gli originali.
#!/usr/bin/env python3
"""Unisci più PDF in un unico file — solo locale."""

from __future__ import annotations

import argparse
import sys
from pathlib import Path

from pypdf import PdfWriter

DEFAULT_OUTPUT = "documento_unito.pdf"


def raccolta_input(paths: list[str], output_name: str) -> list[Path]:
    out = Path(output_name).resolve()
    if paths:
        candidati = [Path(p) for p in paths]
    else:
        candidati = sorted(
            p for p in Path.cwd().glob("*.pdf") if p.resolve() != out
        )

    validi: list[Path] = []
    for p in candidati:
        if not p.is_file() or p.suffix.lower() != ".pdf":
            print(f"Attenzione: '{p}' saltato.", file=sys.stderr)
            continue
        if p.resolve() == out:
            continue
        validi.append(p)
    return validi


def unisci_pdf(file_input: list[Path], nome_output: str) -> None:
    if len(file_input) < 2:
        print("Errore: servono almeno 2 PDF validi.", file=sys.stderr)
        sys.exit(1)

    writer = PdfWriter()
    try:
        print(f"Inizio unione di {len(file_input)} file…")
        for pdf in file_input:
            writer.append(str(pdf))
            print(f" -> Aggiunto: {pdf.name}")
        with Path(nome_output).open("wb") as fh:
            writer.write(fh)
    except Exception as exc:  # messaggio chiaro per l'utente
        print(f"Errore durante l'unione: {exc}", file=sys.stderr)
        sys.exit(1)
    finally:
        writer.close()
    print(f"\nSuccesso: creato {Path(nome_output).resolve()}")


def main() -> None:
    parser = argparse.ArgumentParser(
        description="Unisci più PDF in un unico file (solo locale).",
    )
    parser.add_argument("files", nargs="*", help="PDF nell'ordine desiderato")
    parser.add_argument("-o", "--output", default=DEFAULT_OUTPUT)
    args = parser.parse_args()

    validi = raccolta_input(args.files, args.output)
    if not args.files:
        if not validi:
            print("Nessun PDF in cartella. Usa: python unisci_pdf.py a.pdf b.pdf", file=sys.stderr)
            sys.exit(1)
        print("Nessun argomento: unisco i PDF della cartella (alfabetico).")
    unisci_pdf(validi, args.output)


if __name__ == "__main__":
    main()

ℹ️ Nota
Il download ufficiale include gli stessi comportamenti; se incolli a mano, verifica lo SHA-256 del file scaricato.

Passaggio 4 — Esecuzione e verifica

Con (.venv) attivo e i PDF di prova nella cartella:

Ordine esplicito (consigliato):

python unisci_pdf.py documento_a.pdf documento_b.pdf

Su macOS/Linux, se python non esiste: python3 unisci_pdf.py ….

Nome di output personalizzato:

python unisci_pdf.py documento_a.pdf documento_b.pdf -o fascicolo.pdf

Solo cartella (ordine alfabetico):

python unisci_pdf.py

Output atteso (esempio):

Inizio unione di 2 file…
 -> Aggiunto: documento_a.pdf
 -> Aggiunto: documento_b.pdf

Successo: creato …/documento_unito.pdf

Apri documento_unito.pdf con il lettore di sistema: pagine presenti, ordine corretto. Gli originali restano intatti.

Ordine dei file

Con gli argomenti CLI, tu decidi l’ordine: primo file = prime pagine. Senza argomenti, l’ordine è alfabetico sul nome file — utile per un test rapido, meno per un fascicolo formale (meglio elencare i path).

Errori comuni

  1. Permission denied / file in uso — Chiudi il PDF nel visualizzatore (su Windows è frequente) e riprova.
  2. PDF cifrato — pypdf può fallire su file protetti da password (FileNotDecryptedError o simili). Sblocca prima il documento con uno strumento legittimo che già usi; questo script non aggira cifratura.
  3. Spazi nel nome — Usa le virgolette: python unisci_pdf.py "carta identita.pdf" "contratto.pdf".
  4. No module named pypdf — Il venv non è attivo (manca (.venv) nel prompt). Riattiva e reinstalla se serve.
  5. python non riconosciuto (Windows) — PATH incompleto in installazione; reinstalla spuntando «Add python.exe to PATH» o usa il launcher py -3.

Domande Frequenti (FAQ)

Come unisco più PDF senza siti web?

Con uno script locale (qui: Python + pypdf in un venv). I file non escono dal PC durante l’unione.

Perché non caricare la carta d’identità su un merge online?

Perdi il controllo su conservazione, backup e eventuali breach del provider. Il merge locale evita quel passaggio.

Cos’è pypdf e perché il venv?

pypdf manipola PDF. Il venv isola la dipendenza dal resto del sistema e riduce i conflitti tra progetti.

Come imposto l’ordine delle pagine?

Passa i file nell’ordine voluto sulla riga di comando. Senza argomenti, l’ordine è alfabetico.

Funziona su Windows, macOS e Linux?

Sì. Cambiano solo i comandi di attivazione del venv e, a volte, python vs python3.

C’è un repository GitHub?

Sì: lunoffice/unire-pdf-locale — README, licenza MIT, release v1.0.0 con unisci_pdf.py. Stesso SHA-256 della scheda download su questa pagina.

Cosa succede con PDF protetti da password?

L’unione tipicamente fallisce finché il file non è decifrato in chiaro. Lo script non bypassa protezioni.

L’unione cancella i metadati?

No in modo affidabile. Unire ≠ anonimizzare. Per le foto, vedi rimuovere metadati EXIF in locale.

Letture opzionali

Alex Lunalbi

Alex Lunalbi

Security & privacy

Dona su PayPal

Scrivo di sicurezza digitale pratica e codice IA. Su ai riparo ogni procedura è verificata su macchine reali.

Tag
  • python,
  • pdf,
  • privacy,
  • venv,
  • script