- 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
//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