java 调用打印机

java 调用打印机,第1张

java 调用打印

        在网上找了不少通过jdk的printService服务打印pdf的博客,都大同小异,打印调用了但是没有真的打印,最后终于找到一个可用的,这里记录一下。

首先通过maven引入依赖:

        
            org.apache.pdfbox
            pdfbox
            2.0.6
        

最后使用工具类:

package com.ruoyi.mrs.utils;

import com.itextpdf.text.document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import com.ruoyi.common.exception.BusinessException;
import com.ruoyi.common.utils.StringUtils;
import org.apache.commons.io.IOUtils;
import org.apache.pdfbox.pdmodel.PDdocument;
import org.apache.pdfbox.printing.PDFPrintable;
import org.apache.pdfbox.printing.Scaling;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.Sides;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterJob;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;


public class PrintUtil {
    private static final Logger log = LoggerFactory.getLogger(PrintUtil.class);

    
    public static PrintService lookupPrinter(String printerName) {
        PrintService service = null;
        PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
        if (printServices == null || printServices.length == 0) {
            throw new BusinessException("未获取到打印服务");
        }
        List printerNames = Arrays.stream(printServices).map(p -> p.getName()).collect(Collectors.toList());
        log.info(">>>>可选的打印机:{}", printerNames);
        for (int i = 0; i < printServices.length; i++) {
            String name = printServices[i].getName().toLowerCase();
            log.info("printName{}:{}", i, name);
            if (name.contains(printerName.toLowerCase())) {
                service = printServices[i];
                break;
            }
        }
        if (service == null) {
            throw new BusinessException("未找到指定的打印机:" + printerName + ",可选打印服务:" + printerNames);
        }
        return service;
    }

    public static void print(String filePath, String printerName, PrintRequestAttributeSet aset) throws Exception {
        print(new File(filePath), printerName, aset);
    }


    
    public static void print(File file, String printerName, PrintRequestAttributeSet aset) throws Exception {
        if (file == null) {
            log.error("传入的文件为空");
            throw new Exception("传入的文件为空");
        }
        if (!file.exists()) {
            log.error("文件不存在:" + file.getAbsolutePath());
            throw new Exception("文件不存在:" + file.getAbsolutePath());
        }
        PrintService printService = lookupPrinter(printerName);
        if (null == aset) {
            aset = getPrintRequestAttributeSet(); // 获取打印参数
        }
        PDdocument document = PDdocument.load(file);
        PrinterJob printJob = PrinterJob.getPrinterJob();
        printJob.setJobName(file.getName());

        printJob.setPrintService(printService); // 选择打印机

        //设置纸张及缩放
        PDFPrintable pdfPrintable = new PDFPrintable(document, Scaling.ACTUAL_SIZE);
        //设置多页打印
        Book book = new Book();
        PageFormat pageFormat = new PageFormat();
        //设置打印方向
        pageFormat.setOrientation(PageFormat.PORTRAIT);//纵向
        pageFormat.setPaper(getPaper());//设置纸张
        book.append(pdfPrintable, pageFormat, document.getNumberOfPages());
        printJob.setPageable(book);

        try {
            printJob.print(aset);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("打印机打印异常:{}", e.getMessage());
            throw new Exception("打印机打印异常:" + e.getMessage());
        } finally {
            IOUtils.closeQuietly(document);
        }
    }

    private static PrintRequestAttributeSet getPrintRequestAttributeSet() {
        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        aset.add(new Copies(1)); //份数
        aset.add(MediaSizeName.ISO_A4); //纸张
        // aset.add(Finishings.STAPLE);//装订
        aset.add(Sides.ONE_SIDED);//单双面
        return aset;
    }

    
    public static PrintRequestAttributeSet getPrintRequestAttributeSet(int copy) {
        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        aset.add(new Copies(copy)); //份数
        aset.add(MediaSizeName.ISO_A4); //纸张
        // aset.add(Finishings.STAPLE);//装订
        aset.add(Sides.ONE_SIDED);//单双面
        return aset;
    }



    
    public static byte[] img2PDF(List images) throws Exception {

        document doc = new document(PageSize.A4, 0, 0, 36.0F, 36.0F);//普通a4
        ByteArrayOutputStream pdfOut = new ByteArrayOutputStream();
        PdfWriter.getInstance(doc, pdfOut);
        doc.open();
        for (byte[] image : images) {
            com.itextpdf.text.Image pic = com.itextpdf.text.Image.getInstance(image);
            pic.setScaleToFitLineWhenOverflow(true);
            doc.add(pic);
        }

        doc.close();
        byte[] pdf = pdfOut.toByteArray();
        IOUtils.closeQuietly(pdfOut);
        return pdf;
    }

    
    public static String img2PDF(String imagePath, String descfolder, String pdfName) {
        return img2PDF(Arrays.asList(imagePath), descfolder, pdfName);
    }

    
    public static String img2PDF(List imgPaths, String descfolder) {
        String pdfName = System.currentTimeMillis() + ".pdf";
        return img2PDF(imgPaths, descfolder, pdfName);
    }

    public static String img2PDF(List imgPaths, String descfolder, String pdfName) {
        pdfName = StringUtils.isEmpty(pdfName) ? System.currentTimeMillis() + ".pdf" : pdfName;
        String pdfPath = "";
        FileOutputStream fos = null;
        try {
            File file = new File(descfolder);
            if (!file.exists()) {
                file.mkdirs();
            }

            pdfPath = descfolder + "/" + pdfName;
            document doc = new document(PageSize.A4, 0, 0, 0, 0);

            fos = new FileOutputStream(pdfPath);
            PdfWriter.getInstance(doc, fos);
            doc.open();
            for (String imagePath : imgPaths) {
                com.itextpdf.text.Image image = image = com.itextpdf.text.Image.getInstance(imagePath);
                image.scaleAbsolute(PageSize.A4.getWidth(), PageSize.A4.getHeight());
                doc.add(image);
            }
            doc.close();
            log.info("生成pdf成功:{}", pdfPath);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("生成pdf异常:" + e.getMessage());
            throw new BusinessException("生成pdf异常:" + e.getMessage());
        } finally {
            IOUtils.closeQuietly(fos);
        }
        return pdfPath;
    }


    public static void main(String[] args) throws Exception {


        File file = new File("D:\test\2.pdf");
        print(file, "HP Las", getPrintRequestAttributeSet(1));

//        PDdocument document =  PDdocument.load(file);
//        PrinterJob printJob = PrinterJob.getPrinterJob();
//        printJob.setJobName(file.getName());
//        PrintService printService = lookupPrinter("HP Las");
//        printJob.setPrintService(printService);
//
//        //设置纸张及缩放
//        PDFPrintable pdfPrintable = new PDFPrintable(document, Scaling.ACTUAL_SIZE);
//        //设置多页打印
//        Book book = new Book();
//        PageFormat pageFormat = new PageFormat();
//        //设置打印方向
//        pageFormat.setOrientation(PageFormat.PORTRAIT);//纵向
//        pageFormat.setPaper(getPaper());//设置纸张
//        book.append(pdfPrintable, pageFormat, document.getNumberOfPages());
//        printJob.setPageable(book);
//        printJob.setCopies(1);//设置打印份数
//
//        //添加打印属性
//        HashPrintRequestAttributeSet pars = new HashPrintRequestAttributeSet();
//        pars.add(Sides.ONE_SIDED); //设置单双页
//        printJob.print(pars);

    }


    public static Paper getPaper() {
        Paper paper = new Paper();
        // 默认为A4纸张,对应像素宽和高分别为 595, 842
        int width = 595;
        int height = 842;
        // 设置边距,单位是像素,10mm边距,对应 28px
        int marginLeft = 10;
        int marginRight = 0;
        int marginTop = 10;
        int marginBottom = 0;
        paper.setSize(width, height);
        // 下面一行代码,解决了打印内容为空的问题
        paper.setImageableArea(marginLeft, marginRight, width - (marginLeft + marginRight), height - (marginTop + marginBottom));
        return paper;

    }

}

 通过main函数可测试结果。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5678021.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存