2009-05-21 5 views
1

Ich drucke eine komplizierte Swing-Anwendung UI über einen Flughafen auf einen physischen Drucker. Ich habe Mac & Windows-Maschinen, die beide zum gleichen Drucker drucken. Drucken vom Mac sieht gut aus. Drucken von Windows sieht alles andere als gut aus - alles ist sehr pixelig, einschließlich Schriften und Linien.Drucken von Swing auf Mac & Windows - Wo wird Postscript unterstützt?

Einige Umgrabungen zeigen, dass die verfügbaren PrintServices für die verschiedenen Plattformen unterschiedlich sind.

DocFlavor flavor = DocFlavor.INPUT_STREAM.POSTSCRIPT; 
PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet(); 
PrintServiceLookup.lookupPrintServices(flavor, attrs); 

Bei der Ausführung vom Mac gibt das obige ein Einzelelementarray zurück. Von Windows gibt es ein leeres Array zurück. Dies führt zu der Annahme, dass Windows statt Postscript-Daten ein 72 DPI-Bild an den Drucker sendet.

Ist dies ein Unterschied in den JVM-Implementierungen von Windows? Gibt es eine Problemumgehung, um Drucken unter Windows zu erhalten? Mir ist klar, dass ich mein eigenes 350 dpi gerastertes Bild erzeugen und an den Drucker senden kann, aber diese Dinge gehen in die Hunderte von Seiten. Ich würde diese Route wirklich gerne meiden.

+0

ich auf diese Frage gestolpert und ich weiß, es ist alt und du bist wahrscheinlich bewusst, aber die zweite Zeile des Codes ist nicht erforderlich, 'LookupPrintServices' lässt das zweite Argument als 'Null' erscheinen, falls Sie keine Attribute setzen müssen. –

Antwort

1

Ich glaube, ich habe eine Antwort erhalten: Die Systemeigenschaft java.awt.printerjob wurde auf sun.awt.windows.WPrinterJob gesetzt. Anscheinend ist dies eine praktische PrinterJob-Unterklasse, wenn Sie eine blockartige pixelierte Ausgabe auf Ihrem Drucker bevorzugen. Stattdessen habe ich eine Instanz von sun.print.PSPrinterJob erhalten, wenn es verfügbar ist, etwa so:

PrinterJob printerJob = null; 
try { 
    if (System.getProperty("java.awt.printerjob").equals("sun.awt.windows.WPrinterJob")) { 
     // WPrinterJob sends crappy GIF images to the printer, and everything looks all blocky 
     // try to get an instance of a PSPrinterJob instead 
     printerJob = (PrinterJob) Class.forName("sun.print.PSPrinterJob").newInstance(); 
    } 
} catch (Throwable e1) { 
    log.log(Level.SEVERE, "Could not instaniate sun.print.PSPrinterJob", e1); 
} 
if (printerJob == null) { 
     printerJob = PrinterJob.getPrinterJob(); 
} 
+0

FYI, Java 8 auf Mac scheint diesen Wert auf 'sun.lwawt.macosx.CPrinterJob' zu setzen – tresf

Verwandte Themen