Java标签打印案例

wen java案例 2

本文目录导读:

Java标签打印案例

  1. 标签打印核心类
  2. 条码生成工具类
  3. 图形界面示例
  4. 命令行测试类
  5. Maven依赖配置
  6. 使用说明

我来为您创建一个完整的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

功能特性:

  1. 标签尺寸自定义:支持不同尺寸的标签灵活配置**:可添加多行文本内容
  2. 条码生成&打印:支持条码显示
  3. 价格显示:可自定义价格格式
  4. 打印份数设置:支持批量打印
  5. 实时预览:可查看标签效果

注意事项:

  1. 实际条码生成建议使用专业库(如ZXing)
  2. 不同打印机可能需要调整打印参数
  3. 标签纸规格需要与打印参数匹配
  4. 建议先测试打印,再批量生产

上一篇Java打印案例

下一篇UReport2案例

抱歉,评论功能暂时关闭!