PDA

View Full Version : [Java] PrinterJob e dimensioni pagina


Vimax
20-04-2010, 18:13
Salve a tutti. Premetto che mi son girato un bel pò di guide/codici e post qui sul forum prima di decidermi a postare,ma sto in crisi <.<.

Quello che devo fare è far stampare una semplice stringa di testo a java, su una determinata stampante, senza far apparire alcun prompt (niente printDialog per intenderci), ridimensionando però la pagina.

Il mio codice è
import javax.print.*;
import java.awt.*;
import java.awt.print.*;

public class Provaprint {
static String testo = "ahahah";
static PageFormat pf = new PageFormat();
static Paper paper = new Paper();
static int larghezza = 228, altezza = 100;
static Font font = new Font("Dialog", Font.PLAIN, 15);

public static void main(String args[]) {

PrintService[] services = PrintServiceLookup.lookupPrintServices(null,null);
// just display all printer name
for (int i = 0; i < services.length; i++) {
System.out.println(services[i].getName()); // --> get printer name
}

PrinterJob job = PrinterJob.getPrinterJob();
try{ job.setPrintService(services[3]);
}catch(PrinterException e){}
pf=job.defaultPage();
paper.setSize(larghezza,altezza);
paper.setImageableArea(10, 10, larghezza-20, altezza-20);
pf.setPaper(paper);
robaDaStampare rbd= new robaDaStampare(testo,font);
rbd.setPageFormat(pf); //questo è dannatamente inutile e ridondante...e infatti non funziona
pf = job.validatePage(pf);

job.setPrintable(rbd,pf);
try {job.print();
} catch(PrinterException e){}

}
}

class robaDaStampare implements Printable{
private String testo;
private Font font;
PageFormat pageFormat;

public robaDaStampare(String tes,Font fon){
this.testo=tes;
this.font=fon;
}

public int print(Graphics g, PageFormat pageFormat, int page) throws
PrinterException {
if (page > 0) { /* We have only one page, and 'page' is zero-based */
return NO_SUCH_PAGE;
}
System.out.println("Y " + pageFormat.getImageableY());
System.out.println("height" + pageFormat.getImageableHeight());

g.setFont(font);
g.drawString(testo, 50, 50);

return PAGE_EXISTS;

}
public void setPageFormat(PageFormat pageFo) {
pageFormat = pageFo;
}


}

Lasciando perdere la storia sui nomi dei service (Che mi serviranno in seguito per selezionare automaticamente la stampante), stampa la stringa in alto a sx, ma la stampante di adobe mi lascia il voglio come un A4 standard, nonostante i due System.out mi diano la corretta dimensione.
Ora, quello che mi manda piu in crisi è che se modifico il metodo print inserendo di nuovo la formattazione della pagina (non so perchè, l'ho fatto a tentativi), nonostante la prima pagina rimane un a4, se stampo piu di una pagina (mettendo if(page >2)) dalla seconda in poi escon tutte della dimensione corretta :cry:

Praticamente dichiaro "larghezza" , "altezza" e "paper" anche nella class robaDaStampare, e poi modifico così il print:

public int print(Graphics g, PageFormat pageFormat, int page) throws
PrinterException {
pageFormat=job.defaultPage();
paper.setSize(larghezza,altezza);
paper.setImageableArea(10, 10, larghezza-20, altezza-20);
pageFormat.setPaper(paper);
if (page > 0) { /* We have only one page, and 'page' is zero-based */
return NO_SUCH_PAGE;
}
System.out.println("Y " + pageFormat.getImageableY());
System.out.println("height" + pageFormat.getImageableHeight());

g.setFont(font);
g.drawString(testo, 50, 50);

return PAGE_EXISTS;

}

Non sò cosa fare :(