Cargar ItextSharp

Antes de comenzar con nuestro controlador primero debemos cargar la librería pdf que este caso ItextSharp aunque aparece deprecada este ejemplo lo vamos a realizar con esta liberería.
Nos vamos al menú Herramientas y selecionamos Administrador de paquetes Nuget->Administrar paquetes Nuget para la solución
invoice
Nos vamos a la pestaña Examinar buscamos itext elegimos ItextSharp y selecionamos Proyecto y PDFMVC y selecionamos Instalar
invoice

Cargar Imagen para pdf

Para poder cargar nuesta imagen a nuestro pdf nos vamos a directorio wwwroot->images y pegamanos la imagen tuto.jpg
invoice



Controlador

Nos vamos al directorio Controllers y modificamos la clase HomeController.cs
 
  
               
              
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using iTextSharp.text;
using iTextSharp.text.pdf;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using PDFMVC.Models;

namespace PDFMVC.Controllers
{
    public class HomeController : Controller
    {

        private readonly IHostingEnvironment _env;

        public HomeController(IHostingEnvironment env)
        {
            _env = env;
        }

        public IActionResult Index()
        {
            return View();
        }

        public IActionResult About()
        {
            ViewData["Message"] = "Your application description page.";

            return View();
        }

        public IActionResult Contact()
        {
            ViewData["Message"] = "Your contact page.";

            return View();
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }


        [HttpPost]
        [ActionName("Index")]
        public FileStreamResult Index_Post()
        {
            MemoryStream workStream = new MemoryStream();
            Document document = new Document(PageSize.LETTER);
            PdfWriter.GetInstance(document, workStream).CloseStream = false;
            double subTotal = 0;
            double impuestoMunicipal = 0;
            double impuestoEstatal = 0;
            double impuestoTotal = 0;
            double totalFactura = 0;
            document.Open();
            BaseFont bf = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            Font fuente1 = new Font(bf, 20, Font.NORMAL);
            Font fuente2 = new Font(bf, 10, Font.NORMAL);
            int numeroFactura = 2020;
            DateTime hoy = DateTime.Now;
            string fechaHoy = hoy.ToString("dd/MM/yyyy");
            document.Add(new Paragraph(" FACTURA DE SERVICIO \n", fuente1));
            document.Add(new Paragraph("Número de factura:       " + numeroFactura + "\n", fuente2));
            document.Add(new Paragraph("Fecha de factura:        " + fechaHoy + "\n", fuente2));
            document.Add(new Paragraph("Dirección: Noche Buena#21,San Jose el Jaral,Atizapan de Zaragoza \n", fuente2));
            document.Add(new Paragraph("Estado de Mexico,Mexico cp:52924 \n", fuente2));
            document.Add(new Paragraph("Telefono: 5540583258\n", fuente2));
            document.Add(new Paragraph("Email: kapo1978@hotmail.com\n", fuente2));
            Paragraph line = new Paragraph(new Chunk(new iTextSharp.text.pdf.draw.LineSeparator(0.0F, 70.0F, BaseColor.BLACK, Element.ALIGN_LEFT, 1)));
            document.Add(line);
            document.Add(new Paragraph("\nCobre a:                                                                     " +
                            "Envie a:\n", fuente2));
            document.Add(new Paragraph("Edwin Blancovich                                                               " +
                    "Edwin Blancovich\n", fuente2));
            document.Add(new Paragraph("\n\n\nAguadilla,PR 0605\n", fuente2));
            document.Add(new Paragraph("                                                                               " +
                    "Telefono:                                  Fax:\n", fuente2));
            string path = Path.Combine(_env.WebRootPath, "images", "tuto.jpg");
            Image image = Image.GetInstance(path);
            image.SetAbsolutePosition(400f, 650f);
            document.Add(image);
            PdfPTable table = new PdfPTable(4);
            table.WidthPercentage = 100;
            table.SetWidths(new float[] { 2.0f, 2.0f, 2.0f, 2.0f });
            table.SpacingBefore = 10f;
            BaseFont bf2 = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            Font font = new Font(bf2, 10, Font.NORMAL);

            // define table header cell
            PdfPCell cell = new PdfPCell();
            PdfPCell cell2 = new PdfPCell();
            cell.BackgroundColor = BaseColor.CYAN;
            cell.Padding = 5;

            // write table header 
            cell.Phrase = new Phrase("Nombre Representativo", font);
            table.AddCell(cell);

            cell.Phrase = new Phrase("Fecha de entrega", font);
            table.AddCell(cell);

            cell.Phrase = new Phrase("Contacto", font);
            table.AddCell(cell);


            cell.Phrase = new Phrase("Terminos", font);
            table.AddCell(cell);

            cell2.Border = 0;
            cell2.Phrase = new Phrase("REP 1", font);
            table.AddCell(cell2);

            cell2.Phrase = new Phrase(fechaHoy, font);
            table.AddCell(cell2);

            cell2.Phrase = new Phrase("----------", font);
            table.AddCell(cell2);

            cell2.Phrase = new Phrase("Net 30", font);
            table.AddCell(cell2);

            document.Add(table);
            PdfPTable table2 = new PdfPTable(6);
            table2.WidthPercentage = 100;
            table2.SetWidths(new float[] { 1.2f, 2.0f, 3.0f, 2.0f, 2.0f, 2.0f });
            table2.SpacingBefore = 10;

            cell.Phrase = new Phrase("Cantidad", font);
            table2.AddCell(cell);

            cell.Phrase = new Phrase("Fecha Servicio", font);
            table2.AddCell(cell);

            cell.Phrase = new Phrase("Descripción", font);
            table2.AddCell(cell);


            cell.Phrase = new Phrase("Precio", font);
            table2.AddCell(cell);

            cell.Phrase = new Phrase("Descuento", font);
            table2.AddCell(cell);

            cell.Phrase = new Phrase("Total", font);
            table2.AddCell(cell);

            List<Factura> listaFactura = GetFactura();



            foreach (Factura f in listaFactura)
            {
                cell2.Phrase = new Phrase(f.cantidad + "", font);
                table2.AddCell(cell2);

                string fecha = f.fechaServicio.ToString("dd/MM/yyyy");


                cell2.Phrase = new Phrase(fecha, font);
                table2.AddCell(cell2);

                cell2.Phrase = new Phrase(f.concepto, font);
                table2.AddCell(cell2);


                cell2.Phrase = new Phrase(f.precioUnitario + "", font);
                table2.AddCell(cell2);


                cell2.Phrase = new Phrase(f.descuento + "", font);
                table2.AddCell(cell2);


                cell2.Phrase = new Phrase(f.total + "", font);
                table2.AddCell(cell2);

                subTotal = subTotal + f.total;
                impuestoMunicipal = (subTotal / 100) * 1;
                impuestoEstatal = (subTotal / 100) * 10.50;
                impuestoTotal = impuestoMunicipal + impuestoEstatal;
                totalFactura = subTotal + impuestoTotal;
            }

            document.Add(table2);
            line = new Paragraph(new Chunk(new iTextSharp.text.pdf.draw.LineSeparator(0.0F, 100.0F, BaseColor.BLACK, Element.ALIGN_LEFT, 1)));
            document.Add(line);
            document.Add(new Paragraph("\nPolítica de devolución:\n", fuente2));
            document.Add(new Paragraph("1.Piezas correctamente vendidas no tienen devolución.\n", fuente2));
            document.Add(new Paragraph("2.Pedidos especiales requieren depósito, este no sera reembolsable y la pieza no tiene devolución.\n", fuente2));
            document.Add(new Paragraph("3.Toda reclamación debe estar acompañada de la factura original y no debe pasar de 10 dias de ser facturada.\n", fuente2));
            document.Add(new Paragraph("4.No seremos responsables por mercancía por mas de 10 dias laborables.\n", fuente2));
            document.Add(new Paragraph("5.Piezas eléctricas no tendrán garantía ni devolución.\n", fuente2));
            document.Add(new Paragraph("\n\n\n", fuente2));
            Font font1 = new Font(bf, 10, Font.BOLD);
            document.Add(new Paragraph("                                                                                  " +
            "                 SubTotal:         $" + subTotal, font1));
            document.Add(new Paragraph("\n                                                                                  " +
            "                 Impuestos:       Municipal 1%  $" + impuestoMunicipal, font1));
            document.Add(new Paragraph("\n                                                                                  " +
            "                                      Estatal 10.50%  $" + impuestoEstatal, font1));
            document.Add(new Paragraph("\n                                                                                  " +
            "                                      Impuesto Total 11.50%  $" + impuestoTotal, font1));
            document.Add(new Paragraph("\n                                                                                  " +
            "             Total factura:           $" + totalFactura, font1));
            document.Close();

            byte[] byteInfo = workStream.ToArray();
            workStream.Write(byteInfo, 0, byteInfo.Length);
            workStream.Position = 0;

            return new FileStreamResult(workStream, "application/pdf");


        }

        public List<Factura> GetFactura()
        {

            DateTime fechaServicio1 = new DateTime(2020, 7, 28, 0, 0, 0);
            List<Factura> conceptos = new List<Factura>();
            Factura f1 = new Factura(10, fechaServicio1, "Lenovo Ideopad 330", 450.0, 100.0, 4400.0);
            conceptos.Add(f1);
            Factura f2 = new Factura(10, fechaServicio1, "Este es un test del servicio", 5.0, 0.0, 50.0);
            conceptos.Add(f2);
            return conceptos;
        }

    }
}
              
             
             
             
             
                 
             



Vista

Nos vamos al directorio Views->Home y modificamos el archivo Index.cshtml
 
  
               
            
@{
    ViewData["Title"] = "Service Invoice";
}


<div class="row">
    <div class="col-md-3">
        <h2>Factura de Servicio</h2>


        @using (Html.BeginForm("Index", "Home"))
        {
            <button id="submitButton" type="submit">Generar Factura</button>
        }


    </div>

</div>
            
            
            
            
            
            
            
                
             

Corriendo el ejemplo

invoice

Presionamos Generar Factura
invoice

invoice