- 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