Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    140

    stampa di uno scontrino

    Devo stampre il contenuto di un pannello, che contiene l'anteprima di uno scontrino.
    La stampa su A4 funziona,mi viene uno scontrino enorme. Ma devo dargli delle dimensioni (8cm di larghezza per la precisione). Come faccio?
    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280

    Re: stampa di uno scontrino

    Originariamente inviato da Aleb
    Devo stampre il contenuto di un pannello, che contiene l'anteprima di uno scontrino.
    La stampa su A4 funziona,mi viene uno scontrino enorme. Ma devo dargli delle dimensioni (8cm di larghezza per la precisione). Come faccio?
    Grazie
    Dovresti precisare di più .... usi le Printing API di Java?? Stampi direttamente il componente (intendo dire print(graphics) sul tuo pannello)??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    140
    preciso che ho copiato qua e là sui forum, ma non ci capisco molto...
    posto tutto il codice che uso


    codice:
    if(bottone==stampa){
    			job = PrinterJob.getPrinterJob();
    			PageFormat pf = job.defaultPage();
    			if (job.printDialog())
    			{
    				try {
    			     	job.setPrintable(new PrintAction(east));
    			        job.print();
    			    } catch(PrinterException pe) {
    			        JOptionPane.showMessageDialog(this, "Errore");
    			    }
    			 }	
    		}
    codice:
    class PrintAction implements Printable {
    	 	Component toPrint = null;
    	 	
    	 	public PrintAction(Component toPrint) {
    	 		this.toPrint = toPrint;
    	 	}
    	 	
    	 	public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
    	 		if(pageIndex > 0) {
    	 			return NO_SUCH_PAGE;
    	 		} else {
    	 			Graphics2D g2d = (Graphics2D)g;
    	 			g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
    	 			toPrint.printAll(g2d);
    	 			return PAGE_EXISTS;
    	 		}
    	 	}
    	 }
    ecco questo è quello che ho fatto. east è il pannello da stampare.

    io non capisco anche un altra cosa: imposto come predefinita la "stampante" pdf e l'a4 me lo stampa bene. se invece imposto come predefinita la stampante epr gli scontrini mi stampa solo una parte del pannello. me ne stampa una parte anche su pdf.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Originariamente inviato da Aleb
    io non capisco anche un altra cosa: imposto come predefinita la "stampante" pdf e l'a4 me lo stampa bene. se invece imposto come predefinita la stampante epr gli scontrini mi stampa solo una parte del pannello. me ne stampa una parte anche su pdf.
    Ok, stai usando direttamente la Printing API di Java.

    La questione è solo che devi capire come funzionano le unità di misura. Per default, nel Graphics passato al print() 1 unità equivale a 1/72 di pollice. Questo è ben chiaro e scritto nella documentazione.
    È ovvio che se stampi il pannello direttamente così 1:1, beh, 1 pixel equivale appunto a 1/72 di pollice. Se il tuo pannello a video fosse largo 200 pixel, in stampa il pannello è largo 200/72 pollici = 2,777.... pollici = 7,0555... centimetri.

    In questi casi semplicemente basta applicare un fattore di "scaling" sul Graphics2D, intendo dire il metodo scale(double sx, double sy). Chiaramente sx e sy saranno uguali ... altrimenti "comprime" in un senso!
    La questione è solo quella di calcolare il fattore di scaling. Tu sai quanto vuoi farlo largo in stampa ... e puoi sapere quanto è largo a video. Basta fare una semplice proporzione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    140
    io ho fatto il getWidth del pannello e mi viene 467.
    ora?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    140
    ma è normale che cambia in base alla stampante impostata come predefinita? anche se poi uso quella giusta per stampare?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Originariamente inviato da Aleb
    ma è normale che cambia in base alla stampante impostata come predefinita?
    Cambia che cosa .... la dimensione fisica di ciò che stampi?? In teoria no (a parità di dimensione del componente) ... a meno che mi sfugga qualcosa .... come ho detto 1 unità è mappata su una misura "fisica" di 1/72 inch.

    Originariamente inviato da Aleb
    io ho fatto il getWidth del pannello e mi viene 467.
    Ripeto che basta fare qualche calcolo. Supponiamo che vuoi "fissare" tu la larghezza del componente. Vuoi calcolare il fattore di scala tale per cui:

    pixel * fattore = dimensione_fisica_voluta

    La dimensione fisica è da indicare in 72-esimi di pollice (per ogni pollice hai 72 unità). Se vuoi 8 cm, allora 72*8/2,54 = 226,7716.....

    Girando la formula sopra:

    fattore = dimensione_fisica_voluta / pixel

    Quindi il fattore è:

    226,7716..... / 467 = 0,485592.....

    Ovviamente sono tutti calcoli da fare con dei double.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    140
    ho provato con il tuo fattore ma niente... mi taglia a metà sia in altezza che larghezza... come posso fare? ho provato con diversi fattori di scala ma o non stampa niente o mi stampa una striscia di pannello

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    140
    ho guardato un pò in giro e ho trovato il seguente codice... premetto che non capisco cosa fa.. ma sembra funzionare.
    ho due richieste? qualcuno mi riesce a spiegare cosa fa , o meglio come avviene l'impostazione della pagina?
    secondo: ho il seguente problema, devo stampare un pannello1, di seguiti una jtable, e di seguito un altro pannello2.. come si fa? io ho provato a inviargli il pannello che contiente pannello1+table+pannello2. ma quando la table ha lo scrollpane me la taglia...
    grazie

    codice:
    job = PrinterJob.getPrinterJob();
    				PageFormat format = job.defaultPage();
    				float pageWidth = MediaSize.ISO.A4.getX(MediaSize.INCH) * 72;
    				float pageHeight = MediaSize.ISO.A4.getY(MediaSize.INCH) * 72;
    				float margin = (1 / 2.54f) * 72; //1cm
    				float margin2 = (1 / 40.08f) * 72; 
    				Paper paper = new Paper();
    				paper.setSize(pageWidth, pageHeight);
    				paper.setImageableArea(margin, margin2, pageWidth - 2 * margin,
    				pageHeight - 2 * margin);
    				format.setPaper(paper);
    				format = job.validatePage(format);
    				if(job.printDialog()) {
    					try {
    					job.setPrintable(new printAction(east), format);
    					job.print();
    					} catch(PrinterException pe) {
    						JOptionPane.showMessageDialog(this, "Errore");
    					}
    				}
    codice:
    public class printAction implements Printable {
    	 	Component toPrint = null;
    	 	
    	 	public printAction(Component toPrint) {
    	 		this.toPrint = toPrint;
    	 	}
    	 	
    	 	public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
    	 		if(pageIndex > 0) {
    	 			return NO_SUCH_PAGE;
    	 		} else {
    	 			Graphics2D g2d = (Graphics2D)g;
    	 			g2d.scale(0.52,0.48);
    	 			toPrint.printAll(g2d);
    	 			return PAGE_EXISTS;
    	 		}
    	 	}
    	 }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.