Introduzione
In questo rapido articolo, ci concentreremo sulla creazione di un documento PDF da zero basato sulla popolare libreria iText e PdfBox.
Dipendenze Maven
Diamo un’occhiata alle dipendenze Maven, che devono essere incluse nel nostro progetto:
L’ultima versione delle librerie può essere trovata qui: iText e PdfBox.
È necessaria un’ulteriore dipendenza da aggiungere, nel caso il nostro file debba essere criptato. Il pacchetto Bounty Castle Provider contiene implementazioni di algoritmi crittografici ed è richiesto da entrambe le librerie:
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.56</version></dependency>
L’ultima versione della libreria può essere trovata qui: The Bounty Castle Provider.
Overview
Entrambe, iText e PdfBox sono librerie java usate per la creazione/manipolazione di file pdf. Anche se l’output finale delle librerie è lo stesso, esse operano in modo leggermente diverso. Diamogli un’occhiata.
Creare Pdf in IText
4.1. Inserire testo in Pdf
Diamo un’occhiata al modo in cui un nuovo file con testo “Hello World” viene inserito in un file pdf
Creare un pdf con un uso della libreria iText si basa sulla manipolazione di oggetti che implementano l’interfaccia Elements in Document (nella versione 5.5.10 ci sono 45 di queste implementazioni).
L’elemento più piccolo che può essere aggiunto al documento e utilizzato è chiamato Chunk, che è fondamentalmente una stringa con un font applicato.
Inoltre, i Chunk possono essere combinati con altri elementi come Paragraphs, Section ecc. ottenendo documenti dall’aspetto piacevole.
4.2. Inserire un’immagine
La libreria iText fornisce un modo semplice per aggiungere un’immagine al documento. Abbiamo semplicemente bisogno di creare un’istanza di Image e aggiungerla al documento.
4.3. Inserire una tabella
Potremmo trovarci di fronte a un problema quando vogliamo aggiungere una tabella al nostro pdf. Fortunatamente iText fornisce tale funzionalità out-of-the-box.
Prima cosa dobbiamo fare è creare un oggetto PdfTable e nel costruttore fornire un numero di colonne per la nostra tabella. Ora possiamo semplicemente aggiungere una nuova cella chiamando
Ora possiamo semplicemente aggiungere una nuova cella chiamando il metodo addCell sull’oggetto tabella appena creato. iText creerà le righe della tabella finché tutte le celle necessarie sono definite, ciò significa che una volta creata una tabella con 3 colonne e aggiunte 8 celle ad essa, solo 2 righe con 3 celle in ciascuna saranno visualizzate.
Diamo uno sguardo all’esempio:
Creiamo una nuova tabella con 3 colonne e 3 righe. La prima riga la tratteremo come un’intestazione di tabella con un colore di sfondo e una larghezza del bordo modificati:
La seconda riga sarà composta da tre celle con solo testo, senza formattazione extra.
private void addRows(PdfPTable table) { table.addCell("row 1, col 1"); table.addCell("row 1, col 2"); table.addCell("row 1, col 3");}
Possiamo includere non solo testo nelle celle ma anche immagini. Inoltre, ogni cella può essere formattata individualmente, nell’esempio presentato di seguito applichiamo regolazioni di allineamento orizzontale e verticale:
4.4. Crittografia dei file
Per applicare l’autorizzazione utilizzando la libreria iText, dobbiamo avere già creato un documento pdf. Nel nostro esempio, useremo il nostro file iTextHelloWorld.pdf generato in precedenza.
Una volta caricato il file usando PdfReader, abbiamo bisogno di creare un PdfStamper che è usato per applicare contenuti aggiuntivi al file come metadati, crittografia ecc:
Nel nostro esempio, abbiamo criptato il file con due password. La password utente (“userpass”) dove un utente ha solo diritti di sola lettura senza possibilità di stampare, e la password del proprietario (“ownerpass”) che è usata come chiave principale permettendo ad una persona di avere pieno accesso al pdf.
Se vogliamo permettere all’utente di stampare il pdf, invece di 0 (terzo parametro di setEncryption) possiamo passare:
PdfWriter.ALLOW_PRINTING
Ovviamente, possiamo mischiare diversi permessi come:
PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY
Tenete a mente che usando iText per impostare i permessi di accesso, stiamo anche creando un pdf temporaneo che dovrebbe essere cancellato e se no potrebbe essere completamente accessibile a chiunque.
Creare Pdf in PdfBox
5.1. Inserire testo in Pdf
Al contrario di iText, la libreria PdfBox fornisce API basate sulla manipolazione di flussi. Non ci sono classi come Chunk/Paragraph ecc. La classe PDDocument è una rappresentazione Pdf in-memoria dove l’utente scrive dati manipolando la classe PDPageContentStream.
Diamo un’occhiata all’esempio di codice:
5.2. Inserire un’immagine
Inserire immagini è semplice.
Prima dobbiamo caricare un file e creare un PDImageXObject, poi disegnarlo sul documento (bisogna fornire le coordinate esatte x,y).
È tutto:
5.3. Inserire una tabella
Purtroppo, PdfBox non fornisce alcun metodo out-of-box che permetta di creare tabelle. Quello che possiamo fare in tale situazione è disegnarla manualmente – letteralmente, disegnare ogni linea fino a quando il nostro disegno assomiglia alla tabella sognata.
5.4. Crittografia dei file
La libreria PDFBox fornisce la possibilità di crittografare e regolare i permessi dei file per l’utente. Rispetto ad iText, non richiede l’uso di un file già esistente, poiché si usa semplicemente PDDocument. I permessi dei file Pdf sono gestiti dalla classe AccessPermission, dove possiamo impostare se un utente sarà in grado di modificare, estrarre il contenuto o stampare un file.
Di conseguenza, creiamo un oggetto StandardProtectionPolicy che aggiunge una protezione basata su password al documento. Possiamo specificare due tipi di password. La password utente, dopo la quale la persona sarà in grado di aprire un file con i permessi di accesso applicati e la password proprietario (nessuna limitazione al file):
Il nostro esempio presenta una situazione che se un utente fornisce la password utente, il file non può essere modificato e stampato.
Conclusioni
In questo tutorial, abbiamo discusso come creare un file pdf in due popolari librerie Java.
Esempi completi possono essere trovati nel progetto basato su Maven su GitHub.
Inizia con Spring 5 e Spring Boot 2, attraverso il corso Learn Spring:
>>CORSO