我正在尝试创建一个能够直接从UI打印文档的Java UI .

我能够创建和使用Javax ServiceUI,但是当从ServiceUI中选择“Print”并调用DocJob上的print()函数时,没有任何反应 . 我的打印机短暂响应,但同样快速擦除文档,表明打印机接收到文件,但无法读取 . 同样,尝试通过ServiceUI打印到PDF会导致出现不可读的(0KB)PDF文件 .

JButton btnPrint = new JButton("Print");
        btnPrint.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                 try {
                    FileInputStream excelFile = new FileInputStream(new File(path));
                    DocFlavor format = DocFlavor.INPUT_STREAM.AUTOSENSE;
                    PrintRequestAttributeSet set = new HashPrintRequestAttributeSet();
                    Doc myDoc = new SimpleDoc(excelFile,format,null);
                    //set.add(new Copies(1));
                    //set.add(MediaSize.NA.LETTER);
                    //set.add(Sides.ONE_SIDED);
                    PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();
                    PrintService[] services = PrintServiceLookup.lookupPrintServices(format, set);
                    System.out.println(services.length);
                    if (services.length > 0)
                    {
                        PrintService theService = ServiceUI.printDialog(null,  50, 50, services, defaultService, null, set);
                        if (theService != null)
                        {
                            try {
                                DocPrintJob job = theService.createPrintJob();
                                job.print(myDoc, set);
                            } catch (PrintException e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                            };
                        }
                    }
                    excelFile.close();

                } catch (FileNotFoundException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        });

其中 path 是要打印的选定文件(由JFileChooser选择) .

笔记:

  • 当我最终确定此代码时,我希望能够打印Excel电子表格文件(.xlsx) . 如果Javax无法打印此格式,请告知我们

  • 如果手动将任何属性添加到PrintRequestAttributeSet,则根本不会出现ServiceUI(请注意注释掉的set.add()函数)

  • 如果DocFlavor设置为INPUT_STREAM.AUTOSENSE以外的任何内容,则根本不会出现ServiceUI

  • ServiceUI正确检测默认打印机和所有可用的打印机(只要如上所述,AttributeSet为空,DocFlavor设置为AUTOSENSE,否则无法检测到任何服务)

有什么我做错了吗?