Druckdialoge in jadice / Verändern von Druckereinstellungen

Varianten

Grundsätzlich bietet die jadice document platform zwei verschiedene Druckdialoge an:

  • einen eigenen "jadice Druckdialog"
  • und einen nativen Druckdialog

Vor- und Nachteile sowie Einschränkungen werden nachfolgend erläutert.

Der jadice Druckdialog 

jadice stellt einen eigenem Druckdialog zur Verfügung. Dieser Druckdialog bietet Anwendern viele Vorteile:

  • Druckvorschau
  • Druckerauswahl
  • Verschiedene Druckeinstellungen, wie z.B. Anzahl Kopien, Seitenformat uvm.
  • Eine Auswahl, welche Seitenelemente gedruckt werden sollen, z.B. Dokument, Annotations oder beides

Nachfolgend eine Ansicht des jadice Druckdialogs.

Der jadice Druckdialog

Die technische Basis des jadice Druckdialogs beruht auf der Java Print Service API. Die Java Print Service API ist Teil der Java Virtual Machine und bietet eine betriebssystemübergreifende High-Level API, um PrintServices zu ermitteln, Druckjobs mit allgemeinen Einstellungen zu konfigurieren und anzustarten. Allgemeine Einstellungen sind Einstellungen, die weder spezifisch für das ausführende Betriebssystem noch für die installierten Druckertreiber sind. 

Druckertreiber-spezifische Einstellungsdialoge

Manche Einstellungen sind spezifisch für bestimmte Druckertreiber. Zur Änderung von Einstellungen, die ein Druckertreiber anbietet, bringen Druckertreiber oft einen eigenen Einstellungsdialog mit.

Nachfolgend ein Beispiel des Einstellungsdialogs eines Lexmark Druckers.

Die Java Virtual Machine bietet keinen Pure Java Zugriff auf spezifische Druckertreiber-Dialoge, insbesondere erlaubt sie nicht, Druckertreiber-Dialoge per Java API zu öffnen oder darin enthaltene Einstellungen programmatisch vorzunehmen. 

Der native Betriebssystem-Druckdialog

Die Java Virtual Machine stellt einen eigenen Betriebssystem Druckdialog zur Verfügung. Einzig dieser Dialog bietet dem Anwender die Möglichkeit, über "Eigenschaften" spezielle Druckertreiber-Dialoge zu öffnen. Leider ist dieser Dialog weit in den Tiefen der JVM-Innereien versteckt und bietet keinerlei programmatischen Zugriff - weder auf den Dialog selbst noch auf die Funktion, die hinter dem "Eigenschaften" Knopf versteckt ist. 

Nachfolgend eine Ansicht des Windows Betriebssystem-Dialogs.

Der native Betriebssystem Druckdialog

Für spezielle Druckereinstellungen, die im Druckertreiber eigenen Dialog gesetzt werden müssen, bietet die Java Virtual Machine nur einen technischen Weg: Die Verwendung des nativen Druckdialogs. Leider ist dieser Dialog weder steuerbar noch anpassbar und auch funktionale Elemente des Dialogs wie der "Eigenschaften" Knopf können aus Java heraus nicht verwendet werden.

Die Verwendung des nativen Druckdialogs

Das folgende Code Snippet skizziert, wie der native Druckdialog in jadice genutzt werden kann. 

Nativer Druckdialog Command
/**
 * Druck Demo Command mit Nutzung des nativen Betriebssystem Druckdialogs. <p>
 * Es öffnet den nativen Druckdialog und löst bei Bestätigung einen Druckprozess aus. 
 */
public class PrintWithNativePrintDialog extends DirectPrintDocumentCommand {
  private static final Logger log = LoggerFactory.getLogger(PrintDocumentCommand.class);
  @Override
  protected void execute() {
    final PrintJobConfiguration pjc = PrintJobConfiguration.create();
    final EventList<Page> docPageList = getPageView().getDocument().getPages();
    try {
      addPagesToPrint(pjc, docPageList);
      prepare(pjc);
      pjc.setShowPrintDialog(false);
      Printer printer = new Printer(pjc);
      PrinterJob printerJob = printer.getPrinterJob();
      printerJob.setJobName(pjc.getPrintTitle());
      printerJob.setPageable(new Pageable() {
        public PageFormat getPageFormat(int pageIndex) throws IndexOutOfBoundsException {
           return pjc.getPageFormat();
        }
        public int getNumberOfPages() {
          return pjc.getNumbersOfPages();
        }
        public Printable getPrintable(int pageIndex) throws IndexOutOfBoundsException {
          return null;
        }
      });
            
      PrintRequestAttributeSet requestAttributeSet = printer.getPrintRequestAttributeSet();
      if (requestAttributeSet == null) {
        requestAttributeSet = new HashPrintRequestAttributeSet();
        printer.setPrintRequestAttributeSet(requestAttributeSet);
      }
      // Nativen Druckdialog anfordern
      try {
        // JRE 1.7+
        requestAttributeSet.add(javax.print.attribute.standard.DialogTypeSelection.NATIVE);
      
        // JRE 1.6
//        requestAttributeSet.add(sun.print.DialogTypeSelection.NATIVE);
      } catch (final Exception e) {
        log.error("\"DialogTypeSelection.NATIVE\" konnte nicht ausgewählt werden.); ");
      }
      if (printerJob.printDialog(requestAttributeSet)) {
        log.info("Executing print job");
        PrintManager.executePrintJob(printer);
      }
    } catch (final JadiceException e) {
      log.fatal("Could not print", e);
    }
  }
}