Asp.Net MVC cómo obtener vista para generar PDF

Me gustaría llamar una acción en un controlador. Haga que el controlador obtenga los datos del modelo. La vista luego se ejecuta y genera un PDF. El único ejemplo que he encontrado está en un artículo de Lou http://whereslou.com/2009/04/12/returning-pdfs-from-an-aspnet-mvc-action . Su código es muy elegante. La vista usa ITextSharp para generar el PDF. El único inconveniente es que su ejemplo usa el Spark View Engine. ¿Hay alguna manera de hacer algo similar con el motor de vista estándar de Microsoft?

Uso iTextSharp para generar archivos PDF dynamics en MVC. Todo lo que necesita hacer es colocar su PDF en un objeto Stream y luego su ActionResult devolverá FileStreamResult. También configuro el contenido-disposición para que el usuario pueda descargarlo.

 public FileStreamResult PDFGenerator ()
 {
     Stream fileStream = GeneratePDF ();

     HttpContext.Response.AddHeader ("contenido-disposición", 
     "attachment; filename = form.pdf");

     devolver new FileStreamResult (fileStream, "application / pdf");
 }

También tengo un código que me permite tomar una plantilla PDF, escribir texto e imágenes en ella, etc. (si quieres hacerlo).

  • Nota: debe establecer la posición del flujo en 0.
 private Stream GeneratePDF ()
 {
     // crea tu pdf y ponlo en la stream ... variable de pdf a continuación
     // viene de una clase que uso para escribir contenido en archivos PDF

     MemoryStream ms = new MemoryStream ();

     byte [] byteInfo = pdf.Output ();
     ms.Write (byteInfo, 0, byteInfo.Length);
     ms.Position = 0;

     devolver ms;
 }

nuestra respuesta final a este problema fue usar Rotativa .

Concluye el WKhtmltopdf.exe como algunas de las otras soluciones, pero es de lejos el más fácil de usar que he encontrado

Subí y voté todas las otras respuestas que también resuelven bien el problema, pero esto es lo que usamos para resolver el problema planteado en la pregunta anterior. Es diferente de las otras respuestas.

Aquí hay un tutorial de Rotativa .

después de instalarlo, esta es toda su necesidad

public ActionResult PrintInvoice(int invoiceId) { return new ActionAsPdf( "Invoice", new { invoiceId= invoiceId }) { FileName = "Invoice.pdf" }; } 

Muy muy simple.

También encontré este http://www.codeproject.com/Articles/260470/PDF-reporting-using-ASP-NET-MVC3 . Es fácil y rápido, y encaja bien con MVC.

Sin embargo, el único inconveniente hasta el momento es que no es tan flexible que desee tener un diseño decente, por ejemplo, no tiene mucho control con la tabla, y los límites de la celda a través de html. De alguna manera es compatible con forzar nueva página, pero tendrás que aplicar un parche a iTextsharp.

Crear diseño en html e imprimir luego en pdf es la forma más rápida.

La conversión de HTML a PDF es proporcionada por phantomjs , wkhtmltopdf o jsreport

jsreport proporciona integración directa con asp.net vistas de mvc, donde simplemente puede marcar acción de controlador con atributo e imprimirá pdf en lugar de html para usted.

Más en esta publicación de blog

Descargo de responsabilidad: soy el autor de jsreport

Esta es una vieja pregunta pero aún relevante y pensé que simplemente compartiría lo que implementé y que funciona bien.

  1. Instale el paquete NuGet TuesPechkin – una bifurcación en la biblioteca de Pechkin basada en WkHtmlToPdf que utiliza un motor Webkit para convertir páginas HTML a PDF.

  2. Escriba un pequeño ayudante para leer una vista y conviértala en una cadena HTML (mvcContext es this.HttpContext). ¡El reemplazo es opcional, por supuesto !:

     public static string RenderViewToString(HttpContextBase mvcContext, string area, string controllerName, string viewName, object model) { var context = System.Web.HttpContext.Current; var contextBase = mvcContext; var routeData = new RouteData(); if (area == null) area = ""; routeData.DataTokens.Add("area", area); routeData.Values.Add("controller", controllerName); var controllerContext = new ControllerContext(contextBase, routeData, new EmptyController()); var razorViewEngine = new RazorViewEngine(); var razorViewResult = razorViewEngine.FindView(controllerContext, viewName, "", false); var writer = new StringWriter(); var viewContext = new ViewContext(controllerContext, razorViewResult.View, new ViewDataDictionary(model), new TempDataDictionary(), writer); razorViewResult.View.Render(viewContext, writer); string hostAddress = context.Request.Url.Scheme + "://" + context.Request.Url.Authority; return writer.ToString() .Replace("src=\"/", "src=\"" + hostAddress + "/") .Replace(" 

El arduo trabajo de los anteriores fue desde aquí: http://wouterdekort.blogspot.co.uk/2012/10/rendering-aspnet-mvc-view-to-string-in.html?showComment=1414603363455#c7863520150405064571

  1. Crear una acción MVC para generar el documento

     public ActionResult DownloadPDF(long CentreID) { var model = GetModel() IPechkin converter = Factory.Create(); byte[] result = converter.Convert(Helpers.PDF.RenderViewToString(this.HttpContext, "area", "controller", "action", model); MemoryStream outputStream = new MemoryStream(); outputStream.Write(result, 0, result.Length); outputStream.Position = 0; return File(outputStream, "application/pdf", "filename.pdf"); } 

Acabo de usar wkhtmltopdf, para crear el diseño en html y luego lo convierto en pdf.

Fácil, personalizable, increíble como el infierno 🙂

Respuesta muy tardía, pero descubrí que la siguiente URL me ayudó a obtener mis resultados rápidamente:

(Asegúrese de hacer referencia a la DLL de iTextSharp haciendo uso de los paquetes de Nuget)

https://www.aspsnippets.com/Articles/Export-Grid-Html-Table-data-from-database-to-PDF-file-using-iTextSharp-in-ASPNet-MVC.aspx

EDITAR Este es el código que utilicé para hacer que la mesa se vea un poco diferente (Esto también es un paisaje:

 public string GetCssForPdf() { string css = ""; css = "th, td" + "{" + "font-family:Arial; font-size:10px" + "}"; return css; } [HttpPost] [ValidateInput(false)] public FileResult Export(string GridHtml) { string webgridstyle = GetCssForPdf(); string exportData = String.Format("{0}{1}", "", GridHtml); var bytes = System.Text.Encoding.UTF8.GetBytes(exportData); using (var input = new MemoryStream(bytes)) { var output = new MemoryStream(); var document = new iTextSharp.text.Document(PageSize.A4, 50, 50, 50, 50); var writer = PdfWriter.GetInstance(document, output); document.SetPageSize(iTextSharp.text.PageSize.A4.Rotate()); Font headerFont = FontFactory.GetFont("Verdana", 10); Font rowfont = FontFactory.GetFont("Verdana", 10); writer.CloseStream = false; document.Open(); var xmlWorker = iTextSharp.tool.xml.XMLWorkerHelper.GetInstance(); xmlWorker.ParseXHtml(writer, document, input, System.Text.Encoding.UTF8); document.Close(); output.Position = 0; return File(output, "application/pdf", "Pipeline_Report.pdf"); //return new FileStreamResult(output, "application/pdf"); } } 

Espero que esto ayude a alguien más también.