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
Im folgenden ist eine Ansicht des jadice Druckdialogs.
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.
Spezifische Druckertreiber Einstellungsdialoge
Manche Einstellungen sind spezifisch für bestimmte Druckertreiber. Zur Änderung von Einstellungen, die ein Druckertreiber anbietet, bringen Druckertreiber oft einen eigenen Einstellungsdialog mit.
Hier ist als Beispiel ein Einstellungsdialog 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 selber noch auf die Funktion, die hinter dem "Eigenschaften" Knopf versteckt ist.
Im folgende ist eine Ansicht des Windows Betriebssystem Dialogs.
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 Druckdialog. 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.
/** * 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); } } }