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
Nos vamos a la pestaña Examinar buscamos itext elegimos ItextSharp y selecionamos Proyecto y PDFMVC y selecionamos Instalar
Cargar Imagen para pdf
Para poder cargar nuesta imagen a nuestro pdf nos vamos a directorio wwwroot->images y pegamanos la imagen tuto.jpgControlador
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
Presionamos Generar Factura