代码之家  ›  专栏  ›  技术社区  ›  Sam Barnum

在Mac和Windows上从Swing打印-PostScript支持在哪里?

  •  1
  • Sam Barnum  · 技术社区  · 15 年前

    我正在通过机场将一个复杂的Swing应用程序UI打印到物理打印机上。我的Mac&Windows机器都在同一台打印机上打印。从Mac打印看起来不错。从Windows打印看起来不太好-所有东西都非常像素化,包括字体和图形线。

    一些深入研究表明,对于不同的平台,可用的打印服务是不同的。

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

    当从mac执行时,上面的返回单个元素数组。从Windows返回空数组。这使我相信Windows正在向打印机发送一个72 dpi图像,而不是PostScript数据。

    这是Mac&Windows JVM实现中的区别吗?在Windows上打印是否有解决方案?我意识到我可以生成自己的350dpi光栅化图像并将其发送到打印机,但这些东西会进入数百页,如果可能的话,我真的想避免这种路径。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Sam Barnum    15 年前

    我想我得到了答案 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();
    }