package com.ltkj.web.controller.print;
|
|
import java.awt.*;
|
import java.awt.print.*;
|
|
/**
|
* @Company: 西安路泰科技有限公司
|
* @Author: lige
|
* @Date: 2023/4/25 10:38
|
*/
|
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;
|
}
|
}
|
}
|