因项目需求,需要打印类似超市的收银小票。
贴上代码,以供记录和参考。
一:获取电脑本地所有的打印服务。
@RequestMapping("/getPrint")
@ResponseBody
public Object getPrint(){
PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
DocFlavor flavor = DocFlavor.BYTE_ARRAY.PNG;
PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor,printRequestAttributeSet );
//获取打印机列表
List<String> printList = new ArrayList<>();
for (int i = 0;i<printService.length;i++){
printList.add(printService[i].getName());
}
return new ReportResponse(printList);
}
返回结果:
{
"header": {
"code": "200",
"memo": "success"
},
"result": [
"Microsoft XPS Document Writer",
"GP-U80250 Series",
"Fax"
]
}
二:打印小票。
1:配置打印机
public class Printer {
private SalesTicket salesTicket;
public Printer(SalesTicket salesTicket) {
this.salesTicket = salesTicket;
}
public void printer(String printerName) {
//Book 类提供文档的表示形式,该文档的页面可以使用不同的页面格式和页面 painter
//要打印的文档
Book book = new Book();
//PageFormat类描述要打印的页面大小和方向
//初始化一个页面打印对象
PageFormat pf = new PageFormat();
//设置页面打印方向,从上往下,从左往右
pf.setOrientation(PageFormat.PORTRAIT);
//设置打印纸页面信息。通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。
Paper paper = new Paper();
MediaSize mediaSize = new MediaSize(80, 3276, MediaPrintableArea.MM);
//paper.setSize(200,30000);// 纸张大小
//paper.setImageableArea(0,0,200,30000);// A4(595 X 842)设置打印区域,其实0,0应该是72,72,因为A4纸的默认X,Y边距是72
paper.setSize((double) mediaSize.getX(25400) * 72.0D, (double) mediaSize.getY(25400) * 72.0D);
paper.setImageableArea(0.0D, 0.0D, paper.getWidth(), paper.getHeight());
pf.setPaper(paper);
book.append(salesTicket, pf);
HashAttributeSet hs = new HashAttributeSet();
hs.add(new PrinterName(printerName, null));
PrintService[] pss = PrintServiceLookup.lookupPrintServices(null, hs);
if (pss.length == 0) {
throw new ServiceException(ErrorCodes.PRINTER_NOTHAVE);
}
//获取打印服务对象
PrinterJob job = PrinterJob.getPrinterJob();
//设置打印类
job.setPageable(book);
try {
// 添加指定的打印机
job.setPrintService(pss[0]);
// 打印执行
job.print();
} catch (PrinterException e) {
throw new ServiceException(ErrorCodes.PRINTER_ERROR);
}
}
}
2:配置小票格式以及数据
public class SalesTicket implements Printable {
private List<Good