< 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

实现思路: 用Java调用本地打印机实现功能,将java程序打包成exe可执行文件,在本地注册表中新增URL协议,最后web端通过该协议实现启动本地exe程序进行打印 实现过程: 1、下载32位TSCActiveX.dll,并注册到windows环境中,指令为Regsvr32.exe TSCActiveX.dll 下载地址:https://download.csdn.net/download...
electron打印大概有两种: 第一种:通过window的webcontent对象,使用此种方式需要单独开出一个打印的窗口,可以将该窗口隐藏,但是通信调用相对复杂。 第二种:使用页面的webview元素调用打印,可以将webview隐藏在调用的页面中,通信方式比较简单。 两个对象调用打印方法的使用方式都一样。 本文是通过第二种方法实现静默打印。 作者:Danile_1226 链接:https://www.jianshu.com/p/cc0751955826 来源:简书 著作权归作者所有。商业转载请联系作
前言功能说到前面开始使用合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 你好! 如果你是一名纯前端,那么阅读完这篇文章即可以解决无感打印的问题! 目前可以实现功能有 前端无任何弹窗直接调用打印机执行打印 打印pdf流、打印在线文件
import javax.imageio.ImageIO; import javax.print.*; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.PrintRequestAttributeSet; public static List<String> findPrints() { List<String> list = new ArrayList<>(); HashPrintRequestAttributeSet requestAttributeSet = new HashPrintRequestAttributeSet(); DocFlavor flavor = D. 3.包装元素 <!-- 需要给外层包裹元素ref,在点击打印阶段需要使用ref获取打印元素,需要指定id用于捆绑触发打印的按钮 --> <div ref="printTest" id="printTest"> 需要打印的数据 4.创建打印按钮 <!-- v-print指令可以直接绑定到对应的打印区域--> <el-button v-pr 1,安装 npm install vue-print-nb --save 2,引入 安装好以后在main.js文件中引入 import Print from 'vue-print-nb' Vue.use(Print); //注册 3,现在就可以使用了 <div id="printTest" >       <p>锄禾日当午</p>       <p>汗滴禾下土 </p>       <p>谁知盘中 1. 在前端使用Vue框架,通过HTML和Vue组件实现打印页面的布局和样式。 2. 使用JavaScript的window.print()方法,将打印页面打印打印机上。 3. 在后端使用Spring Boot框架,实现打印功能的数据处理和打印服务的调用。 4. 通过RESTful API将前端传递的打印数据传递给后端处理,后端将数据格式化并传递给打印服务进行打印。 需要注意的是,在打印功能实现过程中,需要考虑浏览器和打印机的兼容性,并进行适当的处理。同时,也需要考虑数据的安全性和防止恶意攻击。