我正在尝试创建一个能够直接从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,否则无法检测到任何服务)
有什么我做错了吗?