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
Im folgenden ist eine Nachfolgend 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.
...
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.
Hier ist als Beispiel ein Einstellungsdialog 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 , 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 selbst noch auf die Funktion, die hinter dem "Eigenschaften" Knopf versteckt ist.
Im folgende ist eine Nachfolgend 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 DruckdialogDruckdialogs. 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.
Codeblock | ||||||
---|---|---|---|---|---|---|
| ||||||
/** * 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); } } } |