| Printer |

    package ij.plugin.filter;
    import ij.*;
    import ij.gui.*;
    import ij.process.*;
    import java.awt.*;
    import java.util.Properties;
    import java.awt.print.*;

    /** This plugin implements the File/Page Setup and File/Print commands. */
    public class Printer implements PlugInFilter, Printable {
        private ImagePlus imp;
        private static double scaling = 100.0;
        private static boolean drawBorder;
        private static boolean center = true;
        private static boolean label;
        private static boolean printSelection;
        private static boolean rotate;
        private static int fontSize = 12;

        public int setup(String arg, ImagePlus imp) {
            if (!IJ.isJava2())
                {IJ.error("Print", "Printing requires Java 1.2 or later"); return DONE;}
            if (arg.equals("setup"))
                {pageSetup(); return DONE;}
            this.imp = imp;
            IJ.register(Printer.class);
            return DOES_ALL+NO_CHANGES;
        }

        public void run(ImageProcessor ip) {
            //pageSetup();
            print(imp);
        }

        void pageSetup() {
            GenericDialog gd = new GenericDialog("Page Setup");
            gd.addNumericField("Scale:", scaling, 0, 3, "%");
            gd.addCheckbox("Draw Border", drawBorder);
            gd.addCheckbox("Center on Page", center);
            gd.addCheckbox("Print Title", label);
            gd.addCheckbox("Selection Only", printSelection);
            gd.addCheckbox("Rotate 90"+IJ.degreeSymbol, rotate);
            gd.showDialog();
            if (gd.wasCanceled())
                return;
            scaling = gd.getNextNumber();
            if (scaling<5.0) scaling = 5;
            drawBorder = gd.getNextBoolean();
            center = gd.getNextBoolean();
            label = gd.getNextBoolean();
            printSelection = gd.getNextBoolean();
            rotate = gd.getNextBoolean();
        }

        void print(ImagePlus imp) {
            PrinterJob pj = PrinterJob.getPrinterJob();
            pj.setPrintable(this);
            //pj.pageDialog(pj.defaultPage());
            if (IJ.macroRunning() || pj.printDialog()) {
                imp.startTiming();
                try {pj.print(); }
                catch (PrinterException e) {
                    IJ.log(""+e);
                }
            }
        }

        public int print(Graphics g, PageFormat pf, int pageIndex) {
            if (pageIndex != 0) return NO_SUCH_PAGE;
            ImageProcessor ip = imp.getProcessor();
            Roi roi = imp.getRoi();
            if (printSelection && roi!=null && roi.isArea() )
                ip = ip.crop();
            if (rotate)
                ip = ip.rotateLeft();
            //new ImagePlus("ip", ip.duplicate()).show();
            int width = ip.getWidth();
            int height = ip.getHeight();
            int margin = 0;
            if (drawBorder) margin = 1;
            double scale = scaling/100.0;
            int dstWidth = (int)(width*scale);
            int dstHeight = (int)(height*scale);
            int pageX = (int)pf.getImageableX();
            int pageY = (int)pf.getImageableY();
            int dstX = pageX+margin;
            int dstY = pageY+margin;
            Image img = ip.createImage();
            double pageWidth = pf.getImageableWidth()-2*margin;
            double pageHeight = pf.getImageableHeight()-2*margin;       if (label && pageWidth-dstWidth<fontSize+5) {
                dstY += fontSize+5;
                pageHeight -= fontSize+5;
            }
            if (dstWidth>pageWidth || dstHeight>pageHeight) {
                // scale to fit page
                double hscale = pageWidth/dstWidth;
                double vscale = pageHeight/dstHeight;
                double scale2 = hscale<=vscale?hscale:vscale;
                dstWidth = (int)(dstWidth*scale2);
                dstHeight = (int)(dstHeight*scale2);
            } else if (center) {
                dstX += (pageWidth-dstWidth)/2;
                dstY += (pageHeight-dstHeight)/2;
            }
            g.drawImage(img,
                dstX, dstY, dstX+dstWidth, dstY+dstHeight,
                0, 0, width, height,
                null);
            if (drawBorder)
                g.drawRect(dstX-1, dstY-1, dstWidth+1, dstHeight+1);
            if (label) {
                g.setFont(new Font("SanSerif", Font.PLAIN, fontSize));
                g.setColor(Color.black);
                g.drawString(imp.getTitle(), pageX+5, pageY+fontSize);
            }
            return PAGE_EXISTS;
        }

    }

| Printer |