PrinterJob控制打印机打印数据

这里主要演示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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现打印功能,可以使用Java中的PrinterJob类。以下是一个简单的示例代码,演示如何使用PrinterJob打印文档: ```java import java.awt.print.*; public class PrinterExample { public static void main(String[] args) { // 创建一个PrinterJob对象 PrinterJob printerJob = PrinterJob.getPrinterJob(); // 设置打印内容为文本 Printable printable = new Printable() { @Override public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { if (pageIndex > 0) { return NO_SUCH_PAGE; } Graphics2D g2d = (Graphics2D) graphics; g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); // 在这里绘制打印内容 g2d.drawString("Hello, Printer!", 100, 100); return PAGE_EXISTS; } }; // 设置打印内容 printerJob.setPrintable(printable); // 弹出打印对话框,选择打印机打印参数 if (printerJob.printDialog()) { try { // 开始打印 printerJob.print(); } catch (PrinterException e) { e.printStackTrace(); } } } } ``` 在上述代码中,我们首先创建了一个PrinterJob对象。然后,我们实现了Printable接口,该接口定义了打印内容的绘制方法。在print方法中,我们可以使用Graphics对象进行绘制操作。在这个示例中,我们简单地在打印文档上绘制了一段文本。 接下来,我们通过调用setPrintable方法,将我们实现的Printable对象设置为PrinterJob打印内容。 最后,我们使用printDialog方法显示打印对话框,用户可以选择打印机打印参数。如果用户确认打印,我们调用print方法开始打印。 请注意,打印功能的实现可能因操作系统和打印机的不同而有所差异。此示例仅提供了一个基本的实现框架,您可能需要根据自己的需求进行适当的调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值