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
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)??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
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
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"); } } }ecco questo è quello che ho fatto. east è il pannello da stampare.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; } } }
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.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.
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.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
io ho fatto il getWidth del pannello e mi viene 467.
ora?
ma è normale che cambia in base alla stampante impostata come predefinita? anche se poi uso quella giusta per stampare?
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
ma è normale che cambia in base alla stampante impostata come predefinita?
Ripeto che basta fare qualche calcolo. Supponiamo che vuoi "fissare" tu la larghezza del componente. Vuoi calcolare il fattore di scala tale per cui:Originariamente inviato da Aleb
io ho fatto il getWidth del pannello e mi viene 467.
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.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
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
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; } } }