主要调整x,y坐标的变化来布局(记住类必须implements Printable接口)
public int print(Graphics gra, PageFormat pf, int pageIndex) throws PrinterException {
Component c = null;
// 转换成Graphics2D
Graphics2D g2 = (Graphics2D) gra;
// 设置打印颜色为黑色
g2.setColor(Color.black);
// 打印起点坐标
double x = pf.getImageableX();//返回与此 PageFormat 相关的 Paper 对象的可成像区域左上方点的 x 坐标。
double y = pf.getImageableY();
switch (pageIndex) {
case 0:
//新建一个打印字体样式(1.字体名称,2.样式(加粗).3字号)
Font font = new Font("微软雅黑", Font.PLAIN, 14);
//给g2设置字体
g2.setFont(font);
//保存虚线的参数(线长度,缺口长度)
float[] dash1 = { 2.0f,0.0f };
// 设置打印线的属性。1.线宽 2、3、不知道,4、空白的宽度,5、线,6、偏移量
g2.setStroke(new BasicStroke(0.5f, BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER, 2.0f, dash1, 0.0f));
float fontHeigth1 = font.getSize2D();
//标题
String str1 ="利息支出凭证";
g2.drawString(str1, (int)x+60, (int)y + fontHeigth1+60);
//新建一个字体样式
Font font2 = new Font("微软雅黑", Font.PLAIN, 9);
g2.setFont(font2);// 设置字体
// (刷新字体样式)设置打印线的属性。1.线宽 2、3、不知道,4、空白的宽度,5、线,6、偏移量
g2.setStroke(new BasicStroke(0.7f, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER, 2.0f, dash1, 0.0f));
float fontHeigth2 = (int)font.getSize2D();
int tempHeight = (int) (fontHeigth1*2+10);
/*
* 添加文本
* */
//创建一个文本对象
String str3 ="单据编号:201745545623266656565655454";
//添加到g2的指定位置
g2.drawString(str3, (int)x+250, (int)y + fontHeigth2+10 +tempHeight);
/*
* 画线
* */
//创建一条线对象
Line2D lin = new Line2D.Float((int)x, (int)y + fontHeigth2*3+10+8 +tempHeight, (int)x, (int)y + fontHeigth2*10+20+4 +tempHeight);
//把线添加到g2里面
g2.draw(lin);
//放置图片(二维码)
Image src = Toolkit.getDefaultToolkit().getImage("D:\\1.jpg");
//把图片添加到g2中(1,图片来源,2.x坐标,3.y坐标,4.宽,5.高)
g2.drawImage(src, (int) x+440, (int)( y + fontHeigth2 +tempHeight),50,50, c);//打印条形码
int img_Height = src.getHeight(c);
int img_width = src.getWidth(c);
return PAGE_EXISTS;
default:
return NO_SUCH_PAGE;
}
}
//测试
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(595, 842);//纸张大小
p.setImageableArea(40,10, 595,842);//A4(595 X 842)设置打印区域,其实0,0应该是72,72,因为A4纸的默认X,Y边距是72
pf.setPaper(p);
//把 PageFormat和 Printable添加到文档中,组成一个页面
book.append(new Test3(), pf);
//获取打印服务对象
PrinterJob job = PrinterJob.getPrinterJob();
// 设置打印类
job.setPageable(book);
try {
//可以用printDialog显示打印对话框,在用户确认后打印;
//不加这个可以不提示直接用job.print();函数直接打印
boolean a=job.printDialog();
if(a)
{ //打印
job.print();
}else{
//取消
job.cancel();
}
} catch (PrinterException e) {
e.printStackTrace();
}
}