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

2022-01-12  本文已影响0人  taogan
@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("通知客户某些可能出现用户纠正的问题(例如打印机缺纸)。");
        }

    }
上一篇 下一篇

猜你喜欢

热点阅读