package test;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Stroke;
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.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import vo.OrderVo;
import vo.ProductVo;
/**
* 打印机测试类(58mm)
* 1、目标打印机必须设置为默认打印机
* 2、打印页面的宽度和具体的打印机有关,一般为打印纸的宽度,需要配置成系统参数
* 3、一个汉字的宽度大概是12点
*/
public class PrintTest {
protected static final String DIAN_MING = "伊晨Bayby童装工厂";
protected static final String SHOU_HUO_REN = "大飞家";
protected static final String SHOU_HUO_REN_BEI_ZHU = "无";
protected static final String MAIJIA_DIZHI = "A区三街01114号";
protected static final String MAIJIA_DH = "18660665245";
protected static final String MAIJIA_WX = "yichenbaby0";
public static void main(String[] args) {
OrderVo orderVo = new OrderVo();
orderVo.setBuyer("大飞家");
orderVo.setRemark("无");
orderVo.setSeller(DIAN_MING);
orderVo.setAddress(MAIJIA_DIZHI);
orderVo.setIphone(MAIJIA_DH);
orderVo.setWxno(MAIJIA_WX);
// orderVo.setTotalMoney(0);
List<ProductVo> products = new ArrayList<ProductVo>();
ProductVo productVo = new ProductVo();
productVo.setName("忍者短袖(红)");
productVo.setPrice(26.00);
productVo.setAmount(8);
productVo.setSize("100M");
ProductVo productVo2 = new ProductVo();
productVo2.setName("忍者短袖(蓝)");
productVo2.setPrice(26.00);
productVo2.setAmount(4);
productVo2.setSize("103M");
products.add(productVo);
products.add(productVo2);
new PrintTest().printDefault(orderVo, products);
}
private void printDefault(final OrderVo orderVo, final List<ProductVo> products ) {
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);
// 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,
// "发件人:"+DIAN_MING+"(微信:yichenbaby0)", 10, yIndex,
// lineWidth, lineHeight);
yIndex = drawString(graphics2D, "收货人:" + orderVo.getBuyer(), 10,
yIndex, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "收货人备注信息:"
+ orderVo.getRemark(), 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, DIAN_MING, 5, yIndex
+ lineHeight + 20, lineWidth, 12);
graphics2D.setFont(new Font("宋体", Font.PLAIN, 6));
graphics2D.setColor(grey);
// yIndex = drawString(graphics2D, "操作员:金豆 "
// + getCurrDate(), 5, yIndex + lineHeight + 2,
// lineWidth, lineHeight);
yIndex = drawString(graphics2D, "时间:"
+ getCurrDate(), 5, yIndex + lineHeight + 2,
lineWidth, lineHeight);
// yIndex = drawString(graphics2D, "日期:"+getCurrDate(), 5 +
// lineWidth/2, yIndex, lineWidth, lineHeight);
// yIndex = drawString(graphics2D, "日期:"+getCurrDate(), 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);
//总合计价格
int total = 0;
double totalPrice = 0;
for (ProductVo productVo : products) {
graphics2D.setFont(new Font("宋体", Font.PLAIN, 7));
//商品名称
yIndex = drawString(graphics2D, productVo.getName(), 5,
yIndex + 15, (lineWidth / 10) * 7, 10);
graphics2D.setFont(new Font("宋体", Font.PLAIN, 6));
graphics2D.setColor(grey);
// yIndex = drawString(graphics2D, "尺码:" + "100M", 5,
// yIndex + 11, lineWidth, lineHeight);// 尺码
//单价
yIndex = drawString(graphics2D, productVo.getPrice()+"",
(lineWidth / 10) * 8, yIndex, lineWidth,
lineHeight);
//数量
yIndex = drawString(graphics2D, productVo.getAmount()+"",
(lineWidth / 10) * 10, yIndex, lineWidth,
lineHeight);
graphics2D.setFont(new Font("宋体", Font.PLAIN, 7));
yIndex = yIndex + 2;
graphics2D.drawLine(5, yIndex, 5 + lineWidth, yIndex);
total=total+productVo.getAmount();
totalPrice=totalPrice+(productVo.getPrice()*productVo.getAmount());
}
graphics2D.setColor(defaultColor);
// yIndex = drawString(graphics2D, "会员名称:小清新", 5, yIndex +
// lineHeight * 2, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "总 数:"+total, 5, yIndex
+ lineHeight, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "总 计:"+totalPrice, 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, "微信:"+orderVo.getWxno(), 5, yIndex
// + lineHeight * 2, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "微信:"+MAIJIA_WX, 5, yIndex
+ lineHeight * 2, lineWidth, lineHeight);
// yIndex = drawString(graphics2D, "地址:" + orderVo.getAddress(), 5,
// yIndex + lineHeight, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "地址:" + MAIJIA_DIZHI, 5,
yIndex + lineHeight, lineWidth, lineHeight);
yIndex = yIndex + 20;
graphics2D.drawLine(0, yIndex, 140, yIndex);
return PAGE_EXISTS;
}
private String getCurrDate() {
Date currDate = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
return sdf.format(currDate);
}
}, 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调用热敏打印机”。在Java中,通常需要使用JNI(Java Native Interface)或者JNA(Java Native Access)来调用底层C/C++库,因为Java本身并不直接支持硬件级别的操作。对于热敏打印机,可能...
本文将深入探讨如何使用Java编程语言来控制爱普生品牌的热敏打印机,通过实例代码来阐述相关知识。 首先,我们需要了解Java与硬件交互的基础。Java本身并不直接支持硬件I/O操作,但可以通过第三方库如RXTX库来实现...
可以java直接调用 热敏打印机无驱动 打印票据socket工具类 此demo为 芯烨/xprinter 可以参考变成手册, 完成任何自己想要的小票格式
Java使用JNA调用TSCLIB来控制热敏打印机生成二维码并打印,对纸张的定位做了控制,不会出现连续打印后纸张位置错位,需要自己准备TSCLIB.dll文件,放在Windows/System32下,代码可以直接使用。
### JAVA通过网络调用网络打印机的工具类 #### 概述 在现代企业环境中,自动化流程的实现变得越来越重要。特别是在物流行业中,自动化打印发票和快递单能够大大提高工作效率,减少人为错误。本篇文章将深入探讨如何...
总的来说,JAVA连接打印机打印小票涉及到硬件交互、网络编程和可能的本地库调用。理解和掌握这些知识点,能帮助开发者灵活应对不同场景下的小票打印需求。在实践中,记得不断调试和优化,以确保打印效果和效率。
热敏打印机技术是一种广泛应用于零售、餐饮、物流等行业的打印技术。它主要依赖于热敏纸,这种纸在受热时会发生化学反应,从而形成可见的打印文本和图像。相较于传统的针式打印机,热敏打印机具有打印速度快、噪音低...
芯烨热敏打印机开发DEMO是一个专为开发者设计的工具,旨在简化热敏打印机的集成过程,特别是针对芯烨品牌的打印机。这个DEMO提供了一种直接的途径,使得开发者能够将打印机无缝接入到自己的系统中,避免了依赖第三...
热敏打印机SDK是一种软件开发工具包,专门为开发者设计,用于集成到各种平台的应用程序中,以便与热敏打印机进行通信并实现打印功能。这个SDK包含了必要的库、接口、示例代码和文档,使得开发者能够轻松地在PC、...
佳博热敏打印机PC版SDK(Software Development Kit)是一套专为开发人员设计的工具集,用于在个人计算机上创建应用程序,以便与佳博品牌的热敏打印机进行交互。SDK通常包含编程接口(API)、示例代码、文档以及必要...
JavaScript库实现的ESC/POS协议是针对热敏打印机的一种低级控制语言,广泛应用于各种商业打印场景,如收银小票、条形码、二维码等。这个库的主要目的是通过JavaScript来方便地控制热敏打印机,使得在Web应用中能够...
在IT行业中,生成一维码和二维码以及调用打印机进行打印是常见的自动化流程,尤其在物流、仓储、零售等业务场景中应用广泛。一维码(如条形码)和二维码(如QR码)作为数据载体,能快速、准确地记录和传递信息,而...
在IT行业中,热敏打印机和二维码的交互是一个常见的应用场景,特别是在零售、物流和票务等领域。本文将深入探讨“热敏打印机生成二维码”的技术细节,以及如何通过指定IP地址获取JSON数据并解析二维码。 首先,我们...
例如,在Java中,使用BluetoothSocket类创建一个连接实例,然后调用connect()方法。 4. **发送数据**:连接成功后,可以开始发送打印指令。这通常包括ASCII或二进制数据,代表要打印的文字、图像或条形码。对于热敏...
不干胶打印机往往支持热敏或热转印技术,热敏无需色带,直接通过加热打印头在热敏纸上产生图像;而热转印则需要色带,通过加热将色带上的油墨转印到纸上,耐久性更好。 在提供的"CommControl"这个文件名中,我们...
在这个案例中,"SDK开发包小票(热敏小票打印机,DEMO,文档)"是一个专门针对热敏小票打印机的开发工具包,它提供了在Windows操作系统上开发应用所需的全部资料。 标题中的“小票”指的是该SDK主要用于开发热敏小票...
在Java编程环境中,生成并打印条码是一项常见的需求,尤其在物流、仓储、零售等领域。本文将基于“Java打印条码,使用佳博条码打印机”这一主题,深入探讨相关知识点,包括条码生成库的选择、Java代码实现、以及如何...
本文将围绕“Android佳博热敏票据打印机demo”进行详细解析,帮助开发者了解如何通过Android应用实现与佳博热敏打印机的蓝牙连接,以及如何进行票据打印。 首先,该demo主要包含两个关键功能界面。一是主界面,这个...
### Java调用Dll一个例子:台半条码打印机 #### 一、项目环境搭建 在开始之前,我们需要准备一些基础的开发工具与环境。 ##### 1. 准备开发工具 本例中我们使用Java编辑器NetBeans IDE 6.8来构建这个示例程序。...
在Android平台上实现蓝牙连接ESC/POS热敏打印机的打印实例,主要涉及两大部分:蓝牙连接和ESC/POS打印指令。本文主要关注蓝牙连接部分,ESC/POS指令将在后续讲解。 首先,确保应用具备蓝牙操作的权限。在...