java实现打印功能DEMO

package com.kennosaur.io.file;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Printtest {
    private static int COUNT = 0;				   //待打印数据的条数,此变量需定义在数据集合之前						

	private static List<DemoDto> DEMODTO_LIST = getDemoDto();  //待打印的文字数据
	
	private static SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd");  	//日期格式

	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();  
	     }
	}
	
	public static class PrintDemo implements Printable {		
		@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("启用日期:"+FORMAT.format(DEMODTO_LIST.get(COUNT).getUseTime()), (float)10, (float)70); 
	          
	          System.out.println("-----------------打印成功-------------------");
	          return PAGE_EXISTS;  
	 
	        default:  
	          return NO_SUCH_PAGE;  
	 
	     }
		}
	}
	
	/**
	 * 封装测试数据
	 * 
	 * @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;
	}
	
	/**
	 * demo测试数据封装
	 * 
	 * @author xuyong
	 *
	 */
	public static 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;
		}	 
	}

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以给你一个简单的Java示例,来展示如何使用Java进行编程: public class Demo { public static void main(String[] args) { System.out.println("Hello World!"); } } ### 回答2: 以下是一个简单的Java Demo,演示了如何通过Java代码实现一个求阶乘的函数。阶乘即把一个正整数n及其前面所有的正整数相乘,用符号"!"表示。 ```java import java.util.Scanner; public class FactorialDemo { // 递归方式求阶乘 public static int factorialRecursive(int n) { if (n == 0 || n == 1) { return 1; } else { return n * factorialRecursive(n - 1); } } // 循环方式求阶乘 public static int factorialIterative(int n) { int result = 1; for (int i = 1; i <= n; i++) { result *= i; } return result; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入一个正整数:"); int input = scanner.nextInt(); // 使用递归方式求阶乘 int resultRecursive = factorialRecursive(input); System.out.println("递归方式求得的" + input + "的阶乘为:" + resultRecursive); // 使用循环方式求阶乘 int resultIterative = factorialIterative(input); System.out.println("循环方式求得的" + input + "的阶乘为:" + resultIterative); } } ``` 该Demo定义了一个FactorialDemo类,在main方法中使用Scanner获取用户输入的正整数,并分别通过递归方式和循环方式求出输入数的阶乘,并将结果输出到控制台上。 递归方式的实现,在方法factorialRecursive中,先判断输入数是否为0或1,如果是,则直接返回1;否则,通过递归调用该方法,传入n-1作为参数,并将n与递归调用的结果相乘作为返回值。 循环方式的实现,在方法factorialIterative中,使用一个循环遍历从1到输入数之间的所有整数,并将它们相乘,最后返回结果。 该Demo可以帮助理解递归和循环的差异,以及如何通过Java代码实现一个简单的功能。 ### 回答3: 这是一个基于Java的简单Demo,用于展示如何实现一个简易的计算器功能。 首先,我们创建一个名为"Calculator"的Java类。在该类中,我们定义了一个静态方法"calculate"用于进行计算。该方法接受三个参数:两个操作数和一个运算符,并返回计算结果。 ```java public class Calculator { public static double calculate(double num1, double num2, char operator) { double result = 0; switch (operator) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': result = num1 / num2; break; default: System.out.println("Invalid operator"); break; } return result; } } ``` 接下来,我们创建一个包含main方法的Java类来测试上述计算器功能。在main方法中,我们通过用户输入获取操作数和操作符,并调用Calculator类的calculate方法进行计算,并打印结果。 ```java import java.util.Scanner; public class CalculatorDemo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入第一个操作数:"); double num1 = scanner.nextDouble(); System.out.print("请输入第二个操作数:"); double num2 = scanner.nextDouble(); System.out.print("请输入操作符(+、-、*、/):"); char operator = scanner.next().charAt(0); double result = Calculator.calculate(num1, num2, operator); System.out.println("计算结果为:" + result); } } ``` 现在,我们可以运行CalculatorDemo类,在控制台上输入操作数和操作符,即可得到计算结果。 这个简单的Java Demo展示了如何通过创建一个包含计算器功能的类和一个测试类来完成一个基本的计算器应用。当然,实际生产环境中的计算器可能会更加复杂,但这个例子可以作为一个基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值