java打印

为公司开发一个快递单,拣货单系统。纯JAVA开发,但是JAVA API对打印的支持相对比较薄弱,所以开发过程中挺痛苦的。

1.对打印机有一定的了解;

2.较好的控制好尺寸和内容的位置

=================================================================================================

1.设置好打印机的纸张大小(高跟宽),一般针对批量打印的时候。对高度要求比较严格。另外注意尺寸跟像素的换算。

   比如圆通快递单的高度是127CM,但在程序中得用360去控制纸张的大小。至于怎么换算,下面我是使用这种方法(比较笨没办法哈哈)

   先设置好打印机(如图)---宅急送快递单的尺寸

  


2.根据代码去获取宅急送的快递单高度为多少?

package com.gotomycloud.print;

/**
 * 获取宅急送的高度
 * 
 */
import java.awt.Graphics;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.MediaPrintableArea;


public class GetZjsH implements Printable {

	private int pageSize;// 打印的总页数

	private double paperW = 0;// 打印的纸张宽度

	private double paperH = 0;// 打印的纸张高度
	
	// 实现java.awt.print.Printable接口的打印方法

	// pageIndex:打印的当前页,此参数是系统自动维护的,不需要手动维护,系统会自动递增

	public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)

	throws PrinterException {

		if (1 <= pageIndex){
			// 退出打印
			return Printable.NO_SUCH_PAGE;
		}
		// 设置打印的字体

		System.out.println("获取宅急送的高度"+pageFormat.getHeight());
		
		return PAGE_EXISTS;
		
	}


	public void starPrint() {

		try {

			PrinterJob prnJob = PrinterJob.getPrinterJob();
			PageFormat pageFormat = new PageFormat();
			pageFormat.setOrientation(PageFormat.PORTRAIT);
			prnJob.setPrintable(this);
			PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
			
			attributes.add(new MediaPrintableArea(0f, 0f, (float) (217 / 25.4),
				(float) (139 / 25.4), MediaPrintableArea.INCH));
			
			prnJob.print(attributes);

		} catch (PrinterException ex) {

			ex.printStackTrace();

			System.err.println("打印错误:" + ex.toString());

		}

	};;
	// 入口方法

	public static void main(String[] args) {

		GetZjsH pm = new GetZjsH();// 实例化打印类

		pm.starPrint();

	}

}
PS:换自结果为获取宅急送的高度841.6062992125984

3.获取转换高度,再根据宅急送进行绘制坐标(这一步方便你在快递单在定位坐标)--X+20,Y+10

package com.gotomycloud.print;

/**
 * 获取宅急送的高度
 * 
 */
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.MediaPrintableArea;


public class GetZjsH implements Printable {

	private int pageSize;// 打印的总页数

	private double paperW = 0;// 打印的纸张宽度

	private double paperH = 0;// 打印的纸张高度
	
	// 实现java.awt.print.Printable接口的打印方法

	// pageIndex:打印的当前页,此参数是系统自动维护的,不需要手动维护,系统会自动递增

	public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)

	throws PrinterException {
		
		//转换成Graphics2D
		Graphics2D g2 = (Graphics2D) graphics;

		if (1 <= pageIndex){
			// 退出打印
			return Printable.NO_SUCH_PAGE;
		}
		// 设置打印的字体

		Font font = null;
		
		g2.setFont(font);
			
		for(int i =0;i<20;i++){
			g2.drawLine(0, 0+(20*i), 550, 0+(20*i));
		}
		
		for(int i =0;i<30;i++){
			g2.drawLine(0+(20*i), 0,  0+(20*i),300);
		}
		
		return PAGE_EXISTS;
		
	}


	public void starPrint() {

		try {

			PrinterJob prnJob = PrinterJob.getPrinterJob();
			PageFormat pageFormat = new PageFormat();
			pageFormat.setOrientation(PageFormat.PORTRAIT);
			prnJob.setPrintable(this);
			PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
			
			attributes.add(new MediaPrintableArea(0f, 0f, (float) (217 / 25.4),
				(float) (139 / 25.4), MediaPrintableArea.INCH));
			
			prnJob.print(attributes);

		} catch (PrinterException ex) {

			ex.printStackTrace();

			System.err.println("打印错误:" + ex.toString());

		}

	};;
	// 入口方法

	public static void main(String[] args) {

		GetZjsH pm = new GetZjsH();// 实例化打印类

		pm.starPrint();

	}

}

4.打印工具类

package com.healthyhome.destop.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
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.util.List;

import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.MediaPrintableArea;

import com.healthyhome.destop.sys.dto.SysOrderPrintEntityDto;


/**
 * 
 * 快递单打印工具类
 * @author zheng.zejjie
 * 2014-2-11
 *
 */
public class EpPrintUtil implements Printable{
	
	private List<List<SysOrderPrintEntityDto>> spkpList;   //打印信息实体
	
	private double paperW = 792;// 打印的纸张宽度
	
	private double paperH = 0;// 打印的纸张高度
	
	public EpPrintUtil(List<List<SysOrderPrintEntityDto>> spkpList,double paperW,double paperH){
		this.spkpList = spkpList;
		this.paperW = paperW;
		this.paperH = paperH;
	}

	// 实现java.awt.print.Printable接口的打印方法

	// pageIndex:打印的当前页,此参数是系统自动维护的,不需要手动维护,系统会自动递增

	@Override
	public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
			throws PrinterException {
		
		//转换成Graphics2D
		Graphics2D g2 = (Graphics2D) graphics;

		//设置打印颜色为黑色
		
		g2.setColor(Color.black);
		
		// 此处的paperW和paperH是从目标打印机的进纸规格中获取的,实际针式打印机的可打印区域是有限的,

		// 距纸张的上下左右1inch(英寸)的中间的距形框为实际可打印区域,超出范围的内容将不会打印出来(没有设置偏移的情况)

		// 如果设置偏移量,那么超出的范围也是可以打印的,这里的pageW和pageH我是直接获取打印机的进纸规格的宽和高

		// 也可以手动指定,从是如果手动指定的宽高和目标打印机的进纸规格相差较大,将会默认以A4纸为打印模版

		
		if (spkpList.size() <= pageIndex){
			// 退出打印
			return Printable.NO_SUCH_PAGE;
		}
		
		List<SysOrderPrintEntityDto> spkps = spkpList.get(pageIndex);
		
		// 设置打印的字体
		Font font = null;
		
		for(int i =0;i<spkps.size();i++){
			
			font = new Font(spkps.get(i).getOrderPrintFamily(),Font.PLAIN,spkps.get(i).getOrderPrintSize());
			//判断是否为粗休
			
			if (spkps.get(i).getIsBold()) {
				font = new Font(spkps.get(i).getOrderPrintFamily(), Font.BOLD,
						spkps.get(i).getOrderPrintSize());
			} 
			
			g2.setFont(font);
			g2.drawString(spkps.get(i).getOrderPrintValue(), spkps.get(i).getOrderPrintX(), spkps.get(i).getOrderPrintY());
		}
		
		return PAGE_EXISTS;
	}
	
	public void starPrint() {

		try {

			PrinterJob prnJob = PrinterJob.getPrinterJob();
			PageFormat pageFormat = new PageFormat();
			pageFormat.setOrientation(PageFormat.PORTRAIT);
			Paper paper = new Paper();
		    paper.setSize(paperW, paperH);
		    paper.setImageableArea(0, 0, paperW, paperH);
			pageFormat.setPaper(paper);
			prnJob.setPrintable(this, pageFormat);

			// 弹出打印对话框,也可以选择不弹出打印提示框,直接打印

			// 获取所连接的目标打印机的进纸规格的宽度,单位:1/72(inch)

			//paperW = prnJob.getPageFormat(null).getPaper().getWidth();

			// 获取所连接的目标打印机的进纸规格的宽度,单位:1/72(inch)

			//paperH = prnJob.getPageFormat(null).getPaper().getHeight();

			//prnJob.print();// 启动打印工作
			
			PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
			
			attributes.add(new MediaPrintableArea(0f, 0f, (float) (217 / 25.4),
				(float) (139 / 25.4), MediaPrintableArea.INCH));
			
			prnJob.print(attributes);

		} catch (PrinterException ex) {

			ex.printStackTrace();

			System.err.println("打印错误:" + ex.toString());

		}

	};;

}

5.打印工具类辅助实体类

package com.healthyhome.destop.sys.dto;

public class SysOrderPrintEntityDto {
	
	public String OrderPrintName; // 快递单信息名称
	public String OrderPrintValue; // 快递单信息值
	public float OrderPrintX; // X坐标
	public float OrderPrintY; // Y坐标
	public String OrderPrintFamily="宋体";  //字体 
	public int OrderPrintSize=11;   //字体 大小
	public boolean isBold=false;  //是否为粗体
	
	public String getOrderPrintName() {
		return OrderPrintName;
	}
	
	
	public boolean getIsBold() {
		return isBold;
	}


	public void setIsBold(boolean isBold) {
		this.isBold = isBold;
	}
	public void setOrderPrintName(String orderPrintName) {
		OrderPrintName = orderPrintName;
	}
	public String getOrderPrintValue() {
		return OrderPrintValue;
	}
	public void setOrderPrintValue(String orderPrintValue) {
		OrderPrintValue = orderPrintValue;
	}
	public float getOrderPrintX() {
		return OrderPrintX;
	}
	public void setOrderPrintX(float orderPrintX) {
		OrderPrintX = orderPrintX;
	}
	public float getOrderPrintY() {
		return OrderPrintY;
	}
	public void setOrderPrintY(float orderPrintY) {
		OrderPrintY = orderPrintY;
	}
	public String getOrderPrintFamily() {
		return OrderPrintFamily;
	}
	public void setOrderPrintFamily(String orderPrintFamily) {
		OrderPrintFamily = orderPrintFamily;
	}
	public int getOrderPrintSize() {
		return OrderPrintSize;
	}
	public void setOrderPrintSize(int orderPrintSize) {
		OrderPrintSize = orderPrintSize;
	}
	
}

把全部的内容封装到实体中去,以供打印


6.调用工具类

EpPrintUtil ep = new EpPrintUtil(辅助实体类,快递单宽度,快递单长度(841.6062992125984));

ep.startPrint();



====================================完成==========================================


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值