原文链接 http://blog.csdn.net/daixinmei/article/details/21173703
package com.lvkang.myfood.printer;
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.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashAttributeSet;
import javax.print.attribute.standard.PrinterName;
import com.lvkang.myfood.jdbc.JDBCService;
import com.lvkang.myfood.json.OrderFood;
import com.lvkang.myfood.servlet.Print;
public class Printer implements Printable {
/**
* * @param Graphic指明打印的图形环境 * @param
* PageFormat指明打印页格式(页面大小以点为计量单位,1点为1英寸的1/72,1英寸为25.4毫米。A4纸大致为595×842点) * @param
* pageIndex指明页号
**/
int line = 0;
long SN;
String date;
int todaySN;
int tableID;
String Remarks;
Float price = 0f;
int page = -1;
List<OrderFood> orderFoods;
int startY = 0;
final int divide = 10;
public Printer(String orderName, int orderTableID, String orderRemarks,
List<OrderFood> orderFoods) throws ClassNotFoundException,
SQLException {
price = 0f;
startY = (int) (-10f * (orderFoods.size() - 1) - 100);// 调整输出文档上方空白
this.tableID = orderTableID;
this.Remarks = orderRemarks;
this.orderFoods = orderFoods;
Connection connection = JDBCService.getConn();
todaySN = JDBCService.getTodayNum(connection);
Date today = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
date = df.format(today);
String orderDateTimeString = date.substring(0, 10);
String orderDateTimeLongString = "";
String[] strings = orderDateTimeString.split("-");
for (int i = 0; i < strings.length; i++) {
orderDateTimeLongString += strings[i];
}
String orderIDString = Long.parseLong(orderDateTimeLongString )*10000+ todaySN+"";
SN = Long.parseLong(orderIDString);
connection.close();
}
public int print(Graphics gra, PageFormat pf, int pageIndex)
throws PrinterException {
page++;
price = 0f;
Graphics2D graphics2d = (Graphics2D) gra;
// 设置打印颜色为黑色
graphics2d.setColor(Color.black);
graphics2d.setFont(new Font("Arial", Font.BOLD, 16));
print(graphics2d, "MyFood", 30);
line++;
graphics2d.setFont(new Font("宋体", Font.PLAIN, 9));
println(graphics2d, "售单号:" + SN);
println(graphics2d, "时间:" + date);
println(graphics2d, "您是今天的第:" +todaySN+" 位顾客");
println(graphics2d, "餐桌号:" + tableID);
int length=Remarks.length();
if(length<12){
print(graphics2d,Remarks,21);
length=0;
}
if(length>=14){
String firstLine=Remarks.substring(0,14);
print(graphics2d,firstLine,21);
length-=14;
}
println(graphics2d, "备注:");
while(length>=16){
println(graphics2d,Remarks.substring(Remarks.length()-length,Remarks.length()-length+16));
length-=16;
}
if(length>0){
println(graphics2d,Remarks.substring(Remarks.length()-length));
length=0;
}
println(graphics2d, "*****************************");
print(graphics2d, "品名", 0);
print(graphics2d, "单价", 45);
print(graphics2d, "数量", 74);
print(graphics2d, "售价", 110);
line++;
try {
Connection connection = JDBCService.getConn();
for (int i = 0; i < orderFoods.size(); i++) {
int orderFoodID = orderFoods.get(i).getOrderFoodId();
String foodName = JDBCService.getFoodName(connection,
orderFoodID);
float foodUnitPrice = JDBCService.getFoodUnitPrice(connection,
orderFoodID);
int orderFoodNum = orderFoods.get(i).getOrderFoodNum();
float foodPrice = foodUnitPrice * orderFoodNum;
price += foodPrice;
print(graphics2d, foodName, 0);
print(graphics2d, foodUnitPrice + "", 45);
print(graphics2d, orderFoodNum + "", 74);
print(graphics2d, foodPrice + "", 110);
line++;
}
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
println(graphics2d, "总价:" + price);
println(graphics2d, "*****************************");
println(graphics2d, " 欢迎再次光临");
return page;
}
public void println(Graphics2D graphics2D, String str) {
this.println(graphics2D, str, 0);
}
public void println(Graphics2D graphics2D, String str, int x) {
graphics2D.drawString(str, (float) x, (float) startY + (float) divide
* line);
this.line++;
}
public void print(Graphics2D graphics2D, String str, int x) {
graphics2D.drawString(str, (float) x, (float) startY + (float) divide
* line);
}
public void PrintLabel(String PrintQ) {
// ReadData();
// 通俗理解就是书、文档
Book book = new Book();
// 设置成竖打
PageFormat pf = new PageFormat();
pf.setOrientation(PageFormat.PORTRAIT); // LANDSCAPE表示竖打;PORTRAIT表示横打;REVERSE_LANDSCAPE表示打印空白
// 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。
Paper p = new Paper();
p.setSize(130, 6000); // Warranty Paper Size,A4 590, 840
p.setImageableArea(0, 0, 164, 6000); // Print Area
pf.setPaper(p);
// 把 PageFormat 和 Printable 添加到书中,组成一个页面
book.append(this, pf, 1);
// book.append(this, pf, this.getPageNum());
String printerName = PrintQ;
HashAttributeSet hs = new HashAttributeSet();
hs.add(new PrinterName(printerName, null));
// 获取打印服务对象
PrintService[] printService = PrintServiceLookup.lookupPrintServices(
null, hs);
PrinterJob job = PrinterJob.getPrinterJob();
try {
if (printService.length > 0) {
job.setPrintService(printService[0]);
}
// 设置打印类
job.setPageable(book);
// Print
job.print();
} catch (PrinterException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// new PrintTest(orderName, orderTableID, orderRemarks,
// orderFoods).PrintLabel("null");
}
}
主要要修改的方法是 public int print(Graphics gra, PageFormat pf, int pageIndex),在里面实现 graphics2D.drawString()方法就行啦