转载于:http://blog.sina.com.cn/s/blog_8f54b9f901014fl9.html
在项目中,经常有可能需要通过针式打印机打印一些票据,如快递单,发票等...
之前在做JAVA打印时,也在网上找了好多资料,网上资料太多,讲的也不够详细,走了不少弯路,在做这个之前,连针式打印机都很少接触。。。,不多说了,言归正传吧
1、在编写代码之前,最好测试一下在你本机是否可以连接到打印机,正常打印,如果你本机都无法打印,也就不要指望程序可以打印了。
2、本机可以连接到打印机并可以打印后,就可以开始写代码了,首先写一个最简单的程序,打印一句最简单的话,代码如下:
package com.gotomycloud.print;
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;
public class Print 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 (pageIndex >= pageSize)
//退出打印
return Printable.NO_SUCH_PAGE;
else {
Graphics2D g2 = (Graphics2D) graphics;
g2.setColor(Color.BLUE);
Paper p = new Paper();
//此处的paperW和paperH是从目标打印机的进纸规格中获取的,实际针式打印机的可打印区域是有限的,
//距纸张的上下左右1inch(英寸)的中间的距形框为实际可打印区域,超出范围的内容将不会打印出来(没有设置偏移的情况)
//如果设置偏移量,那么超出的范围也是可以打印的,这里的pageW和pageH我是直接获取打印机的进纸规格的宽和高
//也可以手动指定,从是如果手动指定的宽高和目标打印机的进纸规格相差较大,将会默认以A4纸为打印模版
p.setImageableArea(0, 0, paperW, paperH);// 设置可打印区域
p.setSize(paperW,paperH);// 设置纸张的大小
pageFormat.setPaper(p);
drawCurrentPageText(g2, pageFormat);//调用打印内容的方法
return PAGE_EXISTS;
}
}
// 打印内容
private void drawCurrentPageText(Graphics2D g2, PageFormat pf) {
Font font = null;
//设置打印的字体
font = new Font("新宋体", Font.BOLD, 11);
g2.setFont(font);// 设置字体
//此处打印一句话,打印开始位置是(200,200),表示从pf.getPaper()中座标为(200,200)开始打印
//此处200的单位是1/72(inch),inch:英寸,所以这里的长度,在测量后需要进行转换
g2.drawString("打印测试打印测试打印测试打印测试打印测试打印测试打印测试打印测试打印测试打印测试打印测试",200,200);
}
//连接打印机,弹出打印对话框
public void starPrint() {
try {
PrinterJob prnJob = PrinterJob.getPrinterJob();
PageFormat pageFormat = new PageFormat();
pageFormat.setOrientation(PageFormat.PORTRAIT);
prnJob.setPrintable(this);
//弹出打印对话框,也可以选择不弹出打印提示框,直接打印
if (!prnJob.printDialog())
return;
//获取所连接的目标打印机的进纸规格的宽度,单位:1/72(inch)
paperW=prnJob.getPageFormat(null).getPaper().getWidth();
//获取所连接的目标打印机的进纸规格的宽度,单位:1/72(inch)
paperH=prnJob.getPageFormat(null).getPaper().getHeight();
//System.out.println("paperW:"+paperW+";paperH:"+paperH);
prnJob.print();//启动打印工作
} catch (PrinterException ex) {
ex.printStackTrace();
System.err.println("打印错误:" + ex.toString());
}
}
//入口方法
public static void main(String[] args) {
Print pm = new Print();// 实例化打印类
pm.pageSize = 2;//打印两页
pm.starPrint();
}
}
在打印过程中,很可能代码正确,但是打印时,纸上确没打印上,原因很可能是纸张放的位置有偏差,所以打印测试时,可以让测试打印的打印内容多一点,只要能打印出内容就可以了
3、如果可以打印出内容,哪怕是一条线,那么第一步就算好了。下面就是控制打印位置了,打印的位置在纸张上是有一个最左上角点的(0,0),下图是一张类似的快递单打印纸,图上标有打印的起始位置、可打印区域等,可供参考,如下图所示
[img]http://dl.iteye.com/upload/attachment/0071/5865/1addace8-06c4-3e08-9cb2-9dc6b1868a59.jpg[/img]
知道了打印位置的规律,就可以通过测试来设置内容的打印位置了。
4、上面讲的是单张打印,但很多时间需要批量打印,这样可以减少很多重复的工作,如果单张打印可以了,那多张打印也比较简单,首先要设置进纸规格,和偏移量,如果是共享的网络打印机,那么两边都需要设置,最后就是要在代码中设置打印区域和纸张大小了,关键部分代码上面已提到,可参考!
在项目中,经常有可能需要通过针式打印机打印一些票据,如快递单,发票等...
之前在做JAVA打印时,也在网上找了好多资料,网上资料太多,讲的也不够详细,走了不少弯路,在做这个之前,连针式打印机都很少接触。。。,不多说了,言归正传吧
1、在编写代码之前,最好测试一下在你本机是否可以连接到打印机,正常打印,如果你本机都无法打印,也就不要指望程序可以打印了。
2、本机可以连接到打印机并可以打印后,就可以开始写代码了,首先写一个最简单的程序,打印一句最简单的话,代码如下:
package com.gotomycloud.print;
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;
public class Print 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 (pageIndex >= pageSize)
//退出打印
return Printable.NO_SUCH_PAGE;
else {
Graphics2D g2 = (Graphics2D) graphics;
g2.setColor(Color.BLUE);
Paper p = new Paper();
//此处的paperW和paperH是从目标打印机的进纸规格中获取的,实际针式打印机的可打印区域是有限的,
//距纸张的上下左右1inch(英寸)的中间的距形框为实际可打印区域,超出范围的内容将不会打印出来(没有设置偏移的情况)
//如果设置偏移量,那么超出的范围也是可以打印的,这里的pageW和pageH我是直接获取打印机的进纸规格的宽和高
//也可以手动指定,从是如果手动指定的宽高和目标打印机的进纸规格相差较大,将会默认以A4纸为打印模版
p.setImageableArea(0, 0, paperW, paperH);// 设置可打印区域
p.setSize(paperW,paperH);// 设置纸张的大小
pageFormat.setPaper(p);
drawCurrentPageText(g2, pageFormat);//调用打印内容的方法
return PAGE_EXISTS;
}
}
// 打印内容
private void drawCurrentPageText(Graphics2D g2, PageFormat pf) {
Font font = null;
//设置打印的字体
font = new Font("新宋体", Font.BOLD, 11);
g2.setFont(font);// 设置字体
//此处打印一句话,打印开始位置是(200,200),表示从pf.getPaper()中座标为(200,200)开始打印
//此处200的单位是1/72(inch),inch:英寸,所以这里的长度,在测量后需要进行转换
g2.drawString("打印测试打印测试打印测试打印测试打印测试打印测试打印测试打印测试打印测试打印测试打印测试",200,200);
}
//连接打印机,弹出打印对话框
public void starPrint() {
try {
PrinterJob prnJob = PrinterJob.getPrinterJob();
PageFormat pageFormat = new PageFormat();
pageFormat.setOrientation(PageFormat.PORTRAIT);
prnJob.setPrintable(this);
//弹出打印对话框,也可以选择不弹出打印提示框,直接打印
if (!prnJob.printDialog())
return;
//获取所连接的目标打印机的进纸规格的宽度,单位:1/72(inch)
paperW=prnJob.getPageFormat(null).getPaper().getWidth();
//获取所连接的目标打印机的进纸规格的宽度,单位:1/72(inch)
paperH=prnJob.getPageFormat(null).getPaper().getHeight();
//System.out.println("paperW:"+paperW+";paperH:"+paperH);
prnJob.print();//启动打印工作
} catch (PrinterException ex) {
ex.printStackTrace();
System.err.println("打印错误:" + ex.toString());
}
}
//入口方法
public static void main(String[] args) {
Print pm = new Print();// 实例化打印类
pm.pageSize = 2;//打印两页
pm.starPrint();
}
}
在打印过程中,很可能代码正确,但是打印时,纸上确没打印上,原因很可能是纸张放的位置有偏差,所以打印测试时,可以让测试打印的打印内容多一点,只要能打印出内容就可以了
3、如果可以打印出内容,哪怕是一条线,那么第一步就算好了。下面就是控制打印位置了,打印的位置在纸张上是有一个最左上角点的(0,0),下图是一张类似的快递单打印纸,图上标有打印的起始位置、可打印区域等,可供参考,如下图所示
[img]http://dl.iteye.com/upload/attachment/0071/5865/1addace8-06c4-3e08-9cb2-9dc6b1868a59.jpg[/img]
知道了打印位置的规律,就可以通过测试来设置内容的打印位置了。
4、上面讲的是单张打印,但很多时间需要批量打印,这样可以减少很多重复的工作,如果单张打印可以了,那多张打印也比较简单,首先要设置进纸规格,和偏移量,如果是共享的网络打印机,那么两边都需要设置,最后就是要在代码中设置打印区域和纸张大小了,关键部分代码上面已提到,可参考!