package com.neusoft.print; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Area; 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.ArrayList; import java.util.Date; import javax.print.PrintService; import javax.print.PrintServiceLookup; public class StartPrintCheckOut implements Printable { public int PAGES; public String printStr = "" ; public Area area; ArrayList rslist; public int printFlag = 0 ; private double Y = 0.0 ; /* * Graphic指明打印的图形环境;PageFormat指明打印页格式(页面大小以点为计量单位, * 1点为1英才的1/72,1英寸为25.4毫米。A4纸大致为595×842点);page指明页号 */ public int print(Graphics g, PageFormat pf, int page) throws PrinterException { Graphics2D g2 = (Graphics2D) g; g2.setPaint(Color.black); // 设置打印颜色为黑色 if (page >= PAGES) // 当打印页号大于需要打印的总页数时,打印工作结束 return Printable.NO_SUCH_PAGE; g2.translate(pf.getImageableX(), pf.getImageableY());// 转换坐标,确定打印边界 drawCurrentPageText(g2, pf, page); // 打印当前页文本 return Printable.PAGE_EXISTS; // 存在打印页时,继续打印工作 } /* 打印指定页号的具体文本内容 */ private void drawCurrentPageText(Graphics2D g2, PageFormat pf, int page) { System.out.println(pf.getPaper().getHeight() + " " + pf.getPaper().getWidth()); ArrayList list = getDrawText(rslist)[page];// 获取当前页的待打印文本内容 CheckOutVo vo = (CheckOutVo) list.get(0); // 获取默认字体及相应的尺寸 Font f = new Font("新宋体", Font.PLAIN, 15); g2.setFont(f); System.out.println("Y=" + Y); g2.drawString("桌位号:" + vo.getTableid(), 25, 20); g2.drawLine(0, 25, 135, 25); System.out.println("打印区域:" + ((int) Y - 20)); Font f1 = new Font("新宋体", Font.PLAIN, 13); g2.setFont(f1); int height = 50; float sum = 0.0f; System.out.println("list_size=" + list.size()); Font f4 = new Font("新宋体", Font.PLAIN, 10); g2.setFont(f4); g2.drawString("名称", 5, height - 13); g2.drawString("单价", 40, height - 13); g2.drawString("数量", 70, height - 13); g2.drawString("金额", 100, height - 13); g2.drawLine(0, 40, 135, 40); height+=10; Font f2 = new Font("黑体", Font.PLAIN, 8); g2.setFont(f2); for (int j = 0; j < list.size(); j++) { CheckOutVo vo1 = (CheckOutVo) list.get(j); g2.drawString(vo1.getMenu_name() + "", 2, height - 5); height += 5; g2.drawString(vo1.getPrice() + "", 42, height - 1); g2.drawString(vo1.getAmount() + "", 72, height - 1); g2.drawString(vo1.getPrice_sum() + "", 102, height - 1); height += 15; System.out.println("height=" + height); sum += vo1.getPrice_sum(); } height += 15; g2.drawString(new java.text.SimpleDateFormat("yyyy-MM-dd") .format(new Date()), 5, height - 5); g2.drawString("总金额:" + sum, 66, height - 5); height += 35; g2.drawString("" + ".", 68, height - 5); //g2.drawLine((int)(90.00 + (list.size() * 35)), 35, 135, 35); //Y+=20; System.out.println("最后打印的高度 height : " + height); } /* 将打印目标文本按页存放为字符串数组 */ public ArrayList[] getDrawText(ArrayList list) { ArrayList[] mtlist = new ArrayList[PAGES]; // 根据页数初始化数组 mtlist[ 0 ] = list; return mtlist; } public void printText2Action(ArrayList list, StartPrintCheckOut sp) { printFlag = 0 ; // 打印标志清零 if (list.size() > 0 ) // 当打印内容不为空时 { this .rslist = list; System.out.println( "开始打印.............." ); System.out.println( "本次打印数为:" + list.size()); PAGES = 1 ; // 获取打印总页数 // 通俗理解就是书、文档 Book book = new Book(); // 设置成竖打 PageFormat pf = new PageFormat(); pf.setOrientation(PageFormat.PORTRAIT); // 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。 Paper p = new Paper(); Y = 90.00 + (list.size() * 35 ); p.setSize( 140.00 , Y); // 纸张大小 System.out.println( "print paper Height : " + p.getHeight()); p.setImageableArea( 0 , 10 , 140 , Y); // A4(595 X // 842)设置打印区域,其实0,0应该是72,72,因为A4纸的默认X,Y边距是72 pf.setPaper(p); // 把 PageFormat 和 Printable 添加到书中,组成一个页面 book.append(sp, pf, PAGES); CheckOutVo vo = (CheckOutVo) rslist.get( 0 ); int printid = vo.getIsprintall(); PrintService[] services = PrintServiceLookup.lookupPrintServices( null , null ); CheckOutDao dao = new CheckOutDao(); String printname = dao.selectprintname(printid); PrintService services1 = null ; System.out.println( "length:=" + services.length); for ( int i = 0 ; i < services.length; i++) { System.out.println( "name=" + services[i].getName()); if (printname.equals(services[i].getName())) { services1 = services[i]; System.out.println( "正在运行的打印机名称:" + printname); } } // 获取打印服务对象 PrinterJob job = PrinterJob.getPrinterJob(); // 设置打印类 job.setPageable(book); System.out.println( "print pf.getHeight() : " + pf.getHeight()); try { System.out.println( "service:" + services1); job.setPrintService(services1); } catch (PrinterException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { // 可以用printDialog显示打印对话框,在用户确认后打印;也可以直接打印 job.print(); } catch (PrinterException e) { e.printStackTrace(); } } else { // 如果打印内容为空时,提示用户打印将取消 // JOptionPane.showConfirmDialog(null, // "Sorry, Printer Job is Empty, Print Cancelled!", // "Empty", JOptionPane.DEFAULT_OPTION, // JOptionPane.WARNING_MESSAGE); // System.out.println("打印内容为空!"); } } } |