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

mercoledì 18 agosto 2010

Creare un pdf da codice HTML

Parliamo sempre della libreria iTextSharp. Oggi vediamo come usarla per creare un pdf da del codice HTML e permettere all'utente di scaricarlo. Lo scenario è il seguente:
  • Abbiamo una pagina con dei post salvati su db (come questo forum per esempio)
  • Vogliamo aggiungere un pulsante su ogni post che permette di scaricarlo in formato pdf
  • Andremo a creare un HTTPHandler che crea il db e restituisce lo stream del file
Partiamo con la creazione dell'HTTPHandler. Intanto creiamo un file .ashx chiamato GetPDF.ashx:
//Codice del file GetPDF.ashx
<%@ WebHandler Language="C#" Class="GetPDF" %>

//Codice del file GetPDF.ashx.cs
public class GetPDF : IHttpHandler{
    public void ProcessRequest(HttpContext context){
    ...
    }

    public bool IsReusable { get { return false; } }
}
Ora andiamo a impostare, nella procedura ProcessRequest che verrà chiamata quando richiediamo il modulo GetPDF.ashx, gli header HTTP per indicare al browser che gli stiamo spedendo uno stream pdf e che deve permetterci il download del file:
context.Response.ContentType = "application/pdf";
context.Response.AddHeader("content-disposition", "attachment;filename=FileName.pdf");
//Toglie la cache al file da parte del browser
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
Per convertire un testo HTML in PDF utilizzaremo la classe HTMLWorker che permette il parsing di un semplice codice HTML e di qualche style (naturamente non copre completamente lo standard HTML, ma come vedremo in un'altro post, è possibile estendere questa classe per renderla più potente). I tag HTML supportati sono:
ol ul li a pre font span br p div body table td th tr i b u sub sup em strong s strike h1 h2 h3 h4 h5 h6 img hr.
e gli style css che vengono considerati sono (in parte):
align, width, height, size.
Prima di usarla però dobbiamo creare un TextReader che viene preso in pasto dalla funzione Parse della classe HTMLWorker.
System.IO.StringWriter stringWrite = new StringWriter();
//Legge il contento HTML a partire dalla query string
stringWrite.Write(GetContenuto(context.Request.QueryString["id"]));
StringReader reader = new StringReader(stringWrite.ToString());
A questo punto non ci serve altro che andare a creare un documento pdf, associarlo al parser HTML, creare un PDFWriter e indirizzare il suo output sullo stream della response, quindi scrivere il pdf.
Document doc = new Document(PageSize.A4);
HTMLWorker parser = new HTMLWorker(doc);
PdfWriter.GetInstance(doc, context.Response.OutputStream);
doc.Open();
try {
    parser.Parse(reader);
}
catch (Exception ex) {
    Paragraph paragraph = new Paragraph("Errore nella generazione del pdf: " + ex.Message);
    Chunk text = paragraph.Chunks[0] as Chunk;
    if (text != null)
        text.Font.Color = BaseColor.RED;
    paragraph.SetAlignment("center");
    doc.Add(paragraph);
}
finally {
    doc.Close();
}
L'utilizzo è semplicissimo, basta creare un link al file ashx e passargli come query string l'id dell'elemento che volgiamo trasformare in pdf:
/GetPDF.ashx?id=27

Nessun commento:

Posta un commento