/*
* 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;
}
}