这里主要演示GK888CN打印机
package org.example;
import com.alibaba.excel.EasyExcel;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.springframework.util.StringUtils;
import javax.print.*;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterJob;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SimpleWindowProgram implements Printable {
private String data = "数据错误!";
private String customer = "数据错误!";
private int xL = 1;
private int yL = 1;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public BufferedImage generateQRCodeImage(String text, int width, int height)
throws WriterException, IOException {
QRCodeWriter qrCodeWriter = new QRCodeWriter();
Map<EncodeHintType, ErrorCorrectionLevel> hints = new HashMap<>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hints);
// 创建BufferedImage对象,将二维码绘制到该对象上
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ? 0x000000 : 0xFFFFFF);
}
}
return image;
}
public void mainWindow() {
String fileName = "D:/打印医院.xlsx";
ExceDataListener exceDataListener = new ExceDataListener();
EasyExcel.read(fileName, exceDataListener).sheet("Sheet1").doRead();
List<String> dataList = exceDataListener.getDataList();
// 创建一个新的JFrame实例
JFrame frame = new JFrame("标签");
// 设置窗口关闭时的操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置窗口的大小
frame.setSize(300, 200);
//添加一个文本输入框########
JTextField textField = new JTextField(20);
// 创建 JComboBox、JTextField 和 JButton
String[] options = dataList.toArray(new String[0]);
JComboBox<String> comboBox = new JComboBox<>(options);
// 创建一个新的JPanel实例
JPanel panel = new JPanel();
panel.add(comboBox);
panel.add(textField);
JTextField x = new JTextField(5);
JLabel labelX = new JLabel("x轴坐标");
JTextField y = new JTextField(5);
JLabel labelY = new JLabel("Y轴坐标");
panel.add(x);
panel.add(labelX);
panel.add(y);
panel.add(labelY);
// 将面板添加到窗口中
frame.getContentPane().add(panel);
frame.pack(); // 自动调整窗口大小以适应组件
// 使窗口可见
frame.setVisible(true);
textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String barcodeData = textField.getText().trim();
String customer = (String) comboBox.getSelectedItem();
Integer xL = 30;
Integer yL = 30;
if (StringUtils.hasText(x.getText())) {
xL = xL+Integer.parseInt(x.getText());
}
if (StringUtils.hasText(y.getText())) {
yL = yL+Integer.parseInt(y.getText());
}
PrinterJob printerJob = PrinterJob.getPrinterJob();
PrintService psZebra = printerJob.getPrintService();
DocPrintJob job = psZebra.createPrintJob();
try {
PrinterOptions printerOptions = new PrinterOptions();
printerOptions.setDefaultFontSize(2);
ZebraLabel zebraLabel = new ZebraLabel(270, 230, printerOptions);
assert customer != null;
if(customer.equals("测试")){
int groupSize = 7;
int groups = (barcodeData.length() + groupSize - 1) / groupSize;
if(groups ==1){
ZebraText zebraText = new ZebraText(30+xL, 40+yL,barcodeData, ZebraFont.ZEBRA_ZERO,5);
zebraLabel.addElement(zebraText);
}else {
String barcode = barcodeData.substring(0, 7);
ZebraText zebraText = new ZebraText(30+xL, 40+yL,barcode, ZebraFont.ZEBRA_ZERO,5);
zebraLabel.addElement(zebraText);
String substring = barcodeData.substring(7);
ZebraText zebraText2 = new ZebraText(30+xL, 40+22+yL,substring, ZebraFont.ZEBRA_ZERO,5);
zebraLabel.addElement(zebraText2);
}
}else{
ZebraText zebraText = new ZebraText(30+xL, 40+yL,barcodeData, ZebraFont.ZEBRA_ZERO,5);
zebraLabel.addElement(zebraText);
}
int groupSize = 8;
int groups = (customer.length() + groupSize - 1) / groupSize;
for (int i = 0; i < groups; i++) {
int start = i * groupSize;
int end = Math.min(start + groupSize, customer.length());
String group = customer.substring(start, end);
ZebraText zebraText = new ZebraText(group, 30+xL, 100+25*i+yL, 10, 1, 1, 1, 1, 22);
zebraLabel.addElement(zebraText);
}
DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
//注意 打印机解析数据的编码格式 (这里是标签编码格式)
String zplcode = zebraLabel.getZplCode();
byte[] by = zplcode.getBytes();
Doc doc = new SimpleDoc(by, flavor, (DocAttributeSet) null);
job.print(doc, (PrintRequestAttributeSet) null);
} catch (Exception ex) {
ex.printStackTrace();
}finally {
textField.setText(null);
}
}
});
}
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
if (pageIndex > 0) {
return NO_SUCH_PAGE;
}
Paper paper = new Paper();
paper.setImageableArea(72, 72, -73, -75);
pageFormat.setPaper(paper);
Graphics2D g2d = (Graphics2D) graphics;
g2d.drawString(this.data, 72, -72);
g2d.drawString(this.customer, 72, 10 + 72);
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
return PAGE_EXISTS;
}
}