Questo sito utilizza i cookie per migliorare servizi ed esperienza del lettore. Se decidi di continuare la navigazione consideriamo che accetti il loro uso . Per e informazioni sulla Privacy leggere la Google Policies Privacy

Se continui nella navigazione accetti il loro uso. OK

martedì 10 agosto 2010

Aggiungere un watermark trasparente a un PDF

Torniamo a parlare di PDF e della libreria iTextSharp che mi sta esaltando sempre di più.
Vedremo come applicare un watermark trasparente con un testo a piacere su tutte le pagine di un pdf esistente.
Iniziamo a vedere come aprire un pdf:
MemoryStream m = new MemoryStream();
PdfReader read = new PdfReader(@"c:\sample.pdf");
PdfStamper st = new PdfStamper(read, m);
Il MemoryStream conterrà in nuovo pdf modificato, il PdfReader si occuperà di aprere il flusso e il PdfStamper si occuparà di modificare il pdf e salvarlo nello strem.
Vediamo ora di analizzare il problema della stampa del testo che ovviamente vorremo vederlo ruotato lungo la diagonale del foglio. Quindi dobbiamo intanto calcolare l'angolo di rotazione del testo:
iTextSharp.text.Rectangle r = read.GetPageSize(1);
double ipo = Math.Sqrt(r.Width * r.Width + r.Height * r.Height);
double angolo = Math.Acos(r.Width / ipo) * 180 / Math.PI;
Premetto che la trigonometria non è il mio forte, ma avendo la base e l'altezza del triangolo, quella dovrebbe essere la formula corretta per calcolare l'angolo.
Ora vediamo di creare un font con cui scrivere nel nostro pdf e di impostare una dimensione e un colore con cui scrivere:
//Font standard (HELVETICA)
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);

//Acquisisco un 'livello' sopra al contenuto del pdf
PdfContentByte content = st.GetOverContent(1);

//Inizio a scrivere un testo, imposto size e colore
content.BeginText();
content.SetFontAndSize(bf, 120);
content.SetRGBColorFill(100, 100, 100);

//Disegno un testoa allineato al centro e ruotato
content.ShowTextAligned(Element.ALIGN_CENTER, "RESERVED", r.Width / 2, r.Height / 2, (float)angolo);
content.EndText();
Aggiungiamo una finezza ulteriore: la trasparenza del testo. La otteniamo creando uno GraphicState con:
PdfGState trasparenza = new PdfGState();
trasparenza.FillOpacity = 0.3f;
Dobbiamo ricordarci di impostare anche lo stato della grafica al contenuto.
Vediamo il codice completo (dovevamo anche scrivere su tutte le pagine!):
MemoryStream m = new MemoryStream();
PdfReader read = new PdfReader(@"c:\sample.pdf");
PdfStamper st = new PdfStamper(read, m);


PdfGState trasparenza = new PdfGState();
trasparenza.FillOpacity = 0.3f;

BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);

//Le pagine vengono conteggiate a partire da 1
for (int i = 1; i <= read.NumberOfPages; i++) {
    iTextSharp.text.Rectangle r = read.GetPageSize(i);
    double ipo = Math.Sqrt(r.Width * r.Width + r.Height * r.Height);
    double angolo = Math.Acos(r.Width / ipo) * 180 / Math.PI;

    PdfContentByte content = st.GetOverContent(i);

    content.SaveState();
    content.SetGState(trasparenza);
    content.BeginText();
    content.SetFontAndSize(bf, 120);
    content.SetRGBColorFill(100, 100, 100);


    content.ShowTextAligned(Element.ALIGN_CENTER, "RESERVED", r.Width / 2, r.Height / 2, (float)angolo);
    content.EndText();
    content.RestoreState();
}

st.Close();
File.WriteAllBytes(@"c:\result.pdf", m.ToArray());

Nessun commento:

Posta un commento