美文网首页
Java实现调用打印机(可批量打印)

Java实现调用打印机(可批量打印)

作者: taogan | 来源:发表于2022-01-12 13:08 被阅读0次
@Slf4j
public class DrivePrintService {
    // 传入文件和打印机名称
    public void print(File[] files, String printerName) throws PrintException, IOException {
        List<InputStream> streams = fileStreams(files);
        if (CollUtil.isEmpty(streams)) {
            log.warn("缺少打印文件");
            throw new NullPointerException("缺少打印文件");
        }

        DocFlavor flavor = getDocFlavor();
        PrintRequestAttributeSet aset = getPrintRequestAttribute();

        for (InputStream in : streams) {
            DocPrintJob docPrintJob = getPrintJob(printerName);
            docPrintJob.print(new SimpleDoc(in, flavor, null), aset);
        }
    }

    private List<InputStream> fileStreams(File[] files) {
        if (ArrayUtil.isEmpty(files)) {
            log.warn("缺少打印文件");
            throw new NullPointerException("缺少打印文件");
        }
        List<InputStream> ins = new ArrayList<>();
        try {
            for (File file : files) {
                ins.add(new FileInputStream(file));
            }
        } catch (FileNotFoundException e) {
            log.warn("打印文件缺失:{}", e.getMessage());
        }
        return ins;
    }

    private DocFlavor getDocFlavor() {
        // 设置打印格式,如果未确定类型,可选择autosense
        return DocFlavor.INPUT_STREAM.AUTOSENSE;
    }

    private PrintRequestAttributeSet getPrintRequestAttribute() {
        // 设置打印参数
        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        aset.add(new Copies(1)); //份数
        //aset.add(MediaSize.ISO.A4); //纸张
        // aset.add(Finishings.STAPLE);//装订
        aset.add(Sides.DUPLEX);//单双面
        return aset;
    }

    private DocPrintJob getPrintJob(String printerName) {
        if (printerName == null) {
            log.warn("请选择打印机");
            throw new NullPointerException("请选择打印机");
        }
        //获得本台电脑连接的所有打印机
        PrintService[] printServices = PrinterJob.lookupPrintServices();
        if (printServices == null || printServices.length == 0) {
            log.warn("打印失败,未找到可用打印机,请检查。");
            throw new NullPointerException("打印失败,未找到可用打印机,请检查。");
        }
        //匹配指定打印机
        PrintService printService = null;
        for (PrintService service : printServices) {
            if (printerName.equals(service.getName())) {
                printService = service;
                break;
            }
        }
        if (printService == null) {
            String format = StrUtil.format("打印失败,未找到名称为 [{}] 的打印机,请检查。", printerName);
            log.warn(format);
            throw new NullPointerException(format);
        }
        return printService.createPrintJob();
    }
}

监听打印

@Slf4j
public class MyPrintJobListener implements PrintJobListener {

        @Override
        public void printDataTransferCompleted(PrintJobEvent pje) {
            log.warn("通知客户端数据已成功传输到打印服务,客户端可以释放为该数据分配的本地资源");
        }

        @Override
        public void printJobCompleted(PrintJobEvent pje) {
            log.warn("通知客户该作业成功完成。");
        }

        @Override
        public void printJobFailed(PrintJobEvent pje) {
            log.warn("通知客户该作业未成功完成,必须重新提交。");
        }

        @Override
        public void printJobCanceled(PrintJobEvent pje) {
            log.warn("通知客户该作业被用户或程序取消。");
        }

        @Override
        public void printJobNoMoreEvents(PrintJobEvent pje) {
            log.warn("通知客户不会再发送任何事件。");
        }

        @Override
        public void printJobRequiresAttention(PrintJobEvent pje) {
            log.warn("通知客户某些可能出现用户纠正的问题(例如打印机缺纸)。");
        }

    }

相关文章

  • 【vue学习】整合Lodop

    前端实现自动打印 批量打印 vue中使用lodop调用标签打印机 利用lodop打印控件轻松实现批量打印 本文主要...

  • Java实现调用打印机(可批量打印)

    监听打印

  • 求助

    现在在做一个项目,就是用微信小程序调用打印机打印各种文件。但是这种调用打印机的APP有很多,这些APP都能调用我自...

  • JAVA批量打印报表

    不使用工具条上的打印按钮,用java怎么实现批量打印皕杰报表? 解决方案: 皕杰报表提供了批量打印的工具类Repo...

  • 使用concepts实现接口隔离原则

    本例有一个打印机类,部分打印机可打印,部分打印机可扫描,部分打印机可传真。作者本想设计一个大的接口,用来同时pri...

  • C# 修改打印机名称

    模板指定打印机名称,可以修改默认打印机名称匹配模板打印机,实现自动打印。否则需要手动配置打印机。 引用组件: us...

  • python调用打印机实现打印文档

    python调用打印机需要使用到pywin32库,使用win32api.ShellExecute可以调用默认打开指...

  • 四、实现“动态组装”打印机

    一、本课目标 实现“动态组装”的打印机 二、依赖注入综合实例 2.1如何开发一个打印机? 可灵活配置使用彩色墨盒或...

  • 调用打印机

    推荐网址:http://www.haorooms.com/post/js_print_webhttps://blo...

  • 秒到打印机助手1.0使用说明

    一.产品介绍 秒到正式版餐饮小程序商家后台现可两种打印机类型类型: 网络打印机 通过wifi或 手机信号卡 实现数...

网友评论

      本文标题:Java实现调用打印机(可批量打印)

      本文链接:https://www.haomeiwen.com/subject/qirwcrtx.html