Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8155596

PrinterJob.print() changes the operating system's default printer under Win10

XMLWordPrintable

    • x86
    • other

      FULL PRODUCT VERSION :
      java version "1.8.0_92"
      Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
      Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Microsoft Windows [Version 10.0.10586]

      A DESCRIPTION OF THE PROBLEM :
      The operating system's default printer is changed to the printer used in the last PrinterJob.print().

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Compile and run the code below.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      No operating system setting should be altered by a java job if not explicitly requested.

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      import java.awt.*;
      import java.awt.print.*;
      import javax.print.*;

      public class ResetToDefaultPrinter implements Printable {
        boolean reset;
        String preferredPrinter = "EPSON"; // Set to any but the default printer.
        PrintService defaultPrinter;

        public ResetToDefaultPrinter() {
          defaultPrinter = PrintServiceLookup.lookupDefaultPrintService(); // Save
          System.out.printf("%s%n %s%n%n", "The system's default printer is:",
      defaultPrinter.getName());
          PrintService[] service = PrinterJob.lookupPrintServices(); // all printers
          int i;
          for (i=0; i<service.length; i++) {
            if (service[i].getName().contains(preferredPrinter)) break;
          }
          if (i>service.length) {
            System.out.println("Desired printer not found.");
            System.exit(0);
          }
          PrinterJob job = PrinterJob.getPrinterJob();
          job.setPrintable(this);
          try {
            job.setPrintService(service[i]);
            job.print();
          }
          catch (PrinterException ex) {
            System.out.println(ex);
          }
          System.out.printf("%s%n %s%n%n",
      "After printing the default printer is now:",
      PrintServiceLookup.lookupDefaultPrintService().getName());
          resetToDefault(job, defaultPrinter);
          System.out.printf("%s%n %s%n%n", "The default printer has been reset to:",
      PrintServiceLookup.lookupDefaultPrintService().getName());
        }


        public static void main(String args[]) {
          new ResetToDefaultPrinter();
        }


        public int print(Graphics g, PageFormat pageFormat, int pageIndex)
      throws PrinterException {
          if (pageIndex>0 || reset) return NO_SUCH_PAGE;
          Graphics2D g2D= (Graphics2D)g;
          g2D.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
          g2D.drawString("Just one line.", 50, 100);
          return PAGE_EXISTS;
        }


        public void resetToDefault(PrinterJob job, PrintService defaultPrinter) {
          if (job==null) job = PrinterJob.getPrinterJob();
          job.setPrintable(this);
          reset= true;
          try {
            job.setPrintService(defaultPrinter);
            job.print();
          }
          catch (PrinterException ex) {
            System.out.println(ex);
          }
          reset= false;
        }

      }
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      See the method resetToDefault(...) in the above code.

            psadhukhan Prasanta Sadhukhan
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: