Windows打印
可以使用jdk中带有的java.awt.print包。
Windows打印暂不支持通过java代码添加打印机到系统中(当然,可能WindowsApi中有,这方面暂时没有去查资料)。
Windows打印机用户界面,cmd中输入rundll32 printui.dll,PrintUIEntry,即可看到Windows打印机常用的命令,有一个命令是使用 INF 添加打印机驱动程序:
rundll32 printui.dll,PrintUIEntry /ia /c\\machine /m "Brother DCP-128C" /h "x86" /v "Type 3 - User Mode" /f c:\infpath\infFile.inf
这个命令会跳转到Windows安装驱动界面,无法直接安装驱动,还是需要用户继续操作安装。
常用方法:
-
获取打印机列表:
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
-
获取默认打印机:
PrintService printer = PrintServiceLookup.lookupDefaultPrintService();
如果想获取指定名称打印机,需要获取到所有的打印机列表,写一个for循环。建议写成一个独立的方法,打印机列表可以写为一个静态变量,第一次初始化时赋值,之后通过getter,setter方法改变这个变量。
-
创建打印任务
DocPrintJob job = printer.createPrintJob();
或
PrinterJob job = PrintJob.getPrintJob();
job.setPrintService(Printer);
这两个方法均可以创建打印任务。需要注意的是,产生的job并不是同一个类,DocPrintJob执行打印的时候调用print(doc, printRequestAttributeSet);需要两个参数,第一个参数为数据,第二个为打印请求属性;第二种job在执行print()之前,需要将纸张大小、属性、打印数据放入到job中,直接执行print()方法即可,不需要参数。
第二种方法代码示例(此处例子为打印pdf):
三方包用到的jar为apache的pdfbox
InputStream in = new FileInputStream(filePath);
PDDocument document = PDDocument.load(in);
List<PDDocument> list = splitter.split(document);
PDDocument printDoc = new PDDocument();
for (PDDocument pd : list) {
printDoc.addPage(pd.getPage(0));
}
PDFPrintable pdfPrintable = new PDFPrintable(printDoc, Scaling.ACTUAL_SIZE);
// pageFormat可以用来设置纸张为横向还是竖向,size可以控制打印份数(PORTRAIT:纵向,LANDSCAPE:横向)
book.append(pdfPrintable, pageFormat, size);
job.setPageable(book);
job.print();
printDoc.close();
in.close();
-
执行打印
job.print() || job.print(doc,printRequestAttributeSet)
-
监听器
DocPrintJob支持添加打印监听器,通过使用addPrintJobListener即可。job.addPrintJobListener( new PrintJobListener() { public void cancel(PrintJobEvent pje) { logger.info(“cancel” + pje.getPrintEventType()); } });