Mandando un documento iText directo a la impresora

¡Miren! Sin Pdf previo
¡Miren! Sin Pdf previo

En una entrada anterior detallamos como mandar un archivo Pdf a la impresora y si bien seguro puede usar eso para implementar la impresión de un documento iText, creandolo en disco duro e imprimiendolo desde ahí, también es posible hacerlo sin necesidad de guardar nada en disco duro, veamos como :).

Imprimiendo un Pdf desde Java

Teoria

Para esto usaremos una funcionalidad muy interesante de la clase PdfWriter de iText la habilidad de enviar el documento resultante no a un archivo en disco duro sino a un objeto ByteArrayOutputStream como se ve en las siguientes lineas de código.

ByteArrayOutputStream documentoBytes = new ByteArrayOutputStream();
PdfWriter pdfWriter = new PdfWriter(documentoBytes);

Ahora ¿De que nos sirve eso?, bueno podemos convertir el ByteArrayOutputStream en un ByteArrayInputStream.

ByteArrayInputStream bais = new ByteArrayInputStream(documentoBytes.toByteArray());

Y si ha leido la documentación de PdfBox sabrá que no solo puede cargar un archivo desde el disco duro, sino también un ByteArrayInputStream.

PDDocument document = PDDocument.load(bais);

Y de ese punto ya puede seguir el mismo procedimiento mostrado en otra entrada, llamando al proceso de impresión del sistema, pero para hacerlo mas claro veamos un ejemplo.

/*
 * 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 mx.hash.printitext;

import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.printing.PDFPageable;

/**
 *
 * @author david
 */
public class PrintiText {

    private final static Logger LOGGER = Logger.getLogger("mx.hash.printitext.PrintiText");

    static public void main(String[] args) {
        try {
            PrintiText printer = new PrintiText();

            ByteArrayOutputStream documentoBytes = printer.crearDocumentoiText();
            printer.imprimir(documentoBytes);

        } catch (IOException | PrinterException ex) {
            JOptionPane.showMessageDialog(null, "Error de impresion", "Error", JOptionPane.ERROR_MESSAGE);
            LOGGER.log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Crea un documento via la libreria iText y lo almacena como un
     * ByteArrayOutputStream
     *
     * @return Documento iText en formato ByteArrayOutputStream
     */
    public ByteArrayOutputStream crearDocumentoiText() {
        LOGGER.log(Level.INFO, "Creando documento iText");

        // Es en este ByteArrayOutputStream donde se pone el documento una vez 
        // que se llama a documento.close()
        ByteArrayOutputStream documentoBytes = new ByteArrayOutputStream();

        PdfWriter pdfWriter = new PdfWriter(documentoBytes);
        PdfDocument pdfDoc = new PdfDocument(pdfWriter);

        Document documento = new Document(pdfDoc, PageSize.LETTER);
        LOGGER.log(Level.INFO, "Agregando los elementos al documento");

        documento.add(new Paragraph("Inicia el reporte"));
        documento.add(this.crearTabla());

        documento.close();

        return documentoBytes;
    }

    private Table crearTabla() {
        LOGGER.log(Level.INFO, "Creando tabla");

        float[] anchos = {50F, 50F, 50F};
        Table tablaEncabezado = new Table(anchos);

        tablaEncabezado.setWidth(500F);

        tablaEncabezado.addCell("Hora Inicio");
        tablaEncabezado.addCell("Hora Fin");
        tablaEncabezado.addCell("");
        tablaEncabezado.addCell("Fecha Inicio");
        tablaEncabezado.addCell("Fecha Fin");
        tablaEncabezado.addCell("Fin de Turno");

        return tablaEncabezado;
    }

    /**
     * Envia a imprimir el ByteArrayOutoutStream creado de un documento iText
     *
     * @param documentoBytes
     * @throws IOException
     * @throws PrinterException
     */
    public void imprimir(ByteArrayOutputStream documentoBytes) throws IOException, PrinterException {
        LOGGER.log(Level.INFO, "Enviando documento a imprimir");

        // Aqui convertimos la el arreglo de salida a uno de entrada que podemos
        // mandar a la impresora
        ByteArrayInputStream bais = new ByteArrayInputStream(documentoBytes.toByteArray());
        
        // Creamos un PDDocument con el arreglo de entrada que creamos        
        PDDocument document = PDDocument.load(bais);

        PrinterJob job = PrinterJob.getPrinterJob();

        LOGGER.log(Level.INFO, "Mostrando el dialogo de impresion");
        if (job.printDialog() == true) {
            job.setPageable(new PDFPageable(document));

            LOGGER.log(Level.INFO, "Imprimiendo documento");
            job.print();
        }
    }
}

Este programa usa iText para generar el documento que puede ver al principio de la entrada con un párrafo de texto y una tabla y después vía PdfBox mandarlo a la impresora.

El programa en ejecución.
El programa en ejecución.

Aquí puede aplicar sus conocimientos de iText y en el método crearDocumentoiText agregar mas elementos que deseé aparezcan en el documento y vea los resultados.

El ejemplo completo lo puede encontrar en GitHub en la siguiente dirección https://github.com/HashRaygoza/PrintiText


Espero que esta entrada les fuera de utilidad y desean cooperar, me pueden invitar una cerveza: https://www.paypal.me/hashRaygoza/20mxn Gracias y nos vemos en la próxima :).

Anuncios

Un comentario sobre “Mandando un documento iText directo a la impresora

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s