做电商的都知道,每次收到订单需要打印面单的时候,通过发起一个后端请求,拿到面单地址,在前端页面进行展示,然后在点击打印操作按钮,选择打印机 点击打印,这一套流程下来,比较繁琐。因为面单压根就不需要预览,打印出来再预览再配货不是跟方便么?所以就开始往这方面思考了,甚至还可以做到自动打印,而不用手工操作,这样只要一出面单就知道有客户下单了,是不是很方便快捷,就像现在美团点外卖,饭店出单一样。基于这样,我就开始写代码。
我主要开发使用的语言是PHP,用PHP来实现这个,还是比较麻烦,然后现在也接触了Java一段时间,索性就用Java实现吧
话不多说,直接上代码
下面展示一些 内联代码片
。
@GetMapping("/printpdf")
public @ResponseBody ApiResponse printPDF(String file_name)
{
String currentPath = System.getProperty("user.dir");
String directoryPath = currentPath+"/static/"; // 目录路径
String pdf = directoryPath+file_name;
// 选择要打印的文档文件
File documentFile = new File(pdf);
// 获取默认的打印机
PrintService defaultPrinter = PrintServiceLookup.lookupDefaultPrintService();
// 创建打印任务
DocPrintJob printJob = defaultPrinter.createPrintJob();
// 打印文档
FileInputStream inputStream;
try {
// 加载PDF文件
PDDocument document = PDDocument.load(new File(pdf));
// 创建打印任务
PrinterJob job = PrinterJob.getPrinterJob();
// 设置打印内容
job.setPageable(new PDFPageable(document));
// 可选:设置打印属性,如纸张大小、打印方向等
PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
attributes.add(OrientationRequested.PORTRAIT);
// 执行打印任务
job.print(attributes);
// 关闭文档
document.close();
System.out.println("PDF文件已成功打印。");
/* inputStream = new FileInputStream(documentFile);
Doc document = new SimpleDoc(inputStream, DocFlavor.INPUT_STREAM.AUTOSENSE, null);
printJob.print(document, attributes);
System.out.println(document.getPrintData());
inputStream.close();*/
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println(e.getMessage());
} catch (IOException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}catch (Exception e){
e.printStackTrace();
System.out.println(e.getMessage());
}
ApiResponse response = new ApiResponse();
response.setCode("S000");
response.setMessage("打印成功");
response.setData(new ArrayList<>());
return response;
}
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.30</version>
</dependency>
通过get请求printpdf这个方法,就可以自动打印了,不需要预览