[Tip/Trick] ASP.NET MVC & PDF

Uno de las preguntas que se suele encontrar en los foros MSDN  es como mostrar un fichero PDF desde ASP.NET y como últimamente he estado trabajando con MVC y me parece muy interesante voy a mostrar como se puede hacer esto desde el controlador.

Normalmente podemos optar por dos estratégicas a la hora de mostrar un documento PDF.

1. Mostrar un fichero

Si tenemos un fichero pdf que queremos mostrar crearemos un controlador que se encargue de mostrar este recurso.

 

Con MVC tenemos un método del controlador que nos facilita muchísimo el trabajo File que se encarga de enviar el contenido de un fichero binario a la respuesta y solo tenemos que indicar el tipo “contentType” para que se muestra correctamente.

[sourcecode language=»csharp»]
public ActionResult GetPDF()
{
string filename = @"~Contentjquery.cheatsheet.1.4.pdf";
return File(filename, "application/pdf",
Server.HtmlEncode(filename));
}
[/sourcecode]

De esta manera podemos mostrar ficheros pdf, exel, word, etc. De una manera facilísima.

2. Generar un documento Pdf al vuelo

Para poder mostrar el documento pdf correctamente tendemos que utilizar alguna de las librerías gratuitas que existen en la red y en este ejemplo yo he optado por itextSharp.

Crearemos otra acción que generará un documento pdf dinámicamente, de esta manera podremos elegir crear el documento enteramente nosotros por código o utilizar una vista como plantilla para el documento.

Yo he creado una vista parcial “userControl” para generar el documento.

Describiré un poco el código de esta Acción:
[sourcecode language=»csharp»]
public ActionResult PDF()
{
ControllerContext context = this.ControllerContext;
string partialViewName = "PDF";

byte[] buf = null;
MemoryStream pdfTemp = new MemoryStream();
ViewEngineResult result = ViewEngines.Engines.FindPartialView
(context, partialViewName);

if (result.View != null)
{
string htmlTextView = GetViewToString(context, result);
iTextSharp.text.Document doc = new iTextSharp.text.Document();
iTextSharp.text.pdf.PdfWriter writer =
iTextSharp.text.pdf.PdfWriter.GetInstance(doc, pdfTemp);
writer.CloseStream = false;
doc.Open();
doc.Add(new iTextSharp.text.Paragraph("Documento PDF al Vuelo"));

AddHTMLText(doc, htmlTextView);
doc.Close();

buf = new byte[pdfTemp.Position];
pdfTemp.Position = 0;
pdfTemp.Read(buf, 0, buf.Length);
}
return File(buf, "application/pdf", "tempPdf.pdf");
}
[/sourcecode]
8: obtendremos la vista que queremos utilizar como plantilla para el documento pdf.

13: Obtendremos el contenido HTML de la vista como texto. Para eso utilizaremos el método GetViewToString.

16: Guardaremos el documento en memoria “memoryStream” para volcar el resultado posteriormente en la respuesta.

19: Podemos crear el documento por código.

21: Añadiremos el contenido de la vista al documento como texto HTML utilizando el método AddHTMLText().

26: Finalmente retornaremos el documento generado al vuelo como un fichero guardado en memoria.
[sourcecode language=»csharp»]
private string GetViewToString(ControllerContext context,
ViewEngineResult result)
{
string viewResult = "";
ViewDataDictionary viewData = new ViewDataDictionary();
TempDataDictionary tempData = new TempDataDictionary();
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
{
using (HtmlTextWriter output = new HtmlTextWriter(sw))
{
ViewContext viewContext = new ViewContext(context,
result.View, viewData, tempData, output);
result.View.Render(viewContext, output);
}
viewResult = sb.ToString();
}
return viewResult;
}
[/sourcecode]
 
[sourcecode language=»csharp»]
private void AddHTMLText(iTextSharp.text.Document doc, string html)
{
List<iTextSharp.text.IElement> htmlarraylist =
HTMLWorker.ParseToList(new StringReader(html), null);

foreach (var item in htmlarraylist)
{
doc.Add(item);
}
}
[/sourcecode]
 

Espero poder seguir haciendo más prácticas de este estilo con MVC, porque me esta gustando mucho 😉

 

 

Scroll al inicio