0

I want to detect if the printer printed the document (or image it doesn't matter) successfully or there was a paper jam or some kind of an error. The code I've written using JavaFX only sends the job to the printer and that's all. Is it not possible to retrieve printer status or am I missing something?

Here's the code:

public static class Printable implements Runnable
{
    @Override
    public void run()
    {
        try (InputStream is = App.class.getResourceAsStream("/pdf-sample.pdf"))
        {
            PDDocument pdf = PDDocument.load(is);
            PDFRenderer pdfRenderer = new PDFRenderer(pdf);

            Printer printer = null;

            ObservableSet<Printer> allPrinters = Printer.getAllPrinters();
            for (Printer p : allPrinters)
            {
                System.out.println(p.getName());

                if (p.getName().equalsIgnoreCase("Xerox WorkCentre 3210/3220 Class Driver"))
                {
                    printer = p;
                }
            }

            PageLayout pageLayout = printer.createPageLayout(Paper.A4, PageOrientation.PORTRAIT, Printer.MarginType.DEFAULT);

            PrinterJob job = PrinterJob.createPrinterJob(printer);

            System.out.println("Chose: " + job.getPrinter().getName());

            if (job != null)
            {
                boolean success = true;
                for (int pageNumber = 0; pageNumber < pdf.getNumberOfPages(); ++pageNumber)
                {
                    // suffix in filename will be used as the file format
                    // ImageIOUtil.writeImage(bim, pdfFilename + "-" + (page+1) + ".png", 300);

                    PDPage page = pdf.getPage(pageNumber);
                    PDRectangle bounds = page.getBBox();
                    int width = (int) bounds.getWidth();
                    int height = (int) bounds.getHeight();
                    System.out.println(width + ", " + height);
                    BufferedImage bim = pdfRenderer.renderImageWithDPI(pageNumber, 600, ImageType.RGB);

                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    if (ImageIOUtil.writeImage(bim, "png", baos))
                    {
                        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
                        BufferedImage bufferedImage = ImageIO.read(bais);

                        BufferedImage bImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                        bImg.createGraphics().drawImage(bufferedImage, 0, 0, null);
                        javafx.scene.image.Image fxImg = SwingFXUtils.toFXImage(bImg, null);
                        ImageView imageView = new ImageView(fxImg);
                        success = success & job.printPage(imageView);

                        // if (success)
                        // {
                        // job.endJob();
                        // }

                        while (job.getJobStatus().equals(JobStatus.PRINTING))
                        {
                            Thread.sleep(500);
                            System.out.println("Printing...");
                        }
                        Thread.sleep(1000);
                        System.out.println(job.getJobStatus());
                    }
                }

                if (success)
                {
                    job.endJob();
                }
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
user218046
  • 623
  • 6
  • 20
  • Maybe https://stackoverflow.com/questions/16035739/how-to-access-the-status-of-the-printer –  Aug 03 '17 at 05:37
  • I've googled and also seen that post but it doesn't work and the one that works only gives back job state before spooling it to printing job. – user218046 Aug 03 '17 at 05:46

0 Answers0