使用JAVA后台完成打印动作

参考地址:https://blog.csdn.net/PostersXu/article/details/80705247

一、概述

    本篇博客讲解关于如何实现纯后台的打印操作,无前端代码,使用JAVA.AWT类实现。代码分为两个部分:打印数据的封装以及打印功能的实现。

二、实现

1.打印数据封装

    本demo的打印内容包括:标题、资产名称、型号、部门、责任人、启用日期和二维码图片。类定义如下:

  1. /**
  2. * demo测试数据封装
  3. *
  4. * @author xuyong
  5. *
  6. */
  7. public class DemoDto implements Serializable {
  8. private static final long serialVersionUID = 1L;
  9. private String assetName; //资产名称
  10. private String assetType; //型号
  11. private String deptName; //部门
  12. private String responsible; //责任人
  13. private Date useTime; //启用日期
  14. private String qrCodePath; //二维码路径
  15. private String title; //标签页标题
  16. public DemoDto(String assetName, String assetType, String deptName,
  17. String responsible, Date useTime, String qrCodePath, String title) {
  18. super();
  19. this.assetName = assetName;
  20. this.assetType = assetType;
  21. this.deptName = deptName;
  22. this.responsible = responsible;
  23. this.useTime = useTime;
  24. this.qrCodePath = qrCodePath;
  25. this.title = title;
  26. }
  27. //父类构造器必须声明,避免小几率的异常或无响应
  28. public DemoDto() {
  29. super();
  30. }
  31. public String getTitle() {
  32. return title;
  33. }
  34. public void setTitle(String title) {
  35. this.title = title;
  36. }
  37. public String getQrCodePath() {
  38. return qrCodePath;
  39. }
  40. public void setQrCodePath(String qrCodePath) {
  41. this.qrCodePath = qrCodePath;
  42. }
  43. public String getAssetName() {
  44. return assetName;
  45. }
  46. public void setAssetName(String assetName) {
  47. this.assetName = assetName;
  48. }
  49. public String getAssetType() {
  50. return assetType;
  51. }
  52. public void setAssetType(String assetType) {
  53. this.assetType = assetType;
  54. }
  55. public String getDeptName() {
  56. return deptName;
  57. }
  58. public void setDeptName(String deptName) {
  59. this.deptName = deptName;
  60. }
  61. public String getResponsible() {
  62. return responsible;
  63. }
  64. public void setResponsible(String responsible) {
  65. this.responsible = responsible;
  66. }
  67. public Date getUseTime() {
  68. return useTime;
  69. }
  70. public void setUseTime(Date useTime) {
  71. this.useTime = useTime;
  72. }
  73. }

2.打印功能的实现

后台打印必须实现Printable接口,并实现其方法print()。重要的数据和变量在方法里有注释说明,方法如下:

  1. @Override
  2. public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
  3. throws PrinterException {
  4. System.out.println( "-----------------执行第"+(COUNT+ 1)+ "次打印-------------------");
  5. System.out.println( "pageIndex = "+pageIndex);
  6. Component c = null;
  7. //转换成Graphics2D
  8. Graphics2D g2 = (Graphics2D) graphics;
  9. //设置打印颜色为黑色
  10. g2.setColor(Color.black);
  11. //打印起点坐标
  12. double x = pageFormat.getImageableX();
  13. double y = pageFormat.getImageableY();
  14. System.out.println( "起点坐标x="+x+ ";y="+y);
  15. switch(pageIndex){
  16. case 0:
  17. //设置打印字体(字体名称、样式和点大小)(字体名称可以是物理或者逻辑名称)
  18. //Java平台所定义的五种字体系列:Serif、SansSerif、Monospaced、Dialog 和 DialogInput
  19. Font font = new Font( "新宋体", Font.PLAIN, 7);
  20. g2.setFont(font); //设置字体
  21. float[] dash1 = { 2.0f};
  22. //设置打印线的属性。
  23. //1.线宽 2、3、不知道,4、空白的宽度,5、虚线的宽度,6、偏移量
  24. g2.setStroke( new BasicStroke( 0.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 2.0f, dash1, 0.0f));
  25. //获取需要打印的图片,若是动态生成,直接传入绝对路径即可
  26. Image src = Toolkit.getDefaultToolkit().getImage(DEMODTO_LIST.get(COUNT).getQrCodePath());
  27. if (src == null) {
  28. System.out.println( "没有找到图像");
  29. }
  30. /**
  31. * 参数2:打印的x坐标起点 参数3 打印的y坐标起点
  32. * 参数4:打印图片的宽度 参数5:打印图片的高度
  33. */
  34. g2.drawImage(src,( int) 80,( int) 25,( int) 48,( int) 48,c);
  35. //标题,固定不变
  36. g2.drawString(DEMODTO_LIST.get(COUNT).getTitle(), ( float) 30, ( float) 18);
  37. //以下为动态的文字内容
  38. font = new Font( "新宋体", Font.PLAIN, 5);
  39. g2.setFont(font);
  40. g2.drawString( "资产名称:"+DEMODTO_LIST.get(COUNT).getAssetName(), ( float) 10, ( float) 30);
  41. g2.drawString( "型 号:"+DEMODTO_LIST.get(COUNT).getAssetType(), ( float) 10, ( float) 40);
  42. g2.drawString( "部 门:"+DEMODTO_LIST.get(COUNT).getDeptName(), ( float) 10, ( float) 50);
  43. g2.drawString( "责 任 人:"+DEMODTO_LIST.get(COUNT).getResponsible(), ( float) 10, ( float) 60);
  44. g2.drawString( "启用日期:"+dateToStr(DEMODTO_LIST.get(COUNT).getUseTime()), ( float) 10, ( float) 70);
  45. System.out.println( "-----------------打印成功-------------------");
  46. return PAGE_EXISTS;
  47. default:
  48. return NO_SUCH_PAGE;
  49. }
  50. }

本类还有类变量定义如下:

  1. private static int COUNT = 0; //待打印数据的条数,此变量需定义在数据集合之前
  2. private static List<DemoDto> DEMODTO_LIST = getDemoDto(); //待打印的文字数据
  3. private static SimpleDateFormat FORMAT = new SimpleDateFormat( "yyyy-MM-dd"); //日期格式

测试数据添加的方法:

  1. /**
  2. * 封装测试数据
  3. *
  4. * @return
  5. */
  6. private static List<DemoDto> getDemoDto() {
  7. List<DemoDto> dtos = new ArrayList<DemoDto>();
  8. dtos.add( new DemoDto( "戒毒所打印机01", "惠普打印机", "技术支持部", "责任人01", new Date(), "D:\\test.jpg", "宝丰戒毒所"));
  9. dtos.add( new DemoDto( "戒毒所打印机02", "惠普打印机", "技术支持部", "责任人02", new Date(), "D:\\test.jpg", "宝丰戒毒所"));
  10. dtos.add( new DemoDto( "戒毒所打印机03", "惠普打印机", "技术支持部", "责任人03", new Date(), "D:\\test.jpg", "宝丰戒毒所"));
  11. dtos.add( new DemoDto( "戒毒所打印机04", "惠普打印机", "技术支持部", "责任人04", new Date(), "D:\\test.jpg", "宝丰戒毒所"));
  12. dtos.add( new DemoDto( "戒毒所打印机05", "惠普打印机", "技术支持部", "责任人05", new Date(), "D:\\test.jpg", "宝丰戒毒所"));
  13. dtos.add( new DemoDto( "戒毒所打印机06", "惠普打印机", "技术支持部", "责任人06", new Date(), "D:\\test.jpg", "宝丰戒毒所"));
  14. dtos.add( new DemoDto( "戒毒所打印机07", "惠普打印机", "技术支持部", "责任人07", new Date(), "D:\\test.jpg", "宝丰戒毒所"));
  15. dtos.add( new DemoDto( "戒毒所打印机08", "惠普打印机", "技术支持部", "责任人08", new Date(), "D:\\test.jpg", "宝丰戒毒所"));
  16. dtos.add( new DemoDto( "戒毒所打印机09", "惠普打印机", "技术支持部", "责任人09", new Date(), "D:\\test.jpg", "宝丰戒毒所"));
  17. dtos.add( new DemoDto( "戒毒所打印机010", "惠普打印机", "技术支持部", "责任人10", new Date(), "D:\\test.jpg", "宝丰戒毒所"));
  18. if (dtos.size()> 0) {
  19. COUNT = dtos.size()- 1;
  20. System.out.println( "总共需打印"+(COUNT+ 1)+ "次");
  21. }
  22. return dtos;
  23. }

3.调用打印功能

  1. public static void main(String[] args) {
  2. // 通俗理解就是书、文档
  3. Book book = new Book();
  4. // 设置成竖打
  5. PageFormat pf = new PageFormat();
  6. pf.setOrientation(PageFormat.PORTRAIT);
  7. // 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。
  8. Paper p = new Paper();
  9. p.setSize( 142, 85); //纸张大小
  10. p.setImageableArea( 10, 10, 142, 70);
  11. pf.setPaper(p);
  12. // 把 PageFormat 和 Printable 添加到书中,组成一个页面
  13. book.append( new PrintDemo(), pf);
  14. //获取打印服务对象
  15. PrinterJob job = PrinterJob.getPrinterJob();
  16. // 设置打印类
  17. job.setPageable(book);
  18. try {
  19. //直接打印 ,不显示对话框
  20. if (DEMODTO_LIST.size()> 0) {
  21. for ( int i= 0;i<DEMODTO_LIST.size();i++) {
  22. job.print();
  23. --COUNT;
  24. }
  25. }
  26. } catch (PrinterException e) {
  27. e.printStackTrace();
  28. }
  29. }

注:这里用需要注意纸张的大小设置,一般我们以mm来衡量纸张大小,但是打印机是用点作为计量单位的。1点为1英寸的1/72,1英寸为25.4毫米。

如需调用打印的确认框可使用PrinterJob.printDialog()方法。

最终效果如下:




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值