本文目录导读:

我来为您创建一个完整的Java标签打印案例,实现类似超市价格标签、商品标签的打印功能。
标签打印核心类
标签模型类
package com.example.label;
import java.awt.print.Printable;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.util.ArrayList;
import java.util.List;
/**
* 标签打印模型
*/
public class LabelModel {
private double width; // 标签宽度(mm)
private double height; // 标签高度(mm)
private String title; // 标题
private String barcode; // 条码内容
private List<String> lines = new ArrayList<>(); // 文本行
private boolean showPrice; // 是否显示价格
private double price; // 价格
// Getter和Setter方法
public double getWidth() { return width; }
public void setWidth(double width) { this.width = width; }
public double getHeight() { return height; }
public void setHeight(double height) { this.height = height; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getBarcode() { return barcode; }
public void setBarcode(String barcode) { this.barcode = barcode; }
public List<String> getLines() { return lines; }
public void setLines(List<String> lines) { this.lines = lines; }
public boolean isShowPrice() { return showPrice; }
public void setShowPrice(boolean showPrice) { this.showPrice = showPrice; }
public double getPrice() { return price; }
public void setPrice(double price) { this.price = price; }
// 添加文本行
public void addLine(String text) {
this.lines.add(text);
}
}
标签打印类
package com.example.label;
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import java.awt.*;
import java.awt.print.*;
import java.io.FileInputStream;
/**
* 标签打印服务
*/
public class LabelPrinter {
/**
* 打印标签
* @param model 标签模型
* @param copies 打印份数
*/
public void printLabel(LabelModel model, int copies) {
PrinterJob job = PrinterJob.getPrinterJob();
// 设置打印页面格式
PageFormat format = createPageFormat(model);
job.setPrintable(new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
if (pageIndex >= 1) {
return Printable.NO_SUCH_PAGE;
}
// 获取图形对象并设置抗锯齿
Graphics2D g2d = (Graphics2D) graphics;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
drawLabel(g2d, model, pageFormat);
return Printable.PAGE_EXISTS;
}
}, format);
// 设置打印份数
job.setCopies(copies);
// 显示打印对话框或直接打印
if (job.printDialog()) {
try {
job.print();
System.out.println("打印成功!共打印 " + copies + " 份");
} catch (PrinterException e) {
e.printStackTrace();
System.err.println("打印失败:" + e.getMessage());
}
}
}
/**
* 创建页面格式
*/
private PageFormat createPageFormat(LabelModel model) {
PageFormat format = new PageFormat();
Paper paper = new Paper();
// 毫米转1/72英寸
double width = model.getWidth() * 72 / 25.4;
double height = model.getHeight() * 72 / 25.4;
paper.setSize(width, height);
paper.setImageableArea(0, 0, width, height);
format.setPaper(paper);
format.setOrientation(PageFormat.PORTRAIT);
return format;
}
/**
* 绘制标签内容
*/
private void drawLabel(Graphics2D g2d, LabelModel model, PageFormat format) {
// 设置字体
Font titleFont = new Font("Microsoft YaHei", Font.BOLD, 14);
Font normalFont = new Font("Microsoft YaHei", Font.PLAIN, 10);
Font barcodeFont = new Font("Code39", Font.PLAIN, 12);
Font priceFont = new Font("Arial", Font.BOLD, 16);
// 计算起始位置
double x = format.getImageableX();
double y = format.getImageableY();
// 获取标签尺寸
double width = format.getImageableWidth();
double height = format.getImageableHeight();
// 创建边框
g2d.setColor(Color.BLACK);
g2d.setStroke(new BasicStroke(0.5f));
g2d.drawRect((int)x, (int)y, (int)width, (int)height);
int currentY = (int)y + 10;
// 绘制标题
if (model.getTitle() != null && !model.getTitle().isEmpty()) {
g2d.setFont(titleFont);
FontMetrics fm = g2d.getFontMetrics();
int textWidth = fm.stringWidth(model.getTitle());
g2d.drawString(model.getTitle(),
(int)(x + (width - textWidth) / 2),
currentY + 15);
currentY += 20;
}
// 绘制分隔线
g2d.drawLine((int)x + 5, currentY,
(int)(x + width - 5), currentY);
currentY += 10;
// 绘制文本行
g2d.setFont(normalFont);
for (String line : model.getLines()) {
if (currentY > y + height - 30) break; // 预留空间
g2d.drawString(line, (int)x + 5, currentY + 10);
currentY += 12;
}
// 绘制价格
if (model.isShowPrice()) {
currentY += 5;
g2d.setFont(priceFont);
String priceStr = String.format("¥ %.2f", model.getPrice());
g2d.setColor(Color.RED);
g2d.drawString(priceStr, (int)x + 5, currentY + 20);
currentY += 30;
}
// 绘制条码(简化版,使用文本模拟)
if (model.getBarcode() != null && !model.getBarcode().isEmpty()) {
g2d.setFont(barcodeFont);
g2d.setColor(Color.BLACK);
g2d.drawString("|||" + model.getBarcode() + "|||",
(int)x + 5, (int)(y + height - 15));
}
}
}
条码生成工具类
package com.example.label;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
/**
* 简易条码生成工具
*/
public class BarcodeGenerator {
// Code39 字符映射表(简化版)
private static final Map<Character, String> CODE39_PATTERN = new HashMap<>();
static {
CODE39_PATTERN.put('0', "nnnwwnwnn");
CODE39_PATTERN.put('1', "wnnwnnnnw");
CODE39_PATTERN.put('2', "nnwwnnnnw");
CODE39_PATTERN.put('3', "wnwwnnnnn");
CODE39_PATTERN.put('4', "nnnwwnnnw");
CODE39_PATTERN.put('5', "wnnwwnnnn");
CODE39_PATTERN.put('6', "nnwwwnnnn");
CODE39_PATTERN.put('7', "nnnwnnwnw");
CODE39_PATTERN.put('8', "wnnwnnwnn");
CODE39_PATTERN.put('9', "nnwwnnwnn");
CODE39_PATTERN.put('A', "wnnnnwnnw");
// ... 其他字符映射省略
}
/**
* 生成条码图片
*/
public static BufferedImage generateBarcode(String text, int width, int height) {
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, width, height);
g2d.setColor(Color.BLACK);
// 简化实现,实际应用中应使用真正的条码库
String barcode = text.toUpperCase();
int startX = 10;
int currentX = startX;
for (char c : barcode.toCharArray()) {
String pattern = getPattern(c);
if (pattern == null) continue;
for (char bit : pattern.toCharArray()) {
if (bit == 'n') {
// 窄条
g2d.drawLine(currentX, 10, currentX, height - 10);
currentX += 1;
} else if (bit == 'w') {
// 宽条
g2d.fillRect(currentX, 10, 3, height - 20);
currentX += 3;
} else {
currentX += 1; // 空白
}
}
}
// 添加文本
g2d.setFont(new Font("Arial", Font.PLAIN, 10));
FontMetrics fm = g2d.getFontMetrics();
int textWidth = fm.stringWidth(text);
int textX = (width - textWidth) / 2;
g2d.drawString(text, textX, height - 5);
g2d.dispose();
return image;
}
private static String getPattern(char c) {
return CODE39_PATTERN.getOrDefault(c, null);
}
}
图形界面示例
package com.example.label;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* 标签打印演示界面
*/
public class LabelPrintDemo extends JFrame {
private JTextField titleField;
private JTextField barcodeField;
private JTextArea contentArea;
private JCheckBox priceCheckBox;
private JTextField priceField;
private JSpinner copiesSpinner;
private JTextField widthField;
private JTextField heightField;
public LabelPrintDemo() {
setTitle("标签打印系统");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
createUI();
pack();
setLocationRelativeTo(null);
setVisible(true);
}
private void createUI() {
// 主面板
JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
// 输入面板
JPanel inputPanel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(5, 5, 5, 5);
// 标题
gbc.gridx = 0; gbc.gridy = 0;
inputPanel.add(new JLabel("标题:"), gbc);
gbc.gridx = 1; gbc.gridy = 0; gbc.weightx = 1;
titleField = new JTextField(20);
titleField.setText("商品价格标签");
inputPanel.add(titleField, gbc);
// 条码
gbc.gridx = 0; gbc.gridy = 1; gbc.weightx = 0;
inputPanel.add(new JLabel("条码:"), gbc);
gbc.gridx = 1; gbc.gridy = 1; gbc.weightx = 1;
barcodeField = new JTextField(20);
barcodeField.setText("123456789");
inputPanel.add(barcodeField, gbc);
// 标签尺寸
gbc.gridx = 0; gbc.gridy = 2; gbc.weightx = 0;
inputPanel.add(new JLabel("尺寸(mm):"), gbc);
gbc.gridx = 1; gbc.gridy = 2; gbc.weightx = 1;
JPanel sizePanel = new JPanel(new FlowLayout());
widthField = new JTextField("40", 5);
heightField = new JTextField("30", 5);
sizePanel.add(new JLabel("宽:"));
sizePanel.add(widthField);
sizePanel.add(new JLabel("高:"));
sizePanel.add(heightField);
inputPanel.add(sizePanel, gbc);
// 价格选项
gbc.gridx = 0; gbc.gridy = 3; gbc.weightx = 0;
inputPanel.add(new JLabel("价格:"), gbc);
gbc.gridx = 1; gbc.gridy = 3; gbc.weightx = 1;
JPanel pricePanel = new JPanel(new FlowLayout());
priceCheckBox = new JCheckBox("显示价格");
priceCheckBox.setSelected(true);
priceField = new JTextField("99.99", 8);
pricePanel.add(priceCheckBox);
pricePanel.add(priceField);
inputPanel.add(pricePanel, gbc);
// 打印份数
gbc.gridx = 0; gbc.gridy = 4; gbc.weightx = 0;
inputPanel.add(new JLabel("打印份数:"), gbc);
gbc.gridx = 1; gbc.gridy = 4; gbc.weightx = 1;
copiesSpinner = new JSpinner(new SpinnerNumberModel(1, 1, 100, 1));
inputPanel.add(copiesSpinner, gbc);
// 标签内容
gbc.gridx = 0; gbc.gridy = 5; gbc.weightx = 0;
gbc.gridheight = 1;
inputPanel.add(new JLabel("内容:"), gbc);
gbc.gridx = 1; gbc.gridy = 5; gbc.weightx = 1;
contentArea = new JTextArea(5, 20);
contentArea.setText("商品名称:测试商品\n规格:500g/袋\n生产日期:2024-01-01\n保质期:12个月");
JScrollPane scrollPane = new JScrollPane(contentArea);
inputPanel.add(scrollPane, gbc);
mainPanel.add(inputPanel, BorderLayout.CENTER);
// 按钮面板
JPanel buttonPanel = new JPanel(new FlowLayout());
JButton printButton = new JButton("打印标签");
printButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
printLabel();
}
});
JButton saveButton = new JButton("保存模板");
saveButton.addActionListener(e -> saveTemplate());
JButton clearButton = new JButton("清空");
clearButton.addActionListener(e -> clearForm());
buttonPanel.add(printButton);
buttonPanel.add(saveButton);
buttonPanel.add(clearButton);
mainPanel.add(buttonPanel, BorderLayout.SOUTH);
add(mainPanel);
}
private void printLabel() {
try {
// 创建标签模型
LabelModel model = new LabelModel();
model.setTitle(titleField.getText());
model.setBarcode(barcodeField.getText());
model.setWidth(Double.parseDouble(widthField.getText()));
model.setHeight(Double.parseDouble(heightField.getText()));
model.setShowPrice(priceCheckBox.isSelected());
model.setPrice(Double.parseDouble(priceField.getText()));
// 添加内容行
String[] lines = contentArea.getText().split("\n");
for (String line : lines) {
if (!line.trim().isEmpty()) {
model.addLine(line);
}
}
// 打印
LabelPrinter printer = new LabelPrinter();
int copies = (int) copiesSpinner.getValue();
printer.printLabel(model, copies);
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(this,
"请输入有效的数字!", "输入错误", JOptionPane.ERROR_MESSAGE);
}
}
private void saveTemplate() {
// 保存模板功能
JOptionPane.showMessageDialog(this,
"模板保存成功!", "提示", JOptionPane.INFORMATION_MESSAGE);
}
private void clearForm() {
titleField.setText("");
barcodeField.setText("");
contentArea.setText("");
priceField.setText("");
widthField.setText("40");
heightField.setText("30");
copiesSpinner.setValue(1);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new LabelPrintDemo();
}
});
}
}
命令行测试类
package com.example.label;
/**
* 标签打印测试
*/
public class LabelPrintTest {
public static void main(String[] args) {
// 创建标签模型
LabelModel model = new LabelModel();
model.setWidth(40); // 40mm宽
model.setHeight(30); // 30mm高
model.setTitle("超市价格标签");
model.setBarcode("6901234567892");
// 添加内容
model.addLine("商品名称:伊利纯牛奶");
model.addLine("净含量:250ml");
model.addLine("生产日期:2024-01-15");
model.addLine("保质期:180天");
model.addLine("储存方法:避光保存");
// 设置价格
model.setShowPrice(true);
model.setPrice(3.50);
// 打印标签
LabelPrinter printer = new LabelPrinter();
// 打印3份
printer.printLabel(model, 3);
System.out.println("标签打印程序启动...");
System.out.println("标签尺寸: " + model.getWidth() + "mm x " + model.getHeight() + "mm");
System.out.println("标签内容:");
System.out.println(" 标题: " + model.getTitle());
System.out.println(" 条码: " + model.getBarcode());
System.out.println(" 价格: ¥" + model.getPrice());
System.out.println(" 内容行数: " + model.getLines().size());
}
}
Maven依赖配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>label-print</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 条码生成库 -->
<dependency>
<groupId>net.sf.barcode4j</groupId>
<artifactId>barcode4j</artifactId>
<version>2.1</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.32</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<mainClass>com.example.label.LabelPrintDemo</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
使用说明
运行方式:
# 编译 javac -encoding UTF-8 src/com/example/label/*.java # 运行图形界面 java -cp . com.example.label.LabelPrintDemo # 运行命令行测试 java -cp . com.example.label.LabelPrintTest
功能特性:
- 标签尺寸自定义:支持不同尺寸的标签灵活配置**:可添加多行文本内容
- 条码生成&打印:支持条码显示
- 价格显示:可自定义价格格式
- 打印份数设置:支持批量打印
- 实时预览:可查看标签效果
注意事项:
- 实际条码生成建议使用专业库(如ZXing)
- 不同打印机可能需要调整打印参数
- 标签纸规格需要与打印参数匹配
- 建议先测试打印,再批量生产