java实现打印的功能

一、java后台获取打印机

  • 首先需要引入依赖
<dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.25</version>
</dependency>
实现打印的核心关键是awt中的PrinterJob.lookupPrintServices()方法。

当时的需求是用打印机打印pdf文件,所有在方法中传入了三个参数(name 打印机的名字,path pdf文件的路径,pages 打印的页数)

下面是将方法封装成为一个工具类,方便在使用时直接调用。
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.printing.PDFPageable;
import org.apache.pdfbox.printing.PDFPrintable;
import org.apache.pdfbox.printing.Scaling;

import javax.print.PrintService;
import java.awt.print.*;
import java.io.File;
import java.io.IOException;

public class PrintUtil {

    public static void Print(String name ,String path,Integer pages) throws IOException, PrinterException {
        // 使用打印机的名称
        // String printName = "HP LaserJet Pro M201-M202 PCL 6";
        String printName = name;
        String pdfPath = path;
        File file = new File(pdfPath);
        // 读取pdf文件
        PDDocument document = PDDocument.load(file);
        // 创建打印任务
        PrinterJob job = PrinterJob.getPrinterJob();
        // 遍历所有打印机的名称
        for (PrintService ps : PrinterJob.lookupPrintServices()) {
            String psName = ps.toString();
            // 选用指定打印机
            if (psName.equals(printName)) {
                //isChoose = true;
                job.setPrintService(ps);
                break;
            }
        }

        job.setPageable(new PDFPageable(document));

        Paper paper = new Paper();
        // 设置打印纸张大小
        paper.setSize(598, 842); // 1/72 inch
        // 设置打印位置 坐标
        paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight()); // no margins
        // custom page format
        PageFormat pageFormat = new PageFormat();
        pageFormat.setPaper(paper);
        // override the page format
        Book book = new Book();
        // append all pages 设置一些属性 是否缩放 打印张数等
        book.append(new PDFPrintable(document, Scaling.ACTUAL_SIZE), pageFormat, pages);
        job.setPageable(book);
        // 开始打印
        job.print();
    }


}

二、在前端实现打印机的获取,并以下拉框的形式显示

效果如下图:
在这里插入图片描述

PrintServiceLookup.lookupPrintServices()也同样可以获取到打印机。这里实现的是获取电脑上的打印机,并将其显示在前端的页面。
首先是后台的实现
  • controller的实现
 //获取打印机
    @GetMapping("/getPrint")
    public AjaxResult getPrint(){
        return AjaxResult.success(dataLabelService.getPrint());
    }
  • service层的方法
List<String> getPrint();
  • impl的方法
public List<String> getPrint() {
        List<String> listPrints = new ArrayList<>();
        //构建打印请求属性集
        PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
        //设置打印格式,autosense 自动类型
        DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
        for (PrintService ps : PrintServiceLookup.lookupPrintServices(flavor,pras)) {
            String psName = ps.toString();
            listPrints.add(psName);
        }
        return listPrints;
    }
vue前端的实现
可以看到后台的接口返回的是一个list的结果,因此在前端同样要用list来接收。
//定义参数,获取本地打印机
 printNameList:[],
    //得到打印机的名字
    getPrint() {
      getPrint().then((response) => {
      //console.log(response);
        this.printNameList = response.data;
        
      });
    },
上面的实现适合在本地开发时,获取打印机并打印。当将项目部署在服务器时,如果服务器上没有安装打印机,会发现获取不到打印机。
因此可以通过前端来直接获取打印机。见另一篇文章。

vue结合Lodop前端实现打印机的获取及打印
https://editor.csdn.net/md?not_checkout=1&articleId=122932554

Logo

前往低代码交流专区

更多推荐