JAVA 调用打印机输出PDF文件

想利用java程序打印一些文件。做以下测试:

一、环境

要调用打印机输出文件,首先本地得有一个能正常使用的打印机。我电脑安装的是虚拟打印机。

JAVA 调用打印机输出PDF文件

二、java代码

一)、打印输出的实体类

import java.io.Serializable;
import java.util.Date;
/**
 * @Author: ykbian
 * @Date: 2018/10/24 9:22
 * @Todo: 打印的员工信息实体类
 */
public class Persion implements Serializable {


    private static final long serialVersionUID = 1L;
    private String userName;        //姓名
    private String gender;          //性别
    private String nation;          // 民族
    private String address;        //住址
    private String IDNumber;        //身份证号码
    private int    age;            //启用日期
    private String qrCodePath;        //头像
    private Date   birthday;

    // 以下是get方法、set方法和两个构造函数,省略
}

二)、工具类及测试


/**
 * @Author: ykbian
 * @Date: 2018/10/24 9:24
 * @Todo: 打印的工具类
 */
public class PrintUtil implements Printable {

//    身份证:长度85.6毫米,宽度54毫米,厚度0.9毫米
    //待打印数据的条数,此变量需定义在数据集合之前
    private static int COUNT = 0;
    //待打印的文字数据
    private static List<Persion> STUDENT_LIST = getStudent();
    //日期格式
    private static SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");


   /**
    *@Author:      ykbian
    *@date_time:   2018/10/24 13:41
    *@Description:  重写Printable 的print()方法
    *@param:      Graphic指明打印的图形环境
    *             PageFormat指明打印页格式(页面大小以点为计量单位,1点为1英寸的1/72,1英寸为25.4毫米。A4纸大致为595×842点)
    *             pageIndex指明页号
   */
    @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
        Component c = null;
        //转换成Graphics2D
        Graphics2D g2 = (Graphics2D) graphics;
        //设置打印颜色为黑色
        g2.setColor(Color.BLACK);
        //打印起点坐标
        double x = pageFormat.getImageableX();
        double y = pageFormat.getImageableY();
        switch (pageIndex) {
            case 0:
                //设置打印字体(字体名称、样式和点大小)(字体名称可以是物理或者逻辑名称)
                //Java平台所定义的五种字体系列:Serif、SansSerif、Monospaced、Dialog 和 DialogInput
                Font font = new Font("新宋体", Font.PLAIN, 20);
                //设置字体
                g2.setFont(font);
                float[] dash1 = {2.0f};
                //设置打印线的属性。
                //1.线宽 2、3、不知道,4、空白的宽度,5、虚线的宽度,6、偏移量
                g2.setStroke(new BasicStroke(0.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 2.0f, dash1, 0.0f));

                //获取需要打印的图片,若是动态生成,直接传入绝对路径即可
                Image src = Toolkit.getDefaultToolkit().getImage(STUDENT_LIST.get(COUNT).getQrCodePath());
                System.out.println(STUDENT_LIST.get(COUNT).getQrCodePath());
                if (src == null) {
                    System.out.println("没有找到图像");
                }
                // 图片的坐标(x,y)宽,高
                g2.drawImage(src,(int)120,(int)150,(int)136,(int)220,c);
                //标题,固定不变
                g2.drawString(STUDENT_LIST.get(COUNT).getTitle(), (float) 250, (float)100);
                //以下为动态的文字内容
                font = new Font("新宋体", Font.ROMAN_BASELINE, 15);
                g2.setFont(font);
                g2.drawString("姓名:" + STUDENT_LIST.get(COUNT).getUserName(), (float) 50, (float) 150);
                g2.drawString("性别:" + STUDENT_LIST.get(COUNT).getGender(), (float) 50, (float) 170);
                g2.drawString("民族:" + STUDENT_LIST.get(COUNT).getNation(), (float) 50, (float) 190);
                g2.drawString("住址:" + STUDENT_LIST.get(COUNT).getAddress(), (float) 50, (float) 210);
                g2.drawString("路径:" + STUDENT_LIST.get(COUNT).getQrCodePath(), (float) 50, (float) 230);
                g2.drawString("身份证号码:" + STUDENT_LIST.get(COUNT).getIDNumber(), (float) 50, (float) 250);
                g2.drawString("出生日期:" + FORMAT.format(STUDENT_LIST.get(COUNT).getBirthday()), (float) 50, (float) 280);
                return PAGE_EXISTS;
            default:
                return NO_SUCH_PAGE;
        }

    }

    /**
     * 封装测试数据
     *
     * @return
     */
    private static List<Persion> getStudent() {
        List<Persion> dtos = new ArrayList<>();
        dtos.add(new Persion("姜子牙", "男", "汉", "岐山县", "622222111111111111", 800, "E:\\test\\jzy.jpg", new Date(), "居民身份证"));
        dtos.add(new Persion("杨戬", "男", "汉", "岐山县", "622222111111111111", 800, "E:/test/jzy.jpg", new Date(), "居民身份证"));
        dtos.add(new Persion("哪吒", "男", "汉", "岐山县", "622222111111111111", 800, "E:/test/jzy.jpg", new Date(), "居民身份证"));
        dtos.add(new Persion("雷震子", "男", "汉", "岐山县", "622222111111111111", 800, "E:/test/jzy.jpg", new Date(), "居民身份证"));
        dtos.add(new Persion("哮天犬", "男", "汉", "岐山县", "622222111111111111", 800, "E:/test/jzy.jpg", new Date(), "居民身份证"));
//
        if (dtos.size() > 0) {
            COUNT = dtos.size() - 1;
            System.out.println("总共需打印" + (COUNT + 1) + "次");
        }
        return dtos;
    }

    public static void main(String[] args) {
        //    通俗理解就是书、文档
        Book book = new Book();
        //    设置成竖打()
        PageFormat pf = new PageFormat();
        pf.setOrientation(PageFormat.PORTRAIT);
        //    通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。
        Paper p = new Paper();
        //纸张大小
        p.setSize(1000, 618);
        // 页面可打印的区域大小(左上角定位,参数分别是x轴,y轴,宽度和长度)
        p.setImageableArea(15, 15, 800, 600);
        pf.setPaper(p);
        //    把 PageFormat 和 Printable 添加到书中,组成一个页面
        book.append(new PrintUtil(), pf);
        //获取打印服务对象
        PrinterJob job = PrinterJob.getPrinterJob();
        // 设置打印类
        job.setPageable(book);
        try {
            if (STUDENT_LIST.size() > 0) {
                for (int i = 0; i < STUDENT_LIST.size(); i++) {
                    job.print();
                    --COUNT;
                }
            }
        } catch (PrinterException e) {
            e.printStackTrace();
        }
    }
}

三、输出结果

运行程序,输出结果如下:

JAVA 调用打印机输出PDF文件

然而,还是存在一些问题,图片打印失败。不知道为什么… …

四、源码

源码在这里:https://github.com/bian1234/JAVAPrintTest

五、鸣谢

参考文章:

  1. https://blog.csdn.net/qq_38743494/article/details/79132722
  2. https://blog.csdn.net/postersxu/article/details/80705247
  3. https://www.cnblogs.com/gaopeng527/p/4357591.html