java打印,
分享于 点击 47252 次 点评:129
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.60629921259843.获取转换高度,再根据宅急送进行绘制坐标(这一步方便你在快递单在定位坐标)--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();
====================================完成==========================================
相关文章
- 暂无相关文章
用户点评