import java.awt.*; 
import java.awt.print.*; 
import java.io.*; 
import javax.print.*; 
import java.awt.font.*; 
import java.awt.geom.Rectangle2D; 
import javax.print.attribute.*; 
import javax.print.attribute.standard.*; 


class BugPaper 
        implements Printable 
{ 
        Font __font; 
        String _str = "0123456789"; 
        int _lastPage; 

        public BugPaper(Font font, FileOutputStream fos, OrientationRequested or) { 
                __font = font; 
                _lastPage = -1; 

                StreamPrintServiceFactory[] factories; 
                DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE; 
                String psMimeType = DocFlavor.BYTE_ARRAY.POSTSCRIPT.getMimeType(); 

                factories = StreamPrintServiceFactory.lookupStreamPrintServiceFactories( 
                                        flavor, psMimeType); 
                if (factories.length == 0) { 
                        System.err.println("No suitable factories"); 
                        System.exit(0); 
                } 

                try { 
                        StreamPrintService sps = factories[0].getPrintService(fos); 
                        DocPrintJob pj = sps.createPrintJob(); 

                        DocAttributeSet dset = new HashDocAttributeSet(); 
                        dset.add(or); 
                        Doc doc = new SimpleDoc(this, flavor, dset); 

                        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); 
                        aset.add(or); 
                        pj.print(doc, aset); 
                } catch (PrintException pe) { 
                        System.err.println(pe); 
                } 
        } 

        public int print(Graphics g, PageFormat pf, int pageIndex) { 
                if (pageIndex > 0) { 
                        return Printable.NO_SUCH_PAGE; 
                } 
                if (_lastPage == pageIndex) { 
                        return Printable.PAGE_EXISTS; 
                } 
                _lastPage = pageIndex; 
                Graphics2D g2d = (Graphics2D)g; 
                double w0 = pf.getImageableWidth(); 
                double h0 = pf.getImageableHeight(); 
                g2d.setFont(__font); 
                g2d.setColor(Color.black); 
                String orient; 
                if (w0 > h0) { 
                        orient = "Landscape"; 
                } else { 
                        orient = "Portrait"; 
                } 

                FontRenderContext frc = g2d.getFontRenderContext(); 
                Rectangle2D r2d = g2d.getFont().getStringBounds(_str, frc); 
                System.err.format("%9s \"%s\" Width: %f\n", orient, _str, r2d.getWidth()); 
                return Printable.PAGE_EXISTS; 
        } 
} 

public class Bugtest { 
        public static void main(String[] args) { 
                FileOutputStream fos = null; 
                try { 
                        fos = new FileOutputStream("out.ps"); 
                } catch (Exception ee) { 
                        ee.printStackTrace(); 
                        System.exit(1); 
                } 
                Font font = new Font("Monospaced", Font.PLAIN, 12); 


                BugPaper ppr = new BugPaper(font, fos, OrientationRequested.PORTRAIT); 
                ppr = new BugPaper(font, fos, OrientationRequested.LANDSCAPE); 
                try { 
                        fos.close(); 
                } catch (Exception ee) {} 
        } 
} 
