1

複雑なスイングアプリケーションUIを空港経由で物理プリンターに印刷しています。MacとWindowsの両方のマシンを同じプリンターで印刷しています。Macからの印刷は見栄えがします。Windowsからの印刷は、見栄えがよくありません。フォントやグラフの線など、すべてが非常にピクセル化されています。

掘り下げてみると、利用可能なPrintServicesはプラットフォームごとに異なることがわかります。

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

Macから実行すると、上記は単一要素の配列を返します。Windowsからは、空の配列を返します。これにより、Windowsは、追記データではなく、72DPIの画像をプリンターに送信していると思います。

これは、MacとWindowsのJVM実装の違いですか?Windowsでの印刷を機能させるための回避策はありますか?自分で350dpiのラスタライズされた画像を生成してプリンタに送信できることはわかっていますが、これらは数百ページに及ぶため、可能であればそのルートは避けたいと思います。

4

1 に答える 1

1

答えが得られたと思います: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();
}
于 2009-05-21T22:44:29.933 に答える