Печать с Swing на Mac и Windows - Где поддержка postscript? - PullRequest
1 голос
/ 22 мая 2009

Я распечатываю сложный пользовательский интерфейс приложения Swing на физическом принтере через аэропорт. У меня есть машины Mac и Windows, которые печатают на одном принтере. Печать с Mac выглядит великолепно. Печать из окон выглядит далеко не великолепно - все очень пикселировано, включая шрифты и линии графика.

Некоторые копания показывают, что доступные PrintServices для разных платформ разные.

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

При выполнении из Mac, приведенный выше возвращает массив из одного элемента. Из окон возвращает пустой массив. Это заставляет меня поверить, что Windows отправляет изображение с разрешением 72 DPI вместо данных PostScript.

Это разница в реализациях Mac & Windows JVM? Есть ли обходной путь, чтобы заставить печать работать в Windows? Я понимаю, что могу сгенерировать собственное растровое изображение с разрешением 350 точек на дюйм и отправить его на принтер, но эти вещи уходят на сотни страниц, и я действительно хотел бы избежать этого пути, если это возможно.

1 Ответ

1 голос
/ 22 мая 2009

Думаю, я получил ответ: системное свойство java.awt.printerjob было установлено на sun.awt.windows.WPrinterJob. Очевидно, это удобный подкласс PrinterJob, если вам нравится блочный пиксельный вывод на вашем принтере. Вместо этого я получаю экземпляр sun.print.PSPrinterJob, если он доступен, например:

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();
}
...