In questo articolo vedremo come gestire un file pdf tramite la libreria gratuita iTextSharp per aggiungere una filigrana tramite file PDF o immagine.
Può capitare nei file pdf che abbiamo creato, di aggiungere nella stessa pagina un altro file pdf, sovrapponendolo con un certo livello di trasparenza, oppure aggiungere un file immagine, che può essere il logo o altra immagine.
Stesura del codice
In visual studio 2017, create un nuovo progetto di tipo Windows Application, ricordando che tale codice si può utilizzare anche in ambiente web, in particolare con la tecnologia Asp.Net.
Dopo aver creato il progetto con il linguaggio di programmazione di proprio interesse, aggiungiamo il riferimento alla libreria iTextSharp la quale fornisce proprietà e metodi per la gestione dei file “PDF”.
Dopo aver aggiunto tale riferimento, nella parte visiva della form, aggiungiamo due pulsanti, uno servirà per creare un nuovo file PDF con una filigrana presa da un file “Pdf” e l’altro da un file di tipo immagine.
Dopo aver aggiunto i due pulsanti, facciamo doppio click sul pulsante ed in visualizzazione codice, scriviamo lo spazio dei nomi per gestire le classi della libreria per la gestione dei file pdf e per la gestione dei file in generale.
Qui di seguito si riporta la dichiarazione per entrambi i linguaggi.
Vb.Net
Imports System.IO
Imports iTextSharp
Imports iTextSharp.text.pdf
C#
using iTextSharp.text.pdf;
using System.IO;
A questo punto nell’evento click del primo pulsante, che abbiamo appena generato, scriviamo il codice, con il quale si elabora un file pdf già esistente, tramite la classe pdfreader, e tramite la classe "pdfStamper" viene gestita la filigrana.
Nel codice avremmo due oggetti di tipo pdfreader, con il quale andremo a gestire un file “Pdf” esistente contenente le informazioni su cui applicare la prima pagina di un altro file pdf esistente. In brevi parole uniremo due file pdf, da cui se ne crea un nuovo tramite la classe "PdfStamper".
La classe "pdfcontentByte" permette la gestione l’elaborazione dei file pdf da unire, mentre la classe pdfgstate la gestione della trasparenza.
Qui di seguito si riporta il codice per entrambi i linguaggi di programmazione.
VB.Net
Private Sub BtnGenera_Click(sender As Object, e As EventArgs) Handles BtnGenera.Click
'File nel quale inserire la filigrana
Dim pdfReader As New PdfReader("C:\test\filepdf.pdf")
'File nuovo con la filigrana applicata
Dim pdfStamper As New PdfStamper(pdfReader, New FileStream("C:\test\NuovoFilePdf.pdf", FileMode.Create))
'file pdf con la filigrana da applicare
Dim pdfReaderFiligrana As New PdfReader("C:\test\filePdfConFiligrana.pdf")
'byte del filigrana
Dim filigranaDaApplicare As PdfContentByte
'Applico la filigrana per ogni pagina
For ContaPagine As Integer = 1 To pdfReader.NumberOfPages
filigranaDaApplicare = pdfStamper.GetOverContent(ContaPagine)
Dim gsTrasparenza As New PdfGState() With {
.FillOpacity = 0.5F
}
filigranaDaApplicare.SetGState(gsTrasparenza)
filigranaDaApplicare.AddTemplate(pdfStamper.GetImportedPage(pdfReaderFiligrana, 1), 0, 0)
Next
pdfStamper.FormFlattening = True
pdfStamper.Close()
pdfReader.Close()
pdfReaderFiligrana.Close()
End Sub
C#
private void BtnGenera_Click(object sender, EventArgs e)
{
//File nel quale inserire la filigrana
PdfReader pdfReader = new PdfReader("C:\\test\\filepdf.pdf");
//File nuovo con la filigrana applicata
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream("C:\\test\\NuovoFilePdf.pdf", FileMode.Create));
//file pdf con la filigrana da applicare
PdfReader pdfReaderFiligrana = new PdfReader("C:\\test\\filePdfConFiligrana.pdf");
//byte del filigrana
PdfContentByte filigranaDaApplicare;
//Applico la filigrana per ogni pagina
for (int ContaPagine = 1; ContaPagine <= pdfReader.NumberOfPages; ContaPagine++)
{
filigranaDaApplicare = pdfStamper.GetOverContent(ContaPagine);
PdfGState gsTrasparenza = new PdfGState()
{
FillOpacity = 0.5f
};
filigranaDaApplicare.SetGState(gsTrasparenza);
filigranaDaApplicare.AddTemplate(pdfStamper.GetImportedPage(pdfReaderFiligrana, 1), 0, 0);
}
pdfStamper.FormFlattening = true;
pdfStamper.Close();
pdfReader.Close();
pdfReaderFiligrana.Close();
}
Il codice precedente tramite i commenti viene illustrata passo dopo passo le varie righe.
Da ricordare, che con il metodo “addTemplate” uniscono i due file Pdf, che poi verrà generato un nuovo file “Pdf”, mentre con il metodo close rilascio lo streamdati e libero la memoria.
Ritorniamo in visualizzazione della form, parte design, e facciamo click sul secondo pulsante, in modo che passiamo in visualizzazione codice nell’evento click di tale pulsante.
Il codice qui di seguito, è simile al precedente, con una piccola variazione, che anziché utilizzare un altro file pdf esistente, si utilizzerà un file immagine.
VB.Net
Private Sub BtnGeneraConLogo_Click(sender As Object, e As EventArgs) Handles BtnGeneraConLogo.Click
'File nel quale inserire la filigrana
Dim pdfReader As New PdfReader("C:\test\filepdf.pdf")
'File nuovo con la filigrana applicata
Dim pdfStamper As New PdfStamper(pdfReader, New FileStream("C:\test\NuovoFilePdf.pdf", FileMode.Create))
'per la gestione del logo
Dim imageLogo As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance("C:\test\logo.jpg")
imageLogo.SetAbsolutePosition(100, 100)
'byte del filigrana
Dim filigranaDaApplicare As PdfContentByte
'Applico il logo per ogni pagina
For ContaPagine As Integer = 1 To pdfReader.NumberOfPages
filigranaDaApplicare = pdfStamper.GetOverContent(ContaPagine)
Dim gsTrasparenza As New PdfGState() With {
.FillOpacity = 0.5F
}
filigranaDaApplicare.SetGState(gsTrasparenza)
filigranaDaApplicare.AddImage(imageLogo)
Next
pdfStamper.FormFlattening = True
pdfStamper.Close()
pdfRea
C#
private void BtnGeneraConLogo_Click(object sender, EventArgs e)
{
//File nel quale inserire la filigrana
PdfReader pdfReader = new PdfReader("C:\\test\\filepdf.pdf");
//File nuovo con la filigrana applicata
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream("C:\\test\\NuovoFilePdf.pdf", FileMode.Create));
//per la gestione del logo
iTextSharp.text.Image imageLogo = iTextSharp.text.Image.GetInstance("C:\\test\\logo.jpg");
imageLogo.SetAbsolutePosition(100, 100);
//byte del filigrana
PdfContentByte filigranaDaApplicare;
//Applico il logo per ogni pagina
for (int ContaPagine = 1; ContaPagine <= pdfReader.NumberOfPages; ContaPagine++)
{
filigranaDaApplicare = pdfStamper.GetOverContent(ContaPagine);
PdfGState gsTrasparenza = new PdfGState()
{
FillOpacity = 0.5f
};
filigranaDaApplicare.SetGState(gsTrasparenza);
filigranaDaApplicare.AddImage(imageLogo);
}
pdfStamper.FormFlattening = true;
pdfStamper.Close();
pdfReader.Close();
}
Come si è visto dal precedente codice, cambiando due righe di codice, in particolare aggiungendo la classe image ed utilizzando il metodo “AddImage” della classe pdfcontentyByte, il risultato è ben diverso.
Conclusioni
L’articolo ha voluto fornire delle indicazioni e tecniche di come utilizzare la libreria gratuita “ItextSharp” su aspetti non comuni della gestione dei file pdf, ma che possono rientrare in quei scenari lavorativi richiesti.
Applicando un logo o unire due file pdf, è cosa semplice nei file pdf, tramite questa libreria, cambiando solo alcune righe di codice, e scrivendo poco codice.
Una libreria completa che permette di realizzare anche complesse applicazioni, e fornisce al programmatore uno strumento di grande utilità.