Creazione di PDF da file HTML in Python con Pyppeteer

In questo articolo, esploreremo un semplice script Python per generare file PDF a partire da file HTML usando la libreria Pyppeteer, un'implementazione di Puppeteer per Python. Puppeteer è uno strumento sviluppato da Google che permette di controllare un browser tramite codice, offrendo la possibilità di automatizzare molte operazioni, tra cui il rendering di pagine web e la creazione di PDF. Vediamo come funziona il codice e come possiamo adattarlo alle nostre esigenze.

Pyppeteer è una libreria che replica le funzionalità di Puppeteer (originariamente sviluppato per JavaScript) in Python, permettendo di controllare il browser Chrome o Chromium. La sua capacità di generare PDF, screenshot e automatizzare interazioni con le pagine è particolarmente utile in contesti come la generazione di report, l'archiviazione di pagine web e lo scraping.

Prima di eseguire lo script, è necessario installare Pyppeteer. È possibile installarla tramite pip:


pip install pyppeteer

Vediamo ora il codice Python che consente di convertire file HTML in PDF.


import asyncio
import os
from pyppeteer import launch

async def create_pdf_from_html(html, pdf_path):
  browser = await launch()
  page = await browser.newPage()

  await page.setContent(html)
  await page.pdf({'path': pdf_path, 'format': 'A4'})
  await browser.close()

async def main():
    html_files_dir = './html'
    pdf_files_dir = './pdf'
    for html_file in os.listdir(html_files_dir):
        if html_file.endswith('.html'):
          html_path = os.path.join(html_files_dir, html_file)
          pdf_path = os.path.join(pdf_files_dir, html_file.replace('.html', '.pdf'))
          html = open(html_path).read()
          await create_pdf_from_html(html, pdf_path)

asyncio.get_event_loop().run_until_complete(main())

Il codice è composto da due funzioni asincrone: create_pdf_from_html e main.

La funzione create_pdf_from_html è il cuore del programma. Accetta due parametri:

  • html: il contenuto HTML da convertire in PDF.
  • pdf_path: il percorso dove salvare il file PDF generato.

La funzione crea un'istanza del browser, carica la pagina HTML e genera un PDF nel formato A4.


async def create_pdf_from_html(html, pdf_path):
  browser = await launch()  # Avvia un'istanza del browser
  page = await browser.newPage()  # Crea una nuova pagina

  await page.setContent(html)  # Imposta il contenuto HTML
  await page.pdf({'path': pdf_path, 'format': 'A4'})  # Genera il PDF in formato A4
  await browser.close()  # Chiude il browser

La funzione main gestisce l'elaborazione di più file HTML. Definisce le directory di input (./html) e output (./pdf), quindi esegue un ciclo su tutti i file HTML presenti nella directory html_files_dir. Per ogni file, legge il contenuto HTML e genera un file PDF nella directory di destinazione.


async def main():
    html_files_dir = './html'  # Directory dei file HTML
    pdf_files_dir = './pdf'  # Directory dei file PDF
    for html_file in os.listdir(html_files_dir):  # Scorre i file nella cartella HTML
        if html_file.endswith('.html'):  # Verifica l'estensione
          html_path = os.path.join(html_files_dir, html_file)  # Percorso del file HTML
          pdf_path = os.path.join(pdf_files_dir, html_file.replace('.html', '.pdf'))  # Percorso del PDF
          html = open(html_path).read()  # Legge il contenuto HTML
          await create_pdf_from_html(html, pdf_path)  # Converte in PDF

L'esecuzione dello script è gestita tramite l'uso di un loop di eventi asincrono. Il metodo asyncio.get_event_loop().run_until_complete(main()) avvia l'esecuzione di main e completa tutte le operazioni asincrone definite.

Per far funzionare correttamente lo script, è importante organizzare i file in due cartelle:

  • ./html: dove vanno inseriti i file HTML che si desidera convertire in PDF.
  • ./pdf: dove verranno salvati i file PDF generati.

La generazione di PDF a partire da HTML è una tecnica utile in molte applicazioni, come:

  • Generazione automatica di report.
  • Archiviazione di pagine web per future consultazioni.
  • Trasformazione di contenuti dinamici in documenti stampabili.

Questo approccio è particolarmente vantaggioso per chi lavora con contenuti dinamici su web e ha necessità di automatizzare la generazione di documenti in formati stabili e pronti per la stampa.

Conclusioni

In questo articolo abbiamo illustrato come usare Pyppeteer per creare PDF a partire da file HTML con Python. Abbiamo analizzato il codice in dettaglio, evidenziando come le funzionalità asincrone di Python e Pyppeteer permettano di gestire facilmente operazioni di automazione del browser e di generazione di documenti.

Torna su