Concatenare dei file pdf con Python

Molte volte si ha la necessità di concatenare dei file PDF, esistono diversi programmi sul web che fanno questo lavoro, ma inviare file in cloud può essere fastidioso e generare timori sulla sicurezza dei dati. in questa pagina impareremo a CONCATENARE DEI FILE PDF CON PYTHON.

Questa spiegazione è liberamente tratta da https://realpython.com/creating-modifying-pdf/#concatenating-and-merging-pdfs

utilizzare la Classe PdfFileMerger

Le prime due istruzioni servono a caricare la libreria  PdfFileMerger e creare una nuova istanza.

from PyPDF2 import PdfFileMerger
pdf_merger = PdfFileMerger()

Attenzione! Gli oggetti PdfFileMerger objects sono vuoti quando sono inizializzati per la prima volta.

Ci sono due modi per aggiungere pagine all’oggetto pdf_merger quello da utilizzare dipende da cosa si ha bisogno di fare.

  • .append() Concatena ogni pagina in un documento PDF esistente alla fine delle pagine che sono nell’oggetto PdfFileMerger.
  • .merge() Inserisce tutte le pagine in un PDF esistente dopo una pagina nell’oggetto PdfFileMerger.

in questa pagina utilezzeremo l’istruzione .append().

Concatenare file PDF Con .append()

La cartella Desktop ha una subdirectory chiamata PDF da unire che contiene tre file PDF.

Dobbiamo unire questi tre file in un unico PDF chiamato unito.pdf.

Possiamo iniziare usando il modulo pathlib module per ottenere i Path dei tre file contenuti nella cartella PDF da unire

from pathlib import Path
reports_dir = (
Path.home()
/ "Desktop"
/ "PDF da unire"
)

Dopo aver importato la classe Path bisogna costruire il path nella cartella PDF da unire. Nota che potrebbe essere necessario modificare i nomi nel Path.

Una volta che hai i path dei file contenuti nella directory, puoi utilizzare .glob() per ottenere la lista di file PDF nella directory.

Take a look at what’s in the directory:>>>

for path in reports_dir.glob("*.pdf"):
print(path.name)

i nomi dei file vengono scritti, ma non sono in ordine.

E’ importante mettere i file in ordine alfabetico poichè può essere utile per dare una sequenza al file definitivo. Ad esempio se si modifica il nome dei file aggiungendo all’inizio del nome un numero che ne indica la sequenza si può ottenere che i file vengano uniti nella sequenza desiderata.

Per ottenere la lista ordinata si può utilizzare .sort()

listadifile = list(reports_dir.glob("*.pdf"))
listadifile.sort()

la lista listadifile sarà ordinata alfabeticamente per nome del file.

Ora si possono concatenare i file PDF. Per fare questo si usa l’istruzione PdfFileMerger.append(). quando si richiama .append(), tutte le pagine del file PDF sono appese alle pagine nell’oggetto PdfFileMerger.

prima importiamo la classe  PdfFileMerger e creiamo una nuova instanza:

from PyPDF2 import PdfFileMerger
pdf_merger = PdfFileMerger()

Ora basta fare il loop della lista expense_reports e concatenarla con pdf_merger:>>>

for path in listadifile:
   pdf_merger.append(str(path))

con tutti i file PDF nella directory “/PDF da unire” concatenati nell’ oggetto pdf_merger, l’ultima cosa da fare è scrivere il file PDF. 

le istanze PdfFileMerger hanno un metodo .write() che funziona come PdfFileWriter.write().

with Path("unito.pdf").open(mode="wb") as output_file:
   pdf_merger.write(output_file)

Si ottiene così un file PDF nella directory corrente chiamato unito.pdf.

Di seguito il sorgente completo.

from pathlib import Path
reports_dir = (
Path.home()
/ "Desktop"
/ "PDF da unire"
)
for path in reports_dir.glob("*.pdf"):
    print(path.name)
listadifile = list(reports_dir.glob("*.pdf"))
listadifile.sort()
from PyPDF2 import PdfFileMerger
pdf_merger = PdfFileMerger()
for path in listadifile:
    pdf_merger.append(str(path))
with Path(Path.home()

/ "Desktop"
/ "PDF da unire"
/ "unito.pdf").open(mode="wb") as output_file:
    pdf_merger.write(output_file)