2009-11-19 92 views
9

Me gustaría imprimir recibos de mi aplicación asp.net mvc. Por ahora, creo que mi mejor opción es crear archivos PDF, que son más fáciles de manejar cuando van a imprimirlos, debido a los márgenes/encabezados/pies de página/etc.Generar archivos PDF desde asp.net mvc

No quiero que configuren sus navegadores solo para que puedan imprimir mis recibos, algunos de ellos simplemente no son tan inteligentes.

¿Alguna otra opción?

¿Cuál es la mejor (gratis) de la biblioteca/API para generar archivos PDF desde una aplicación asp.net mvc

+2

duplicado: http://stackoverflow.com/questions/779430/asp-net-mvc-how-toget -view-to-generate-pdf –

+0

Puede que no desee generar el PDF en una vista, por lo que no es la misma pregunta. – hminaya

+2

@hminaya: entonces es un duplicado de http://stackoverflow.com/questions/1244109/generating-pdf-file-in-net –

Respuesta

7

que he tenido un buen éxito la creación de etiquetas de códigos de barras en formato PDF utilizando Report.net, así como iTextSharp. Para iTextSharp en particular, la API parecía bastante fácil y funcionó bien en nuestra aplicación ASP.NET MVC. No hay mucha documentación para iTextSharp, por lo que debe buscar la documentación de java para iText (que es un puerto de).

Bonificación: ¡Ambos son gratuitos!

+2

Las versiones de iTextSharp posteriores a la versión 4.7 no son gratuitas si usted está usándolos comercialmente. La licencia ha cambiado. –

+0

¿Cómo logró que Report.net trabaje con MVC? Me cuesta entender cómo obtener las salidas ViewPDF o ResponsePDF para convertirlas a ActionResult. –

+0

Restringe mi comentario anterior sobre el uso de Report.NET con MVC. Ver mi respuesta por ejemplo código. –

0

Yo usaría iTextSharp si está buscando generar archivos PDF desde donde imprimir, pero en cuanto a otras opciones, ¿por qué no usar CSS para diseñar una opción fácil de imprimir de la página?

+2

Porque no puedo controlar lo que el navegador pone en el pie de página y el encabezado de la página, como la URL y esas cosas ... – hminaya

9

Usando Report.NET el código para volver su ejemplo hola mundo en una acción MVC es:

public void MyPDFAction() 
    { 
     Root.Reports.Report report = new Root.Reports.Report(new PdfFormatter()); 
     FontDef fd = new FontDef(report, "Helvetica"); 
     FontProp fp = new FontPropMM(fd, 25); 
     Page page = new Page(report); 
     page.AddCB_MM(80, new RepString(fp, "Hello World!")); 
     RT.ViewPDF(report, "HelloWorld.pdf"); 
    } 

El tipo de retorno de la acción es nulo ya que el código Report.NET actualiza directamente la respuesta, que se devuelve por defecto para las acciones anuladas. Esto abre un visor de PDF directamente desde el navegador.

Para obtener la respuesta devuelta como una página en lugar de una descarga reemplazar la línea RT.ViewPDF con

RT.ResponsePDF(report, System.Web.HttpContext.Current.Response); 

Sin embargo se marca este método como obsoleto en favor de la que se ocupa de System.Web.UI .Página. Lamentablemente, no sé cómo tratar con un objeto de página en el contexto de una aplicación de MVC.

No he podido obtener Report.NET para iniciar la descarga de un archivo PDF.

Descargar Report.NET here.

Editar Recientemente descubrí PDFSharp que parece ser más reciente que Report.NET. También está disponible bajo la licencia de MIT. Puede descargar desde here. También hay una extensa wiki con muchos ejemplos.

código básico para devolver un archivo como una descarga en MVC:

[HttpGet] 
    public ActionResult MyPdfAction() 
    { 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      PdfDocument document = new PdfDocument(); 
      PdfPage page = document.AddPage(); 
      XGraphics gfx = XGraphics.FromPdfPage(page); 
      XFont font = new XFont("Verdana", 20, XFontStyle.Bold); 
      gfx.DrawString("Hello, World!", font, XBrushes.Black, new XRect(0, 0, page.Width, page.Height), XStringFormats.Center); 
      document.Save(stream, false); 
      return File(stream.ToArray(), "application/pdf", "HelloWorld.pdf"); 
     } 
    } 

Otra Editar Si usted es interesante en la producción de documentos en gran parte basada en texto con tablas, vale la pena echarle un vistazo MigraDoc ya que proporciona una capa de abstracción útil sobre las primitivas PDFSharp. MigraDoc está incluido en la descarga de PDFSharp. Deberá agregar los proyectos PDFSharp, PDFSharp.Charting, MigraDoc.DocumentObjectModel y MigraDoc.Rendering a su proyecto para que todo funcione.

código para generar un archivo PDF para su descarga aquí:

[HttpGet] 
    public ActionResult MyPdfAction() 
    { 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      Document document = CreateDocument(); 
      document.UseCmykColor = true; 
      const bool unicode = false; 
      const PdfFontEmbedding embedding = PdfFontEmbedding.Always; 
      PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(unicode, embedding); 
      pdfRenderer.Document = document; 
      pdfRenderer.RenderDocument(); 
      pdfRenderer.PdfDocument.Save(stream, false); 
      return File(stream.ToArray(), "application/pdf", "HelloWorld.pdf"); 
     } 
    } 


    /// <summary> 
    /// Creates an absolutely minimalistic document. 
    /// </summary> 
    static Document CreateDocument() 
    { 
     Document document = new Document(); 
     Section section = document.AddSection(); 
     Paragraph paragraph = section.AddParagraph(); 
     paragraph.Format.Font.Color = Color.FromCmyk(100, 30, 20, 50); 
     paragraph.AddFormattedText("Hello, World!", TextFormat.Bold); 
     return document; 
    } 

Resumen Después de examinar una serie de soluciones PDF para C# MVC, estoy usando PDFsharp/MigraDoc. He descontado iTextSharp y los proyectos basados ​​en él debido a los altos costos de licencia si lo está usando comercialmente (€ 2500 en mi caso). Report.NET fue desarrollado teniendo en cuenta el clásico ASP.NET y no ha recibido una actualización desde 2006.

Cuestiones relacionadas