Java printDialog()在linux机器上部署时不工作(无弹出窗口)

Java printDialog()在linux机器上部署时不工作(无弹出窗口),java,linux,pdfbox,wicket-6,wicket-1.6,Java,Linux,Pdfbox,Wicket 6,Wicket 1.6,我使用的是ApacheWicket 6.19.0、PDFBOx1.8.8和Java8。 我面临的问题是,当我在Windows机器上部署应用程序时,屏幕上会显示打印对话框,但当部署在Linux服务器上时,从UI调用打印功能时,屏幕上不会显示打印对话框 代码: PrinterJob是AWT的一个类,即桌面功能。 您不能在服务器上使用它。 ApacheWicket是一个web框架,因此我假设您的用户将通过浏览器访问应用程序。在这种情况下,您有两种选择: 呈现一个好看的HTML,并使用JavaScrip

我使用的是ApacheWicket 6.19.0、PDFBOx1.8.8和Java8。 我面临的问题是,当我在
Windows
机器上部署应用程序时,屏幕上会显示打印对话框,但当部署在
Linux
服务器上时,从UI调用打印功能时,屏幕上不会显示打印对话框

代码:


PrinterJob是AWT的一个类,即桌面功能。 您不能在服务器上使用它。 ApacheWicket是一个web框架,因此我假设您的用户将通过浏览器访问应用程序。在这种情况下,您有两种选择:

  • 呈现一个好看的HTML,并使用JavaScript的
    window.print()
    打印它

  • 呈现PDF并将其流式传输到浏览器,以便:

    2.1。使用
    Content-Disposition:Inline
    response头显示它(如果浏览器有PDF插件)

    2.2。使用
    Content-Disposition:Attachment


  • 我不确定是否有办法用JavaScript打印PDF。

    那么,你的意思是说printDialog无法在Linux上工作?能用Windows吗?不,我是说它能用在本地主机上,但不能用在服务器上。在localhost上,您有一个桌面UI(Linux中称为“X”),而在服务器上通常没有。即使PrinterJob在服务器上工作(运行X并正确导出$DISPLAY env),它也会在服务器上显示对话框,而不是在用户的机器上。
    public static PrintService choosePrinter() {
        PrinterJob printJob = PrinterJob.getPrinterJob();
        if(printJob.printDialog()) {
            return printJob.getPrintService();          
        }else {
            return null;
        }
    }
    
    @Override
    public File getObject() {
        File file = new File("document.pdf");
        file.deleteOnExit();
        PDDocument document = new PDDocument();
        //prepare the pdf here...
        PrinterJob job = PrinterJob.getPrinterJob();
        PrintService service = choosePrinter();
        if(service != null){
            job.setPrintService(service);
            document.silentPrint(job);
        }
        document.close();
        } catch (Exception e) {
            LOGGER.error("Exception: "+e);
        }
        return file;
    }