import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.Media;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.OrientationRequested;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
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;
import java.io.IOException;

public class ImageCutOff {

    private static final int DPI = 72;
    private static final int WIDTH = 4;
    private static final int HEIGHT = 2;

    public static void main(String[] args) throws PrinterException, IOException {
        new ImageCutOff().print();
    }

    public void print() throws PrinterException, IOException {
        PrintService ps = PrintServiceLookup.lookupDefaultPrintService();
        PrinterJob job = PrinterJob.getPrinterJob();
        job.setPrintService(ps);
        job.setJobName("test");
        job.setPrintable(new ImagePrintable());
        HashPrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
        Media[] medias = (Media[]) ps.getSupportedAttributeValues(Media.class, null, null);
        Media media = null;
        for (Media m : medias) {
            if (m instanceof MediaSizeName) {
                if (m.toString().equals("4.00x2.00\"")) {
                    media = m;
                    break;
                }
            }
        }
        if (media == null) {
            throw new RuntimeException("The paper 4.00x2.00\" not found.");
        }

        attrs.add(media);

        attrs.add(OrientationRequested.LANDSCAPE);
        job.print(attrs);

        attrs.add(OrientationRequested.PORTRAIT);
        job.print(attrs);
    }

    private static BufferedImage makeImg(int orientation) throws IOException {

        final int width = (orientation == PageFormat.PORTRAIT ? WIDTH : HEIGHT) * DPI;
        final int height = (orientation == PageFormat.LANDSCAPE ? HEIGHT : WIDTH) * DPI;

        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
        Graphics2D g = (Graphics2D) image.getGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, width, height);
        g.setColor(Color.BLACK);
        g.setStroke(new BasicStroke(5));
        g.drawRect(0, 0, width, height);
        g.drawLine(0,0,width, height);
        g.drawLine(0, height, width, 0);
        g.drawLine(0, height / 2, width, height / 2);
        return image;
    }

    private static class ImagePrintable implements Printable {

        @Override
        public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
            if (pageIndex == 0) {
                BufferedImage image = null;
                try {
                    image = makeImg(pageFormat.getOrientation());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                g.drawImage(image, 0, 0,
                        (int)pageFormat.getWidth(),
                        (int)pageFormat.getHeight(), null);
                return PAGE_EXISTS;
            } else {
                return NO_SUCH_PAGE;
            }
        }
    }
}
