How do I print a large PNG on an A4 sheet?

I want to print an image on A4 that I get programmatically. Here is the method for getting the image:

    public BufferedImage getScreenComponent(Component component) {
    BufferedImage image = new BufferedImage(
            component.getWidth(),
            component.getHeight(),
            BufferedImage.TYPE_INT_RGB
    );
    component.paint( image.getGraphics() );
    return image;
}

Here is the object Printable:

 Printable printable = new Printable() {
   @Override
   public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {

       if (pageIndex > 0) {
           return Printable.NO_SUCH_PAGE;
       } else {
           int pageWidth = (int) pageFormat.getWidth();
           JTextPane pane = scrollPaneList.get(tabs.getSelectedIndex()).getTextPane();
                       try {
                Thread.sleep(1000);
                Graphics2D graphics2D = (Graphics2D)graphics;
                Robot robot = new Robot();
                Rectangle rectangle = new Rectangle(pane.getX(),pane.getY(),pane.getWidth(),pane.getHeight());
                BufferedImage screen =  mainWindow.getScreenComponent(pane);
                ImageIO.write(screen, "png", new File("screen.png"));
                BufferedImage img = ImageIO.read(new File("D:\\TextEditor\\screen.png"));
                graphics2D.drawImage(img, 0,0, img.getWidth(), img.getHeight(), null);


                }
            catch (AWTException ex){}
            catch (IOException ex){}
            catch (Exception ex){
                System.err.println(ex.getMessage());
            }



           }
           return Printable.PAGE_EXISTS;
       }
     };

Here is the handler for the print button click event:

    if (e.getSource()==printButton) {
    JTextPane pane = scrollPaneList.get(tabs.getSelectedIndex()).getTextPane();
    try {

        PrinterJob printJob = PrinterJob.getPrinterJob();
        PageFormat pf = printJob.pageDialog(printJob.defaultPage());
        if (printJob.printDialog()==false) return;
        printJob.setPrintable(printable, pf);
        printJob.print();
        Thread.sleep(1000);

In the Printable.print(Graphics graphics, PageFormat pageFormat, int pageIndex) method, I formed an image of a text field with text. Here it is:

enter a description of the image here

And in the same method, I try to print it out. The printer works, runs the sheet, but does not print anything. What could be the problem? I I don't know what to think, tell me. P.S. The size of the image comes out 1426Х756 пикс

Author: Konstantin_SH, 2019-12-14

1 answers

I found a way. Used PrintServices created a new PrintJob right inside the Printable.print(){[5 method]}

   Printable printableImgs = new Printable() {
   @Override
   public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {

       if (pageIndex > 0) {
           return Printable.NO_SUCH_PAGE;
       } else {
           int pageWidth = (int) pageFormat.getWidth();
           JTextPane pane = scrollPaneList.get(tabs.getSelectedIndex()).getTextPane();


            try {
                Thread.sleep(1000);
                Graphics2D graphics2D = (Graphics2D)graphics;
                BufferedImage screen =  mainWindow.getScreenComponent(pane);
                ImageIO.write(screen, "png", new File("screen.png"));
                // после получения скрина готовим данные к печати
                DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;
                PrintService services[] = PrintServiceLookup.lookupPrintServices(flavor, null);
                InputStream inputStream = new FileInputStream("screen.png");
                Doc doc = new SimpleDoc(inputStream, flavor, null);
                if(services.length>0){
                    DocPrintJob job = services[0].createPrintJob();
                    job.print(doc, null);
                }

                }
            catch (Exception ex){
                System.err.println(ex.getMessage());
            }
           }
           return Printable.PAGE_EXISTS;
       }

     };
 0
Author: Konstantin_SH, 2019-12-15 11:54:52