java 打印 类似打印存折的打印



java 打印 类似打印存折的打印

前段时间由于需要做了个打印,主要是打印学生证。

需求很简单,就是在规定的坐标点打印规定的内容即可。

为了实现,却费尽了周折,不过还好,在大家的帮助下,终于实现了最终想要的功能。

其代码如下:
package yourPackage;

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

import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashAttributeSet;
import javax.print.attribute.standard.PrinterName;

/**
* 打印服务程序
* @author Administrator
*
*/
@SuppressWarnings(“unchecked”)
public class PrintServiceTest implements Printable {

private String printInfo; // 打印内容
private int rowSpace; // 打印行距
private int rowNum = 0; // 打印行数 从0开始算起
private int[] regNums ; // 注册序号的集合,得到他就可以算出要打多少行,和每行Y轴的坐标
/**
* 下面的数组中封装的是数组对象,数组对象中封装了三个子对象,一个被打印的内容
* 一个是被打印内容的X坐标,最后一个是被打印内容的Y坐标,注意坐标的单位是 像素(点)
* 一点 = 1/72英寸, 一英寸 = 25.4mm
*/
private List infoList;
private int printNum ; // 打印份数 从0开始算起

public int[] getRegNums() {
return regNums;
}

public List getInfoList() {
return infoList;
}
public void setInfoList(List infoList) {
this.infoList = infoList;
}
public void setRegNums(int[] regNums) {
this.regNums = regNums;
}
public int getPrintNum() {
return printNum;
}
public void setPrintNum(int printNum) {
this.printNum = printNum;
}
public int getRowSpace() {
return rowSpace;
}
public void setRowSpace(int rowSpace) {
this.rowSpace = rowSpace;
}
public String getPrintInfo() {
return printInfo;
}
public void setPrintInfo(String printInfo) {
this.printInfo = printInfo;
}
public int getRowNum() {
return rowNum;
}
public void setRowNum(int rowNum) {
this.rowNum = rowNum;
}
/**
* 只是打印写死的内容,但也可以根据上面的infoList来组织多条内容。
* 注意:此方法并没有把多余一页的打印情况考虑进去,即每个打印都会在一页中。
*/
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {

// 打印规定的份数
if(this.getPrintNum()!=0) {
// pageIndex 的值是从零开始的
if(pageIndex>(this.getPrintNum()-1)) {
return Printable.NO_SUCH_PAGE;
}
} else {
// pageIndex 的值是从0开始的,下面已经设置了打印一份,打印完一份时pageIndex就增1,所以当大于0后,即第一份已经完成
if(pageIndex>0) {
return Printable.NO_SUCH_PAGE;
}
}

Graphics2D g2 = (Graphics2D) graphics;

// g2.setPaint(Color.black); // 设置颜色
g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());

Font font = new Font(“宋体”, Font.BOLD, 11);
g2.setFont(font);

g2.drawString(“—————–测试打印坐标为:X=50,Y=50———”, 50, 10);
g2.drawString(“要打印的第一行”, 0, 20);

return Printable.PAGE_EXISTS; // 只有存在此页的时候,才会执行打印的方法
}
/**
* 打印方法
*/
public void print() throws PrinterException{

PrinterJob printerJob = PrinterJob.getPrinterJob();


Book book = new Book();

PageFormat pf = printerJob.defaultPage(); // 得到printerJob 的默认页面格式。

Paper p = pf.getPaper();// 得到默认页

// System.out.println(“页面的 宽度”+p.getWidth()+”;页面的高度:”+p.getHeight());

/*
* 要注意的是:下面的设置是去掉了页边距的设置,如果不考虑页边距的影响,可以不做此操作。
*/
p.setImageableArea(0, 0, p.getImageableWidth()+70, p.getImageableWidth()+70);

// System.out.println(“可成像的宽度”+p.getImageableWidth()+”;可成像的高度:”+p.getImageableHeight());

pf.setPaper(p);

// book.append(this, pf);
//
// printerJob.setPageable(book);

// 查找此环境的默认printservice
PrintService ps = PrintServiceLookup.lookupDefaultPrintService();

if (ps == null) {

System.out.println(“无法找到打印机:”);

return;
}
printerJob.setPrintService(ps);

// printerJob.pageDialog(pf); // 设置打印页的属性
// printerJob.printDialog(); // 设置打印机的属性

printerJob.setCopies(1); // 只打印一份
printerJob.setPrintable(this,pf);
printerJob.print();
}

public static void main(String[] args) {
PrintServiceTest myprinttest = new PrintServiceTest();
try {
myprinttest.print();
} catch (PrinterException e) {
e.printStackTrace();
}
}

/**
* 毫米转换为点数 (取整)
* @param mm 毫米数
* @return 点数
*/
public static int returnPointNo(int mm)
{
return 72*mm/25 ;
}
}

上面的被注释掉的部分,可以释放开,以查看效果,此代码用到的服务器上默认的打印机,当然也可以根据需求来使用指定名称的打印机。