import java.awt.Graphics;
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;

// Quelle: https://stackoverflow.com/questions/18404553/proper-way-of-printing-a-bufferedimage-in-java

public class PrintActionListener implements Runnable {

	    private BufferedImage       image;

	    public PrintActionListener(BufferedImage image) {
	        this.image = image;
	    }

	    @Override
	    public void run() {
	        PrinterJob printJob = PrinterJob.getPrinterJob();
	        printJob.setPrintable(new ImagePrintable(printJob, image));

	        if (printJob.printDialog()) {
	            try {
	                printJob.print();
	            } catch (PrinterException prt) {
	                prt.printStackTrace();
	            }
	        }
	    }

	    public class ImagePrintable implements Printable {

	        private double          x, y, width;

	        private int             orientation;

	        private BufferedImage   image;

	        public ImagePrintable(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 g, 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();
	                }
	                g.drawImage(image, (int) x, (int) y, pWidth, pHeight, null);
	                return PAGE_EXISTS;
	            } else {
	                return NO_SUCH_PAGE;
	            }
	        }

	    }

	}
