Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    Stampare immagini: esce il foglio bianco

    ciao!

    come da titolo, dovrei stampare una serie di immagini con java.
    al momento, per capire il funzionamento, sto cercando di stamparne una sola.
    questo il codice:
    codice:
    String imgTest = "/home/matte/Desktop/C180-001.jpg";
    Image image = new Image(new File(imgTest).toURI().toString());
    BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null);
    PrinterJob pj = PrinterJob.getPrinterJob();
    pj.setPrintable((graphics, pageFormat, pageIndex) -> {
        int x = (int) Math.ceil(pageFormat.getImageableX());
        int y = (int) Math.ceil(pageFormat.getImageableY());
        if (pageIndex != 0) {
            return Printable.NO_SUCH_PAGE;
        }
        graphics.drawImage(bufferedImage, x, y, bufferedImage.getWidth(), bufferedImage.getHeight(), null);
        return Printable.PAGE_EXISTS;
    });
    try {
        pj.print();
    } catch (PrinterException e) {
        GenericDialog.showDialog(e.getMessage(), Alert.AlertType.ERROR);
    }
    il problema è che esce il foglio bianco.
    non va in eccezione, non ottengo errori, ecc.
    dove sto sbagliando??

  2. #2
    ok, ho fatto un pò di modifiche:
    codice:
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.awt.print.PageFormat;
    import java.awt.print.Printable;
    import java.awt.print.PrinterException;
    import java.awt.print.PrinterJob;
    
    public class PrintImage implements Printable {
    
        private double x;
        private double y;
        private double width;
        private int orientation;
        private BufferedImage image;
    
        public PrintImage(PrinterJob printJob, BufferedImage image) {
            PageFormat pageFormat = printJob.defaultPage();
            this.x = pageFormat.getImageableX();
            this.y = pageFormat.getImageableY();
            this.width = pageFormat.getImageableWidth();
            this.orientation = pageFormat.getOrientation();
            this.image = image;
        }
    
        @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
            if (pageIndex == 0) {
                int pWidth = 0;
                int pHeight = 0;
                if (orientation == PageFormat.PORTRAIT) {
                    pWidth = (int) Math.min(width, (double) image.getWidth());
                    pHeight = pWidth * image.getHeight() / image.getWidth();
                } else {
                    pHeight = (int) Math.min(width, (double) image.getHeight());
                    pWidth = pHeight * image.getWidth() / image.getHeight();
                }
                graphics.drawImage(image, (int) x, (int) y, pWidth, pHeight, null);
                return PAGE_EXISTS;
            } else {
                return NO_SUCH_PAGE;
            }
        }
    }
    richiamato così:
    codice:
    String imgTest = "/home/matte/Desktop/C180-001.jpg";
    Image image = new Image(new File(imgTest).toURI().toString());
    BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null);
    PrinterJob pj = PrinterJob.getPrinterJob();
    pj.setPrintable(new PrintImage(pj, bufferedImage));
    if (pj.printDialog()) {
        try {
            pj.print();
        } catch (PrinterException e) {
            GenericDialog.showDialog(e.getMessage(), Alert.AlertType.ERROR);
        }
    }
    l'immagine è stata stampata correttamente.

    ora vorrei stampare le immagini prese da una ListView.
    secondo voi come sarebbe meglio procedere??

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    il problema è che esce il foglio bianco.
    non va in eccezione, non ottengo errori, ecc.
    dove sto sbagliando??
    Ad occhio non vedo nulla di palesemente errato. Generalmente prima del print() si fa un printDialog() per scegliere stampante, ecc... Se non lo fai, viene usata stampante e impostazioni predefinite.

    Quanto è grande la immagine? Tieni presente che per default nel Graphics ricevuto dal Printable la matrice di trasformazione è tale per cui una unità corrisponde a 1/72 di pollice.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #4
    si ma probabilmente c'era un errore con le misure.
    cmq ho risolto creando una classe che implementa Printable, e dove faccio alcuni settaggi.

    più che altro sto cercando di capire come adattare quel codice ad una lista di immagini.
    cioè, ho una lista di immagini:
    codice:
    ArrayList<String> lp = new ArrayList<>(listViewImages.getItems());
    e vorrei stamparle tutte.
    di primo acchitto avevo pensato di passare l'ArrayList alla classe sopra.
    poi iterarci sopra e stampare una ad una.
    ma non so se esiste un modo migliore per fare questa cosa!

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    cmq ho risolto creando una classe che implementa Printable
    Sì, molto meglio. Una lambda verrebbe "troppo" lunga.

    Quote Originariamente inviata da fermat Visualizza il messaggio
    più che altro sto cercando di capire come adattare quel codice ad una lista di immagini.
    Innanzitutto c'è la questione delle dimensioni fisiche. La immagine ha tot pixel in larghezza/altezza. Come vuoi "spalmare" questi pixel sul foglio?
    Con un DPI fisso? O con una logica fit-width "adatta a larghezza" (del foglio) o una fit-box (il fattore di scalamento tale da far stare comunque la immagine nel foglio?

    Poi un conto è se ciascuna immagine deve stare in una pagina a sé stante. Questo è relativamente semplice: hai N immagini ... avrai N pagine. Altro conto (più difficile) è se volessi far stare più immagini nella pagina e magari andare in pagina successiva senza troncare a metà alcuna immagine. Questo richiede più "logica".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  6. #6
    allora, per le dimensioni al momento hi fatto questo:
    codice:
    public class PrintImage implements Printable {
    
        private double x;
        private double y;
        private double width;
        private int orientation;
        private BufferedImage image;
    
        public PrintImage(PrinterJob printJob, BufferedImage image) {
            PageFormat pageFormat = printJob.defaultPage();
            this.x = pageFormat.getImageableX();
            this.y = pageFormat.getImageableY();
            this.width = pageFormat.getImageableWidth();
            this.orientation = pageFormat.getOrientation();
            this.image = image;
        }
    
        @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
            if (pageIndex == 0) {
                int pWidth = 0;
                int pHeight = 0;
                if (orientation == PageFormat.PORTRAIT) {
                    pWidth = (int) Math.min(width, (double) image.getWidth());
                    pHeight = pWidth * image.getHeight() / image.getWidth();
                } else {
                    pHeight = (int) Math.min(width, (double) image.getHeight());
                    pWidth = pHeight * image.getWidth() / image.getHeight();
                }
                graphics.drawImage(image, (int) x, (int) y, pWidth, pHeight, null);
                return PAGE_EXISTS;
            } else {
                return NO_SUCH_PAGE;
            }
        }
    }
    ho fatto qualche test, e non ho avuto problemi.
    ma sempre con una sola immagine.

    per quanto riguarda la seconda domanda, una immagine a pagina.
    non ho necessità di stampare varie immagini su una pagina!

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    ma sempre con una sola immagine.
    È il tuo PrintImage che deve ricevere e tenersi innanzitutto la lista di immagini.

    Quote Originariamente inviata da fermat Visualizza il messaggio
    per quanto riguarda la seconda domanda, una immagine a pagina.
    non ho necessità di stampare varie immagini su una pagina!
    Benissimo, allora N immagini --> N pagine.

    Tieni presente che il sistema di printing può invocare il print del Printable in modo molto "arbitrario" (c'è tutta la spiegazione nel javadoc di Printable). Quindi la implementazione del Printable deve stare più "passiva" possibile. Ti viene chiesta la pagina x: l'indice x è valido nella lista di immagini? Sì, ok stampi. No, la pagina non esiste.

    Infine:
    Non ho ovviamente provato il tuo codice ma "ad occhio":

    pWidth = (int) Math.min(width, (double) image.getWidth());

    non mi pare corretto (idem l'altro). Il primo width è nell'unità (di default) di 1/72 inch mentre image.getWidth() è in "pixel". Stai facendo un min tra patate e carote ....

    Inoltre non è correttissimo che prendi il PageFormat (nel costruttore) PRIMA del printDialog(). Perché nella dialog l'utente può cambiare il formato pagina.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  8. #8
    si in effetti hai ragione.

    allora, ho fatto un pò di pulizia, ma adesso escono solo pagine bianche:
    codice:
    public class PrintImage implements Printable {
    
        private BufferedImage[] images;
    
        public PrintImage(BufferedImage[] images) {
            this.images = images;
        }
    
        @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
            if (pageIndex < images.length) {
                graphics.drawImage(images[pageIndex], 0, 0, images[pageIndex].getWidth(), images[pageIndex].getHeight(), null);
                return PAGE_EXISTS;
            } else {
                return NO_SUCH_PAGE;
            }
        }
    }
    e passo l'array così:
    codice:
    int lvSize = listViewImages.getItems().size();
    if (lvSize > 0) {
        ArrayList<String> lp = new ArrayList<>(listViewImages.getItems());
        BufferedImage[] bufferedImages = new BufferedImage[lp.size()];
        for (int i = 0; i < lp.size(); i++) {
            Image image = new Image(new File(lp.get(i)).toURI().toString());
            bufferedImages[i] = SwingFXUtils.fromFXImage(image, null);
        }
        PrinterJob pj = PrinterJob.getPrinterJob();
        pj.setPrintable(new PrintImage(bufferedImages));
        if (pj.printDialog()) {
            try {
                pj.print();
            } catch (PrinterException e) {
                GenericDialog.showDialog(e.getMessage(), Alert.AlertType.ERROR);
            }
        }
    }
    Ultima modifica di fermat; 05-02-2018 a 13:46

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    codice:
    graphics.drawImage(images[pageIndex], 0, 0, images[pageIndex].getWidth(), images[pageIndex].getHeight(), null);
    Così comunque non basta, devi usare il PageFormat per dedurre lo scalamento da fare (se vuoi un fit-width o fit-box).
    Come hai appena fatto, presuppone 1 pixel = 1/72 inch
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  10. #10
    allora, nel frattempo ho fatto svariati tentativi.

    l'unico che mi ha funzionato è questo:
    codice:
    public class PrintImage implements Printable {
    
        private BufferedImage[] images;
        private PrinterJob printJob;
    
        public PrintImage(PrinterJob printJob, BufferedImage[] images) {
            this.images = images;
            this.printJob = printJob;
        }
    
        @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
            if (pageIndex < images.length) {
                pageFormat = printJob.defaultPage();
                double x = pageFormat.getImageableX();
                double y = pageFormat.getImageableY();
                double width = pageFormat.getImageableWidth();
                int pWidth = 0;
                int pHeight = 0;
                if (pageFormat.getOrientation() == PageFormat.PORTRAIT) {
                    pWidth = (int) Math.min(width, (double) images[pageIndex].getWidth());
                    pHeight = pWidth * images[pageIndex].getHeight() / images[pageIndex].getWidth();
                } else {
                    pHeight = (int) Math.min(width, (double) images[pageIndex].getHeight());
                    pWidth = pHeight * images[pageIndex].getWidth() / images[pageIndex].getHeight();
                }
                graphics.drawImage(images[pageIndex], (int) x, (int) y, pWidth, pHeight, null);
                return PAGE_EXISTS;
            } else {
                return NO_SUCH_PAGE;
            }
        }
    }
    anche se come dici giustamente te sto paragonando patate e carote.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.