generarPDF.GenerarFactura.java Source code

Java tutorial

Introduction

Here is the source code for generarPDF.GenerarFactura.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package generarPDF;

import controladores.ControladorCliente;
import controladores.ControladorConfiguraciones;
import controladores.ControladorFactura;
import controladores.ControladorFactura_Productos;
import controladores.ControladorProducto;
import entidades.Cliente;
import entidades.Factura;
import entidades.Factura_Productos;
import entidades.Productos;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

/**
 *
 * @author cardel
 */
public class GenerarFactura {

    private ControladorConfiguraciones controladorConfiguraciones;
    String IVA;
    String informacionLegalFactura;
    String NITEmpresa;
    String nombreEmpresa;
    String direccionEmpresa;

    public GenerarFactura() {

        controladorConfiguraciones = new ControladorConfiguraciones();
        String[] datosConfiguracionesFactura = controladorConfiguraciones.obtenerInformacionFactura();
        System.out.println("llego aqui 1");

        IVA = datosConfiguracionesFactura[0];
        informacionLegalFactura = datosConfiguracionesFactura[1];

        String[] configuracionesGlobales = controladorConfiguraciones.obtenerInformacionLegal();
        nombreEmpresa = configuracionesGlobales[0];
        NITEmpresa = configuracionesGlobales[1];
        direccionEmpresa = configuracionesGlobales[2];

    }

    public void imprimirFactura(int facturaID, JFrame dialogo) {
        try {
            PDDocument document = crearFactura(facturaID, dialogo);
            document.print();
            document.close();

        } catch (Exception e) {
            JOptionPane.showMessageDialog(dialogo, "Error al crear la factura", "Error", JOptionPane.ERROR_MESSAGE);
        }

    }

    public PDDocument crearFactura(int facturaID, JFrame dialogo) {

        try {

            ControladorFactura controladorFactura = new ControladorFactura();
            Factura facturaActual = controladorFactura.getFactura(" where factura_id=" + facturaID).get(0);

            ControladorCliente controladorCliente = new ControladorCliente();
            Cliente cliente = controladorCliente.obtenerClientePorID(facturaActual.getCliente_id());

            System.out.println(cliente.getCliente_id());

            PDDocument document = new PDDocument();

            PDPage pagina1 = new PDPage();
            document.addPage(pagina1);

            PDFont font = PDType1Font.HELVETICA_BOLD;
            PDFont fontNormal = PDType1Font.HELVETICA;

            PDPageContentStream contenido = new PDPageContentStream(document, pagina1);

            contenido.beginText();
            contenido.setFont(font, 16);
            contenido.moveTextPositionByAmount(30, 730);
            System.out.println("llego aqui -10");

            contenido.drawString("Factura #" + facturaActual.getFactura_id());
            contenido.endText();
            System.out.println("llego aqui -11");

            contenido.beginText();
            contenido.setFont(font, 12);
            contenido.moveTextPositionByAmount(30, 700);
            contenido.drawString(nombreEmpresa + " NIT: " + NITEmpresa);
            contenido.endText();

            contenido.beginText();
            contenido.setFont(font, 12);
            contenido.moveTextPositionByAmount(30, 680);
            contenido.drawString(direccionEmpresa);
            contenido.endText();

            contenido.beginText();
            contenido.setFont(fontNormal, 11);
            contenido.moveTextPositionByAmount(30, 650);
            contenido.drawString("Fecha:" + facturaActual.getFecha());
            contenido.endText();

            contenido.beginText();
            contenido.setFont(fontNormal, 11);
            contenido.moveTextPositionByAmount(30, 635);
            contenido.drawString("Nombre: " + cliente.getNombre());
            contenido.endText();

            contenido.beginText();
            contenido.setFont(fontNormal, 11);
            contenido.moveTextPositionByAmount(30, 620);
            contenido.drawString("Direccin: " + cliente.getDireccion());
            contenido.endText();

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(200, 590);
            contenido.drawString("DETALLE DE LA FACTURA");
            contenido.endText();

            //Dibujar lineas
            contenido.drawLine(30, 600, 500, 600);
            contenido.drawLine(30, 585, 500, 585);

            //Dibujar tabla de productos
            ControladorFactura_Productos controladorFactura_Productos = new ControladorFactura_Productos();
            ArrayList<Factura_Productos> listaProductosFactura = controladorFactura_Productos
                    .getTodosFactura_Productos(" where factura_id=" + facturaID);

            contenido.drawLine(30, 570, 500, 570);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(60, 560);
            contenido.drawString("Producto");
            contenido.endText();
            contenido.drawLine(30, 550, 30, 570);
            contenido.drawLine(200, 550, 200, 570);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(220, 560);
            contenido.drawString("Valor unitario");
            contenido.endText();
            contenido.drawLine(300, 550, 300, 570);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(320, 560);
            contenido.drawString("Unidades");
            contenido.endText();
            contenido.drawLine(380, 550, 380, 570);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(400, 560);
            contenido.drawString("Valor total");
            contenido.endText();
            contenido.drawLine(500, 550, 500, 570);
            contenido.drawLine(500, 550, 500, 570);

            contenido.drawLine(30, 550, 500, 550);

            int altura = 550;
            ControladorProducto controladorProducto = new ControladorProducto();

            /*
             * Caben en la pagina
             * Primera pagina 14
             * Seguientes paginas 21
             * Footer cuenta como 5 mas
             */
            int indiceProductos = 0;
            double totalEspaciosNecesarios = listaProductosFactura.size() + 5 + 1;
            double totalPaginas = 1;

            if (Math.floor(totalEspaciosNecesarios / 17) == 0) {
                totalPaginas = 1;
            } else {
                totalEspaciosNecesarios -= 17;
                totalPaginas += (int) Math.ceil(totalEspaciosNecesarios / 21);
            }

            //Primer pagina
            for (int i = 0; i < listaProductosFactura.size() && altura >= 30; i++) {
                //Imprime por paginas
                Factura_Productos facturaProducto = listaProductosFactura.get(i);
                Productos productoActual = controladorProducto
                        .getProducto(" where producto_id=" + facturaProducto.getProducto_id()).get(0);

                String nombreProducto = productoActual.getNombre();

                if (nombreProducto.length() > 25) {
                    nombreProducto = nombreProducto.substring(0, 26);
                }

                Double totalProducto = productoActual.getPrecio() * facturaProducto.getUnidades();
                NumberFormat formatter = new DecimalFormat("#0");

                String valorUnitario = String.valueOf(productoActual.getPrecio());
                String unidades = String.valueOf(facturaProducto.getUnidades());
                String valorTotal = String.valueOf(formatter.format(totalProducto));

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(40, altura - 15);
                contenido.drawString(String.valueOf(i + 1));
                contenido.endText();
                contenido.drawLine(30, altura, 30, altura - 30);
                contenido.drawLine(200, altura, 200, altura - 30);

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(70, altura - 15);
                contenido.drawString(nombreProducto);
                contenido.endText();
                contenido.drawLine(70, altura, 70, altura - 30);
                contenido.drawLine(200, altura, 200, altura - 30);

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(220, altura - 15);
                contenido.drawString(valorUnitario);
                contenido.endText();
                contenido.drawLine(300, altura, 300, altura - 30);

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(320, altura - 15);
                contenido.drawString(unidades);
                contenido.endText();
                contenido.drawLine(380, altura, 380, altura - 30);

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(400, altura - 15);
                contenido.drawString(valorTotal);
                contenido.endText();
                contenido.drawLine(500, altura, 500, altura - 30);
                //Linea inferior
                contenido.drawLine(30, altura - 30, 500, altura - 30);
                altura -= 30;
                indiceProductos = i + 1;
            }
            //Escribir footer si paginas es igual a 1
            if (totalPaginas == 1) {
                Double valor = facturaActual.getValor();
                Double ivaCalculado = Math.ceil(valor * Double.parseDouble(IVA) / 100);
                Double subtotal = Math.floor(valor * (1 - Double.parseDouble(IVA) / 100));

                NumberFormat formatter = new DecimalFormat("#0");
                String valorFormateado = formatter.format(valor);

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(320, altura - 15);
                contenido.drawString("Subtotal");
                contenido.endText();
                contenido.drawLine(380, altura, 380, altura - 30);

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(400, altura - 15);
                contenido.drawString(String.valueOf(subtotal));
                contenido.endText();
                contenido.drawLine(500, altura, 500, altura - 30);

                //Linea inferior
                contenido.drawLine(320, altura, 320, altura - 30);
                contenido.drawLine(320, altura - 30, 500, altura - 30);

                altura -= 30;
                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(320, altura - 15);
                contenido.drawString("IVA " + IVA + "%");
                contenido.endText();
                contenido.drawLine(380, altura, 380, altura - 30);

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(400, altura - 15);
                contenido.drawString(String.valueOf(ivaCalculado));
                contenido.endText();
                contenido.drawLine(500, altura, 500, altura - 30);
                //Linea inferior
                contenido.drawLine(320, altura, 320, altura - 30);
                contenido.drawLine(320, altura - 30, 500, altura - 30);
                altura -= 30;

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(320, altura - 15);
                contenido.drawString("Total");
                contenido.endText();
                contenido.drawLine(380, altura, 380, altura - 30);

                contenido.beginText();
                contenido.setFont(font, 12);
                contenido.moveTextPositionByAmount(400, altura - 15);
                contenido.drawString(valorFormateado);
                contenido.endText();
                contenido.drawLine(500, altura, 500, altura - 30);
                //Linea inferior
                contenido.drawLine(320, altura - 30, 500, altura - 30);
                contenido.drawLine(320, altura, 320, altura - 30);

                //Informacion legal
                altura -= 40;
                contenido.beginText();
                contenido.setFont(fontNormal, 10);
                contenido.moveTextPositionByAmount(50, altura);
                contenido.drawString(informacionLegalFactura);
                contenido.endText();

            }

            //Siguientes paginas
            for (int j = 1; j < totalPaginas; j++) {
                altura = 650;
                PDPage paginaSiguiente = new PDPage();
                document.addPage(paginaSiguiente);

                PDPageContentStream contenidoSiguiente = new PDPageContentStream(document, paginaSiguiente);
                //Escribir paginas
                for (int i = indiceProductos; i < listaProductosFactura.size() && altura >= 30; i++) {
                    //Imprime por paginas
                    Factura_Productos facturaProducto = listaProductosFactura.get(i);
                    Productos productoActual = controladorProducto
                            .getProducto(" where producto_id=" + facturaProducto.getProducto_id()).get(0);

                    String nombreProducto = productoActual.getNombre();

                    if (nombreProducto.length() > 25) {
                        nombreProducto = nombreProducto.substring(0, 26);
                    }

                    Double totalProducto = productoActual.getPrecio() * facturaProducto.getUnidades();
                    NumberFormat formatter = new DecimalFormat("#0");

                    String valorUnitario = String.valueOf(productoActual.getPrecio());
                    String unidades = String.valueOf(facturaProducto.getUnidades());
                    String valorTotal = String.valueOf(formatter.format(totalProducto));

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(40, altura - 15);
                    contenidoSiguiente.drawString(String.valueOf(i + 1));
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(30, altura, 30, altura - 30);
                    contenidoSiguiente.drawLine(200, altura, 200, altura - 30);

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(70, altura - 15);
                    contenidoSiguiente.drawString(nombreProducto);
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(70, altura, 70, altura - 30);
                    contenidoSiguiente.drawLine(200, altura, 200, altura - 30);

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(320, altura - 15);
                    contenidoSiguiente.drawString(unidades);
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(font, 12);
                    contenidoSiguiente.moveTextPositionByAmount(400, altura - 15);
                    contenidoSiguiente.drawString(valorTotal);
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(500, altura, 500, altura - 30);
                    //Linea inferior
                    contenidoSiguiente.drawLine(30, altura - 30, 500, altura - 30);
                    indiceProductos = i + 1;
                    altura -= 30;
                }
                //Si no cabe mas cierre el flujo.
                if (indiceProductos < listaProductosFactura.size()) {
                    contenidoSiguiente.close();
                }
                //En ultima pagina escribir footer
                if (j == totalPaginas - 1 && altura >= 40) {
                    Double valor = facturaActual.getValor();
                    Double ivaCalculado = Math.ceil(valor * Double.parseDouble(IVA) / 100);
                    Double subtotal = Math.floor(valor * (1 - Double.parseDouble(IVA) / 100));
                    NumberFormat formatter = new DecimalFormat("#0");
                    String valorFormateado = formatter.format(valor);

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(320, altura - 15);
                    contenidoSiguiente.drawString("Subtotal");
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(400, altura - 15);
                    contenidoSiguiente.drawString(String.valueOf(subtotal));
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(500, altura, 500, altura - 30);

                    //Linea inferior
                    contenidoSiguiente.drawLine(320, altura, 320, altura - 30);
                    contenidoSiguiente.drawLine(320, altura - 30, 500, altura - 30);

                    altura -= 30;
                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(320, altura - 15);
                    contenidoSiguiente.drawString("IVA " + IVA + "%");
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(400, altura - 15);
                    contenidoSiguiente.drawString(String.valueOf(ivaCalculado));
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(500, altura, 500, altura - 30);
                    //Linea inferior
                    contenidoSiguiente.drawLine(320, altura, 320, altura - 30);
                    contenidoSiguiente.drawLine(320, altura - 30, 500, altura - 30);
                    altura -= 30;

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(320, altura - 15);
                    contenidoSiguiente.drawString("Total");
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(400, altura - 15);
                    contenidoSiguiente.drawString(valorFormateado);
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(500, altura, 500, altura - 30);
                    //Linea inferior
                    contenidoSiguiente.drawLine(320, altura - 30, 500, altura - 30);
                    contenidoSiguiente.drawLine(320, altura, 320, altura - 30);

                    //Informacion legal
                    altura -= 40;
                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 10);
                    contenidoSiguiente.moveTextPositionByAmount(50, altura);
                    contenidoSiguiente.drawString(informacionLegalFactura);
                    contenidoSiguiente.endText();

                    contenidoSiguiente.close();
                } else {
                    contenidoSiguiente.close();
                }

                System.out.println("Pagina numero: " + j + " De  " + totalPaginas);

            }

            contenido.close();
            return document;

        } catch (Exception e) {
            JOptionPane.showMessageDialog(dialogo,
                    "Error al crear la factura\nInformacin Tcnica\n" + e.toString(), "Error",
                    JOptionPane.ERROR_MESSAGE);
            return null;
        }

    }
}