Package com.GestDB.swing

Source Code of com.GestDB.swing.ImprimirThread

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package com.GestDB.swing;

import com.GestDB.general.Trackbug;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.print.*;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.*;
import javax.swing.ImageIcon;
import javax.swing.JTable;


public class ImprimirThread extends Thread {
    private int nOrientacion = PageFormat.PORTRAIT; // por defecto vertical
    protected PageRanges pageRanges;
    protected PrinterJob printJob;
    private Component ElComponenteAImprimir = null;
    private int cont = 0;

    /** Creates a new instance of ImprimirThread */
    public ImprimirThread(Component ElComponenteAImprimir) {
        this.ElComponenteAImprimir = ElComponenteAImprimir;
    }

    public void run() {
  // una pulgada son 72 pixeles.
  // 1 milimetro son 2,834645669291 pixeles
  // 1 centimetro son 28,34645669291 pixeles
  // 1 metro son 2834,645669291 pixeles
  // 1 pulgada son 25'4 milimetros
  // 1 pulgada son 2'54 centimetros

        Book bk;
        PageFormat pf = new PageFormat();
        pf.setOrientation(nOrientacion);

        printJob = PrinterJob.getPrinterJob();
        if (printJob != null)
        {
            HashPrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
            printRequestAttributeSet.add(PrintQuality.DRAFT);
            // tenemos que calcular el n�mero de p�ginas. Para ello vamos a suponer que el papel utilizado es din A4.
            int numpaginas = getNumPaginas(ElComponenteAImprimir,159.2 , 246.2, PageFormat.PORTRAIT);

            pageRanges = new PageRanges(1, numpaginas); // una sola pagina
            printRequestAttributeSet.add(pageRanges);

            if (printJob.printDialog(printRequestAttributeSet))
            {
                try {
                    pageRanges = (PageRanges) printRequestAttributeSet.get(PageRanges.class);
                    MediaPrintableArea mpa = (MediaPrintableArea)printRequestAttributeSet.get(MediaPrintableArea.class);
                    float medidas[] = mpa.getPrintableArea(MediaPrintableArea.MM); // x, y , ancho y alto

                    OrientationRequested orientation = (OrientationRequested) printRequestAttributeSet.get(OrientationRequested.class);
                    if (orientation==null)
                        pf.setOrientation(PageFormat.PORTRAIT);
                    else if (orientation.equals(OrientationRequested.LANDSCAPE))
                        pf.setOrientation(PageFormat.LANDSCAPE);
                    else if (orientation.equals(OrientationRequested.PORTRAIT))
                        pf.setOrientation(PageFormat.PORTRAIT);
                    else if (orientation.equals(OrientationRequested.REVERSE_LANDSCAPE))
                        pf.setOrientation(PageFormat.REVERSE_LANDSCAPE);
                    else
                        pf.setOrientation(PageFormat.LANDSCAPE);
                   
                    numpaginas = getNumPaginas(ElComponenteAImprimir,medidas[2] , medidas[3], pf.getOrientation());

                    Object miObjeto = new Printable(){
                        public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException
                        {
                            // creamos una imagen para que el componente dibuje en ella
                            BufferedImage bimg = new BufferedImage(ElComponenteAImprimir.getWidth(),
                                    ElComponenteAImprimir.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
                            ElComponenteAImprimir.print(bimg.getGraphics()); // forzamos que el componente dibuje la imagen

                            // sacamos el ancho y alto de la pagina y calculamos el numero de pixels.
                            int alto = (int)pageFormat.getImageableHeight(); // - 10;
                            int ancho = (int)pageFormat.getImageableWidth(); // - 10;
                            ImageIcon ico = new ImageIcon(bimg);
                            int anchoAImprimirD = ElComponenteAImprimir.getWidth();
                            int altoAImprimirD = ElComponenteAImprimir.getHeight();
                            int anchoAImprimirS = ElComponenteAImprimir.getWidth();
                            int altoAImprimirS = ElComponenteAImprimir.getHeight();
                            int posYOrigen = 0;

                            int numPaginas = getNumPaginas(ElComponenteAImprimir, pageFormat.getImageableWidth() / 2.834645669291,
                                    pageFormat.getImageableHeight() / 2.834645669291, pageFormat.getOrientation());

                            if(ElComponenteAImprimir.getWidth() < ancho)
                            {
                                if(ElComponenteAImprimir.getHeight() >= alto)
                                {
                                    // tenemos que mirar si pintamos todo el alto o estamos en la ultima p�gina y solo el cacho que nos falta
                                    if(pageIndex == (numPaginas) -1)
                                    {
                                        altoAImprimirD = ElComponenteAImprimir.getHeight() - (pageIndex * alto);
                                        altoAImprimirS = altoAImprimirD;
                                    }
                                    else
                                    {
                                        altoAImprimirD = alto;
                                        altoAImprimirS = alto;
                                    }

                                    posYOrigen = (pageIndex * alto);
                                }
                            }
                            else
                            {
                                if(ElComponenteAImprimir.getHeight() < alto)
                                {
                                    anchoAImprimirD = ancho;
                                }
                                else
                                {
                                    // hay que calcular el procentaje a aplicar
                                    double porcentaje = (ancho * 100) / ElComponenteAImprimir.getWidth();
                                    anchoAImprimirD = (int)((ElComponenteAImprimir.getWidth() * porcentaje) / 100);
                                    if(anchoAImprimirD > ancho)
                                        anchoAImprimirD = ancho;

                                    altoAImprimirS = (int)((ElComponenteAImprimir.getHeight() * porcentaje) / 100);
                                    altoAImprimirD = altoAImprimirS / numPaginas;
                                    if(altoAImprimirD > alto)
                                        altoAImprimirD = alto;

                                    anchoAImprimirS = ElComponenteAImprimir.getWidth();
                                    altoAImprimirS = ElComponenteAImprimir.getHeight() / numPaginas;

                                    posYOrigen = pageIndex * altoAImprimirS;
                                }
                            }

                            // dibujamos la parte de la imagen que me interesa
                            graphics.drawImage(bimg,
                                    (int)pageFormat.getImageableX(), (int)pageFormat.getImageableY(),
                                    (int)pageFormat.getImageableX() + anchoAImprimirD,
                                    (int)pageFormat.getImageableY() + altoAImprimirD,
                                    0,posYOrigen, anchoAImprimirS, posYOrigen + altoAImprimirS,
                                    ico.getImageObserver());

                            if(pageIndex < numPaginas)
                                return PAGE_EXISTS;
                            else
                                return NO_SUCH_PAGE;
                        }
                    };

                    // tenemos que a�adir tantas p�ginas como tengamos en rangepage
                    bk = new Book();
                    if(ElComponenteAImprimir instanceof JTable)
                    {
                        bk.append((Printable)((JTable)ElComponenteAImprimir).getPrintable(JTable.PrintMode.FIT_WIDTH, null, null), pf, numpaginas);
                    }
                    else
                    {
                        bk.append((Printable)miObjeto, pf, numpaginas);
                    }

                    printJob.setPageable(bk);

                    // imprime
                    printJob.print(printRequestAttributeSet);
                } catch (java.awt.print.PrinterException pe) {
                    Trackbug.error(pe, pe.getMessage());
                } catch (Exception ex) {
                    Trackbug.error(ex, ex.getMessage());
                } finally{
                    System.out.println("OK");
                }
            }
        }
    }

    // tenemos que calcular el n�mero de p�ginas. Para ello vamos a suponer que el papel utilizado es din A4.
    // 1 milimetro es 2,834645669291 pixeles
    // Din A4 = 21,0 x 29,7
    // Ancho = 21 * 28,34645669291 = 595,275590551
    // Alto = 29,7 * 28.34645669291 = 841,889763779
    // los margenes son 2,5 cm
    private int getNumPaginas(Component ElComponenteAImprimir, double fancho_mm, double falto_mm, int orientacion)
    {
        int alto = (int)(falto_mm * 2.834645669291);
        int ancho = (int)(fancho_mm * 2.834645669291);
        if(orientacion == PageFormat.LANDSCAPE)
        {
            alto = ancho;
            ancho = (int)(falto_mm * 2.834645669291);
        }

        int altoAImprimirS = ElComponenteAImprimir.getHeight();
        int numPaginas = 1;

        if(ElComponenteAImprimir.getWidth() < ancho)
        {
            if(ElComponenteAImprimir.getHeight() < alto)
            {
                numPaginas = 1;
            }
            else
            {
                numPaginas = ElComponenteAImprimir.getHeight() / alto;
                if(ElComponenteAImprimir.getHeight() % alto != 0)
                    ++numPaginas;
            }
        }
        else
        {
            if(ElComponenteAImprimir.getHeight() < alto)
            {
                numPaginas = 1;
            }
            else
            {
                // hay que calcular el procentaje a aplicar
                double porcentaje = (ancho * 100) / ElComponenteAImprimir.getWidth();
                altoAImprimirS = (int)((ElComponenteAImprimir.getHeight() * porcentaje) / 100);
                numPaginas = altoAImprimirS / alto;
                if(altoAImprimirS % alto != 0)
                    ++numPaginas;
            }
        }

        return numPaginas;
    }

}
TOP

Related Classes of com.GestDB.swing.ImprimirThread

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.