簡單介紹運行環境:
語言:Java
工具:eclipse
系統:Windows7
(打印設備暫時沒有,所以只能提供預覽圖)
最近,項目需要為商城做一個購物小票的打印功能,日常我們去超市買東西,結賬的時候收銀員都會打印一個小票,一般的商城也都需要這樣的一個小功能,本文給出的demo 是在58mm 的熱敏打印機下的例子,如果是其他紙張類型的打印機,調整紙張寬度即可。
package test;import java.awt.*;import java.awt.print.*;/** * 打印機測試類(58mm) * 1、目標打印機必須設置為默認打印機* 2、打印頁面的寬度和具體的打印機有關,一般為打印紙的寬度,需要配置成系統參數* 3、一個漢字的寬度大概是12點*/public class PrintTest {public static void main(String[] args){if(PrinterJob.lookupPrintServices().length>0){/* 打印格式*/PageFormat pageFormat = new PageFormat();//設置打印起點從左上角開始,從左到右,從上到下打印pageFormat.setOrientation(PageFormat.PORTRAIT);/* 打印頁面格式設置*/Paper paper = new Paper();//設置打印寬度(固定,和具體的打印機有關)和高度(跟實際打印內容的多少有關)paper.setSize(140, 450);//設置打印區域打印起點坐標、打印的寬度和高度paper.setImageableArea(0, 0, 135, 450);pageFormat.setPaper(paper);//創建打印文檔Book book = new Book();book.append(new Printable() {@Override public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {if(pageIndex>0){return NO_SUCH_PAGE;}Graphics2D graphics2D = (Graphics2D) graphics;Font font = new Font("宋體", Font.PLAIN, 5);graphics2D.setFont(font);drawString(graphics2D, "//////////////////////////////", 10, 17, 119, 8);font = new Font("宋體", Font.PLAIN, 7);graphics2D.setFont(font);int yIndex = 30;int lineHeight = 10;int lineWidth = 120;Color defaultColor = graphics2D.getColor();Color grey = new Color(145, 145, 145);//收貨信息yIndex = drawString(graphics2D, "收貨人:路人甲", 10, yIndex, lineWidth, lineHeight);yIndex = drawString(graphics2D, "收貨地址:北京市海淀區上地十街10號百度大廈", 10, yIndex + lineHeight, lineWidth, lineHeight);//收貨信息邊框Stroke stroke = new BasicStroke(0.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,0,new float[]{4, 4},0);graphics2D.setStroke(stroke);graphics2D.drawRect(5, 10, 129, yIndex);//藥店名稱lineWidth = 129;lineHeight = 8;graphics2D.setFont(new Font("宋體", Font.BOLD, 8));graphics2D.setColor(defaultColor);yIndex = drawString(graphics2D, "北京藥店零售小票", 5, yIndex + lineHeight + 20, lineWidth, 12);graphics2D.setFont(new Font("宋體", Font.PLAIN, 6));graphics2D.setColor(grey);yIndex = drawString(graphics2D, "操作員:小清新", 5, yIndex + lineHeight + 2, lineWidth, lineHeight);yIndex = drawString(graphics2D, "日期:2017-01-05", 5 + lineWidth/2, yIndex, lineWidth, lineHeight);yIndex = drawString(graphics2D, "品名", 5, yIndex + lineHeight * 2 - 5, lineWidth, lineHeight);yIndex = drawString(graphics2D, "規格", (lineWidth/10)*4, yIndex, lineWidth, lineHeight);yIndex = drawString(graphics2D, "單價", (lineWidth/10)*8, yIndex, lineWidth, lineHeight);yIndex = drawString(graphics2D, "數量", (lineWidth/10)*10, yIndex, lineWidth, lineHeight);for (int i=0; i<5; i++){graphics2D.setFont(new Font("宋體", Font.PLAIN, 7));yIndex = drawString(graphics2D, "E複合維生素B片100片E複合維生素B片100片", 5, yIndex + 15, (lineWidth/10)*7, 10);graphics2D.setFont(new Font("宋體", Font.PLAIN, 6));graphics2D.setColor(grey);yIndex = drawString(graphics2D, "100片/盒", 5, yIndex + 11, lineWidth, lineHeight);yIndex = drawString(graphics2D, "14.50", (lineWidth/10)*8, yIndex, lineWidth, lineHeight);yIndex = drawString(graphics2D, "2", (lineWidth/10)*10, yIndex, lineWidth, lineHeight);graphics2D.setFont(new Font("宋體", Font.PLAIN, 7));yIndex = yIndex + 2;graphics2D.drawLine(5, yIndex, 5 + lineWidth, yIndex);}graphics2D.setColor(defaultColor);yIndex = drawString(graphics2D, "會員名稱:小清新", 5, yIndex + lineHeight * 2, lineWidth, lineHeight);yIndex = drawString(graphics2D, "總數:6", 5, yIndex + lineHeight, lineWidth, lineHeight);yIndex = drawString(graphics2D, "總計:55.30", 5, yIndex + lineHeight, lineWidth, lineHeight);yIndex = drawString(graphics2D, "收款:100.00", 5, yIndex + lineHeight, lineWidth, lineHeight);yIndex = drawString(graphics2D, "找零:44.70", 5, yIndex + lineHeight, lineWidth, lineHeight);graphics2D.setFont(new Font("宋體", Font.PLAIN, 6));graphics2D.setColor(grey);yIndex = drawString(graphics2D, "電話:020-123456", 5, yIndex + lineHeight * 2, lineWidth, lineHeight);yIndex = drawString(graphics2D, "地址:北京市海淀區上地十街10號百度大廈", 5, yIndex + lineHeight, lineWidth, lineHeight);yIndex = yIndex + 20;graphics2D.drawLine(0, yIndex, 140, yIndex);return PAGE_EXISTS;}}, pageFormat);//獲取默認打印機PrinterJob printerJob = PrinterJob.getPrinterJob();printerJob.setPageable(book);try {printerJob.print();}catch (PrinterException e) {e.printStackTrace();System.out.println("打印異常");}} else{System.out.println("沒法發現打印機服務");}}/** * 字符串輸出* @param graphics2D 畫筆* @param text 打印文本* @param x 打印起點x 坐標* @param y 打印起點y 坐標* @param lineWidth 行寬* @param lineHeight 行高* @return 返回終點y 坐標*/private static int drawString(Graphics2D graphics2D, String text, int x, int y, int lineWidth, int lineHeight){FontMetrics fontMetrics = graphics2D.getFontMetrics();if(fontMetrics.stringWidth(text)<lineWidth){graphics2D.drawString(text, x, y);return y;} else{char[] chars = text.toCharArray();int charsWidth = 0;StringBuffer sb = new StringBuffer();for (int i=0; i<chars.length; i++){if((charsWidth + fontMetrics.charWidth(chars[i]))>lineWidth){graphics2D.drawString(sb.toString(), x, y);sb.setLength(0);y = y + lineHeight;charsWidth = fontMetrics.charWidth(chars[i]);sb.append(chars[i]);} else{charsWidth = charsWidth + fontMetrics.charWidth(chars[i]);sb.append(chars[i]);}}if(sb.length()>0){graphics2D.drawString(sb.toString(), x, y);y = y + lineHeight;}return y - lineHeight;}}}運行結果:
效果預覽:
總結
簡單說就是編寫一段Java程序,將輸出結果另存為“*.xps ”格式文件,由打印機輸出,非常簡單。希望對大家有所幫助。如有問題歡迎留言指出。感謝朋友們對本站的支持。