使用JAVA后台完成打印动作

一、概述

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

二、实现

1.打印数据封装

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

/**
 * demo测试数据封装
 * 
 * @author xuyong
 *
 */
public class DemoDto implements Serializable {

	private static final long serialVersionUID = 1L;
	
	private String assetName;		//资产名称
	
	private String assetType;		//型号
	
	private String deptName;		//部门	
	
	private String responsible;		//责任人
	
	private Date useTime;			//启用日期
	
	private String qrCodePath;		//二维码路径
	
	private String title;			//标签页标题

	public DemoDto(String assetName, String assetType, String deptName,
			String responsible, Date useTime, String qrCodePath, String title) {
		super();
		this.assetName = assetName;
		this.assetType = assetType;
		this.deptName = deptName;
		this.responsible = responsible;
		this.useTime = useTime;
		this.qrCodePath = qrCodePath;
		this.title = title;
	}

	//父类构造器必须声明,避免小几率的异常或无响应
	public DemoDto() {
		super();
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getQrCodePath() {
		return qrCodePath;
	}

	public void setQrCodePath(String qrCodePath) {
		this.qrCodePath = qrCodePath;
	}

	public String getAssetName() {
		return assetName;
	}

	public void setAssetName(String assetName) {
		this.assetName = assetName;
	}

	public String getAssetType() {
		return assetType;
	}

	public void setAssetType(String assetType) {
		this.assetType = assetType;
	}

	public String getDeptName() {
		return deptName;
	}

	public void setDeptName(String deptName) {
		this.deptName = deptName;
	}

	public String getResponsible() {
		return responsible;
	}

	public void setResponsible(String responsible) {
		this.responsible = responsible;
	}

	public Date getUseTime() {
		return useTime;
	}

	public void setUseTime(Date useTime) {
		this.useTime = useTime;
	}

}

2.打印功能的实现

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

@Override
	public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
			throws PrinterException {
		System.out.println("-----------------执行第"+(COUNT+1)+"次打印-------------------");
		
		System.out.println("pageIndex = "+pageIndex);
		
		Component c = null;  
		
	    //转换成Graphics2D  
	    Graphics2D g2 = (Graphics2D) graphics;  
	  
	    //设置打印颜色为黑色  
	    g2.setColor(Color.black);  
	  
	    //打印起点坐标  
	    double x = pageFormat.getImageableX();  
	    double y = pageFormat.getImageableY();
	    
	    System.out.println("起点坐标x="+x+";y="+y);
	    
	    
	    switch(pageIndex){  
        case 0:  
          //设置打印字体(字体名称、样式和点大小)(字体名称可以是物理或者逻辑名称)  
          //Java平台所定义的五种字体系列:Serif、SansSerif、Monospaced、Dialog 和 DialogInput  
          Font font = new Font("新宋体", Font.PLAIN, 7);  
          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(DEMODTO_LIST.get(COUNT).getQrCodePath());  
          if (src == null) {
        	  System.out.println("没有找到图像");
          }
          
          /**
           * 参数2:打印的x坐标起点         参数3  打印的y坐标起点
           * 参数4:打印图片的宽度           参数5:打印图片的高度
           */
          g2.drawImage(src,(int)80,(int)25,(int)48,(int)48,c);  
          
          //标题,固定不变
          g2.drawString(DEMODTO_LIST.get(COUNT).getTitle(), (float)30, (float)18); 
          
          //以下为动态的文字内容
          font = new Font("新宋体", Font.PLAIN, 5);  
          g2.setFont(font);	
          g2.drawString("资产名称:"+DEMODTO_LIST.get(COUNT).getAssetName(), (float)10, (float)30); 
          g2.drawString("型    号:"+DEMODTO_LIST.get(COUNT).getAssetType(), (float)10, (float)40); 
          g2.drawString("部    门:"+DEMODTO_LIST.get(COUNT).getDeptName(), (float)10, (float)50); 
          g2.drawString("责 任 人:"+DEMODTO_LIST.get(COUNT).getResponsible(), (float)10, (float)60); 
          g2.drawString("启用日期:"+dateToStr(DEMODTO_LIST.get(COUNT).getUseTime()), (float)10, (float)70); 
          
          System.out.println("-----------------打印成功-------------------");
          return PAGE_EXISTS;  
 
        default:  
          return NO_SUCH_PAGE;  
 
     }
	}

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

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

测试数据添加的方法:

/**
	 * 封装测试数据
	 * 
	 * @return
	 */
	private static List<DemoDto> getDemoDto() {
		List<DemoDto> dtos = new ArrayList<DemoDto>();
		dtos.add(new DemoDto("戒毒所打印机01", "惠普打印机", "技术支持部", "责任人01", new Date(),"D:\\test.jpg","宝丰戒毒所"));
		dtos.add(new DemoDto("戒毒所打印机02", "惠普打印机", "技术支持部", "责任人02", new Date(),"D:\\test.jpg","宝丰戒毒所"));
		dtos.add(new DemoDto("戒毒所打印机03", "惠普打印机", "技术支持部", "责任人03", new Date(),"D:\\test.jpg","宝丰戒毒所"));
		dtos.add(new DemoDto("戒毒所打印机04", "惠普打印机", "技术支持部", "责任人04", new Date(),"D:\\test.jpg","宝丰戒毒所"));
		dtos.add(new DemoDto("戒毒所打印机05", "惠普打印机", "技术支持部", "责任人05", new Date(),"D:\\test.jpg","宝丰戒毒所"));
		dtos.add(new DemoDto("戒毒所打印机06", "惠普打印机", "技术支持部", "责任人06", new Date(),"D:\\test.jpg","宝丰戒毒所"));
		dtos.add(new DemoDto("戒毒所打印机07", "惠普打印机", "技术支持部", "责任人07", new Date(),"D:\\test.jpg","宝丰戒毒所"));
		dtos.add(new DemoDto("戒毒所打印机08", "惠普打印机", "技术支持部", "责任人08", new Date(),"D:\\test.jpg","宝丰戒毒所"));
		dtos.add(new DemoDto("戒毒所打印机09", "惠普打印机", "技术支持部", "责任人09", new Date(),"D:\\test.jpg","宝丰戒毒所"));
		dtos.add(new DemoDto("戒毒所打印机010", "惠普打印机", "技术支持部", "责任人10", new Date(),"D:\\test.jpg","宝丰戒毒所"));
		if (dtos.size()>0) {
			COUNT = dtos.size()-1;
			System.out.println("总共需打印"+(COUNT+1)+"次");
		}
		return dtos;
	}

3.调用打印功能

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(142,85);//纸张大小   
	    p.setImageableArea(10,10, 142,70);
	    pf.setPaper(p);  
	    
	    //    把 PageFormat 和 Printable 添加到书中,组成一个页面    
	    book.append(new PrintDemo(), pf); 
	    
	     //获取打印服务对象  
	     PrinterJob job = PrinterJob.getPrinterJob();        
	     
	     // 设置打印类   
	     job.setPageable(book);  
	         
	     try {  
	         //直接打印 ,不显示对话框
	    	 if (DEMODTO_LIST.size()>0) {
	    		 for (int i=0;i<DEMODTO_LIST.size();i++) {
	    			  job.print(); 
	    			  --COUNT;
	    		 }
	    	 }
	     } catch (PrinterException e) {  
	         e.printStackTrace();  
	     }
	}

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

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

最终效果如下:



猜你喜欢

转载自blog.csdn.net/postersxu/article/details/80705247