Urge. Impresion en Java.

Celso
20 de Febrero del 2004
Miren necesito de manera urgente lograr imprimir, pero usando Print Job, Printable y demás como he encontrado en muchos lugares, sólo hemos logrado imprimir pantallas, y pues eso no es lo que queremos, sin embargo necesitamos imprimir unos datos que están en la pantalla y otros que no, pero los quieren con otro formato.
Supongo que esto puede ser con un Stream o flujo, ya tengo un flujo que escribe, pero ahora cómo abro el puerto? o cómo le digo que lo mande a la impresora.(Traten de ser muy claros, recuerden estamos a distancia, si cuentan con un ejemplo lo agradeceré)

julius
20 de Febrero del 2004
Yo he utilizado el PrintJob y Printable, como dices, y lo que hago es ir escribiendo en una Label y mandarla a imprimir.
Te paso el código de dos clases que utilizo, la que manda a imprimir y la que contiene lo que se quiere imprimir (la label). Me fijo ahora que la Impresora hereda de Panel, pero no se porque, posiblemente no haga falta, pero como yo también me tuve que pelear con todo esto de la impresión, no hablo muy seguor. Espero que te sirva de ejemplo. Un saludo.

import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;

public class Impresora extends Panel {


public Impresora() {
setBackground(Color.white);
}

public static void imprimirObjeto(Object o) {
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintable((Printable)o);
try {
if (printJob.printDialog()) {
printJob.setJobName("Expedientes");
printJob.print();
}
}
catch(Exception e2) {
e2.printStackTrace();
}
}

}

// y la clase que hereda de Label (esta imprime un cuadro con ciertos datos, aqui tienes que mandar a imprimir lo que necesites:

import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;

public class FichaExpediente extends Label implements Printable{

private int x;
private int y;
private int ancho;
private int alto;

private static Expediente expediente;
private static Cliente cliente;

public FichaExpediente(Expediente exp, Cliente c) {
expediente = exp;
cliente = c;
this.setAlignment(Label.CENTER);
}

public void paint(Graphics g) {
Font f = Font.getFont("Courier");
g.setFont(f);
g.setColor(Color.black);
System.out.println(x + "," + y + "," + ancho + "," + alto);
x = 5;
y = 5;
ancho = 425;
alto = 210;

g.drawRect(x,y,ancho,alto);
x = x + 20;
sumar();
g.drawString(" ",x,y);
sumar();
g.drawString("Nº Exp: " + formatString(Integer.toString(expediente.getNumeroExpediente()),40) + "Entrada : " + expediente.getFechaSistema(), x, y);
linea(g);
g.drawString("Cliente: " + cliente.getNombre(),x,y);
linea(g);
g.drawString("Asunto: " + expediente.getAsunto(),x,y);
linea(g);
g.drawString("Observaciones: " + cliente.getObservaciones(),x,y);
linea(g);
g.drawString("Persona de Contacto: " + cliente.getPersonaContacto(),x,y);
linea(g);
g.drawString("Teléfono: " + formatString(cliente.getTlf1(),50) + "Fax: " + cliente.getFax(),x,y);
linea(g);
g.drawString("Tlf 2: " + formatString(cliente.getTlf2(),20) + "Tlf 3: " + formatString(cliente.getTlf3(),20) + "Tlf 4: "+ cliente.getTlf4(),x,y);
}

public int print(Graphics g, PageFormat pf, int pi) throws PrinterException{
if (pi >= 1) {
return (Printable.NO_SUCH_PAGE);
}

Graphics2D g2 = (Graphics2D)g;

g2.translate(pf.getImageableX(),pf.getImageableY());
paint(g2);
return (Printable.PAGE_EXISTS);
}

public static void imprimirExpediente(Expediente exp, Cliente c) {
Impresora.imprimirObjeto(new FichaExpediente(exp,c));
}

private void sumar() {
y = y + 10;
}

private String formatString(String s, int n) {
if (s == null) {
s = "";
}
while (s.length() < n) {
s = s + " ";
}
return s;
}

private void linea(Graphics g) {
sumar();
g.drawLine(x - 20,y,ancho+(x-20),y);
sumar();
g.drawString(" ",x,y);
sumar();
}
}

A ver si te sirve.