Si vemos el formarto de factura ejemplo nos damos cuenta que lleva una logotipo o imagen en la parte sueperior derecha para poder
agregar la imagen nuestro formato pdf, nos vamos a src/main/java y creamos un paquete llamado com.tutosoftware.invoicepdf.image
y ahi pegamos la imagen de nuestra empresa o logotipo.
Ahora creamos el paquete com.tutosoftware.invoicepdf.model y el creamos la clase Factura
package com.tutosoftware.invoicepdf.model;
import java.util.Date;
public class Factura {
private int cantidad;
private Date fechaServicio;
private String concepto;
private double precioUnitario;
private double descuento;
private double total;
public Factura(int cantidad,Date fechaServicio, String concepto, double precioUnitario,double descuento, double total) {
super();
this.cantidad = cantidad;
this.fechaServicio = fechaServicio;
this.concepto = concepto;
this.precioUnitario = precioUnitario;
this.descuento = descuento;
this.total = total;
}
public int getCantidad() {
return cantidad;
}
public void setCantidad(int cantidad) {
this.cantidad = cantidad;
}
public Date getFechaServicio() {
return fechaServicio;
}
public void setFechaServicio(Date fechaServicio) {
this.fechaServicio = fechaServicio;
}
public String getConcepto() {
return concepto;
}
public void setConcepto(String concepto) {
this.concepto = concepto;
}
public double getPrecioUnitario() {
return precioUnitario;
}
public void setPrecioUnitario(double precioUnitario) {
this.precioUnitario = precioUnitario;
}
public double getDescuento() {
return descuento;
}
public void setDescuento(double descuento) {
this.descuento = descuento;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
}
Controlador
Para el controlador creamos el paquete com.tutosoftware.invoicepdf.bean y creamos la clase FacturaBean que trae la logica
para generar el pdf,agregar la tabla dinámica, y los calculos de los impuestos.
package com.tutosoftware.invoicepdf.bean;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.FontFactory;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.CMYKColor;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;
import com.lowagie.text.pdf.draw.LineSeparator;
import com.tutosoftware.invoicepdf.model.Factura;
@ManagedBean
@SessionScoped
public class FacturaBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private int cantidad;
private Date fechaServicio;
private String concepto;
private double precioUnitario;
private double descuento;
private double total;
private static ArrayList<Factura> conceptos = new ArrayList<Factura>();
private double subTotal;
private double impuestoMunicipal;
private double impuestoEstatal;
private double impuestoTotal;
private double totalFactura;
public int getCantidad() {
return cantidad;
}
public void setCantidad(int cantidad) {
this.cantidad = cantidad;
}
public Date getFechaServicio() {
return fechaServicio;
}
public void setFechaServicio(Date fechaServicio) {
this.fechaServicio = fechaServicio;
}
public String getConcepto() {
return concepto;
}
public void setConcepto(String concepto) {
this.concepto = concepto;
}
public double getPrecioUnitario() {
return precioUnitario;
}
public void setPrecioUnitario(double precioUnitario) {
this.precioUnitario = precioUnitario;
}
public double getDescuento() {
return descuento;
}
public void setDescuento(double descuento) {
this.descuento = descuento;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public ArrayList<Factura> getConceptos() {
return conceptos;
}
public double getSubTotal() {
return subTotal;
}
public void setSubTotal(double subTotal) {
this.subTotal = subTotal;
}
public double getImpuestoMunicipal() {
return impuestoMunicipal;
}
public void setImpuestoMunicipal(double impuestoMunicipal) {
this.impuestoMunicipal = impuestoMunicipal;
}
public double getImpuestoEstatal() {
return impuestoEstatal;
}
public void setImpuestoEstatal(double impuestoEstatal) {
this.impuestoEstatal = impuestoEstatal;
}
public double getImpuestoTotal() {
return impuestoTotal;
}
public void setImpuestoTotal(double impuestoTotal) {
this.impuestoTotal = impuestoTotal;
}
public double getTotalFactura() {
return totalFactura;
}
public void setTotalFactura(double totalFactura) {
this.totalFactura = totalFactura;
}
public void agregarConcepto() {
total=(cantidad * precioUnitario)-descuento;
Factura factura = new Factura(cantidad,fechaServicio,concepto,precioUnitario,descuento,total);
conceptos.add(factura);
subTotal=subTotal+total;
impuestoMunicipal=(subTotal/100)*1;
impuestoEstatal=(subTotal/100)*10.50;
impuestoTotal=impuestoMunicipal+impuestoEstatal;
totalFactura=subTotal+impuestoTotal;
cantidad=0;
concepto="";
precioUnitario=0.0;
descuento=0.0;
fechaServicio=null;
}
public void imprimir() {
Document document = new Document(PageSize.LETTER);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
Date hoy = new Date();
String fechaHoy = fechaFormato(hoy);
PdfWriter writer= PdfWriter.getInstance(document, baos);
document.open();
Font fuente1 = new Font();
Font fuente2 = new Font();
fuente1.setSize(20);
fuente2.setSize(10);
int numeroFactura=2020;
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));
LineSeparator linea = new LineSeparator();
linea.setOffset(-8.0f);
linea.setAlignment(Element.ALIGN_LEFT);
linea.setPercentage(70.0f);
document.add(linea);
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));
Image imagen = Image.getInstance(getClass().getResource("/com/tutosoftware/invoicepdf/image/tuto.jpg"));
imagen.setAbsolutePosition(400f, 650f);
document.add(imagen);
PdfPTable table = new PdfPTable(4);
table.setWidthPercentage(100.0f);
table.setWidths(new float[] {2.0f,2.0f,2.0f,2.0f});
table.setSpacingBefore(10);
Font font = FontFactory.getFont(FontFactory.HELVETICA);
font.setSize(10);
font.setColor(CMYKColor.BLACK);
// define table header cell
PdfPCell cell = new PdfPCell();
PdfPCell cell2 = new PdfPCell();
cell.setBackgroundColor(CMYKColor.CYAN);
cell.setPadding(5);
// write table header
cell.setPhrase(new Phrase("Nombre Representativo", font));
table.addCell(cell);
cell.setPhrase(new Phrase("Fecha de entrega", font));
table.addCell(cell);
cell.setPhrase(new Phrase("Contacto", font));
table.addCell(cell);
cell.setPhrase(new Phrase("Terminos", font));
table.addCell(cell);
cell2.setBorder(Rectangle.NO_BORDER);
cell2.setPhrase(new Phrase("REP 1",font));
table.addCell(cell2);
cell2.setPhrase(new Phrase(fechaHoy,font));
table.addCell(cell2);
cell2.setPhrase(new Phrase("----------",font));
table.addCell(cell2);
cell2.setPhrase(new Phrase("Net 30",font));
table.addCell(cell2);
document.add(table);
PdfPTable table2 = new PdfPTable(6);
table2.setWidthPercentage(100.0f);
table2.setWidths(new float[] {1.2f,2.0f,3.0f,2.0f,2.0f,2.0f});
table2.setSpacingBefore(10);
cell.setPhrase(new Phrase("Cantidad", font));
table2.addCell(cell);
cell.setPhrase(new Phrase("Fecha Servicio", font));
table2.addCell(cell);
cell.setPhrase(new Phrase("Descripción", font));
table2.addCell(cell);
cell.setPhrase(new Phrase("Precio", font));
table2.addCell(cell);
cell.setPhrase(new Phrase("Descuento", font));
table2.addCell(cell);
cell.setPhrase(new Phrase("Total", font));
table2.addCell(cell);
for(Factura f : conceptos) {
cell2.setPhrase(new Phrase(f.getCantidad()+"",font));
table2.addCell(cell2);
cell2.setPhrase(new Phrase(fechaFormato(f.getFechaServicio()),font));
table2.addCell(cell2);
cell2.setPhrase(new Phrase(f.getConcepto(),font));
table2.addCell(cell2);
cell2.setPhrase(new Phrase(f.getPrecioUnitario()+"",font));
table2.addCell(cell2);
cell2.setPhrase(new Phrase(f.getDescuento()+"",font));
table2.addCell(cell2);
cell2.setPhrase(new Phrase(f.getTotal()+"",font));
table2.addCell(cell2);
}
document.add(table2);
LineSeparator linea2 = new LineSeparator();
linea2.setOffset(-8.0f);
linea2.setPercentage(100.0f);
document.add(linea2);
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(Font.TIMES_ROMAN, 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));
/*
PdfContentByte cb = writer.getDirectContent();
cb.saveState();
cb.setColorStroke(CMYKColor.BLACK);
cb.rectangle(330,200,200,100);
cb.rectangle(330,140,200,60);
cb.stroke();
cb.restoreState();
*/
}catch (Exception ex) {
System.out.println("Error " + ex.getMessage());
}
document.close();
FacesContext context = FacesContext.getCurrentInstance();
Object response = context.getExternalContext().getResponse();
if (response instanceof HttpServletResponse) {
HttpServletResponse hsr = (HttpServletResponse) response;
hsr.setContentType("application/pdf");
hsr.setHeader("Content-disposition", "attachment;filename=/factura.pdf");
hsr.setContentLength(baos.size());
try {
ServletOutputStream out = hsr.getOutputStream();
baos.writeTo(out);
out.flush();
} catch (IOException ex) {
System.out.println("Error: " + ex.getMessage());
}
context.responseComplete();
}
}
public void limpiarFactura() {
conceptos.clear();
subTotal=0.0;
impuestoMunicipal=0.0;
impuestoEstatal=0.0;
impuestoTotal=0.0;
totalFactura=0.0;
}
public String fechaFormato(Date fecha) {
String cadenaFecha;
Calendar cal= Calendar.getInstance();
cal.setTime(fecha);
int dia=cal.get(Calendar.DAY_OF_MONTH);
int mes=cal.get(Calendar.MONTH)+1;
int year=cal.get(Calendar.YEAR);
String mesString;
switch (mes) {
case 1: mesString = "Enero";
break;
case 2: mesString = "Febrero";
break;
case 3: mesString = "Marzo";
break;
case 4: mesString = "Abril";
break;
case 5: mesString = "Mayo";
break;
case 6: mesString = "Junio";
break;
case 7: mesString = "Julio";
break;
case 8: mesString = "Agosto";
break;
case 9: mesString = "Septiembre";
break;
case 10: mesString = "Octubre";
break;
case 11: mesString = "Noviembre";
break;
case 12: mesString = "Diciembre";
break;
default: mesString = "Invalid month";
break;
}
cadenaFecha=dia+"/"+mesString+"/"+year;
return cadenaFecha;
}
}