需求:通过传参生成一维码,并调用打印机打印,通过实验可以通过图片打印或者PDF 两种打印方式,此方法采用图片打印.
导入jar包
<!-- 二维码、条形码 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.4.1</version>
</dependency>
代码示例
String data = "123456789";
int width = 400;
int height = 150;
try {
//生成一维码
BitMatrix bitMatrix = new MultiFormatWriter().encode(data, BarcodeFormat.CODE_128, width, height);
// 将 BitMatrix 转换为 BufferedImage
BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
// 创建一个新的图像,宽度和高度增加以容纳文本
BufferedImage finalImage = new BufferedImage(width, height + 30, BufferedImage.TYPE_INT_RGB);
Graphics2D g = finalImage.createGraphics();
// 设置透明背景
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height + 30);
// 绘制条形码图像
g.drawImage(image, 0, 0, null);
// 设置字体和颜色
g.setFont(new Font("Arial", Font.PLAIN, 30));
g.setColor(Color.BLACK);
// 绘制文本
FontMetrics fm = g.getFontMetrics();
int textWidth = fm.stringWidth(data);
g.drawString(data, (width - textWidth) / 2, height + 25); // 根据需要调整位置
// 释放图形上下文
g.dispose();
//保存最终图像
// ImageIO.write(finalImage, "PNG", new File(htmlFilePath));
//
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(finalImage, "PNG", byteArrayOutputStream);
ByteArrayInputStream is = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
// 查找默认打印机
PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
if (printService == null) {
System.out.println("No default print service found.");
return;
}
// 创建DocFlavor对象,表示我们要打印的是HTML格式
DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;
// 创建SimpleDoc对象,表示要打印的文档
SimpleDoc doc = new SimpleDoc(is, flavor, null);
// 创建打印请求属性集
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
pras.add(new Copies(1)); // 设置打印份数为1
pras.add(OrientationRequested.PORTRAIT); // 设置打印方向为横向
// 创建打印任务
DocPrintJob job = printService.createPrintJob();
// 执行打印任务
job.print(doc, pras);
System.out.println("Printing completed successfully.");
} catch (IOException | WriterException e) {
e.printStackTrace();
} catch (PrintException e) {
throw new RuntimeException(e);
}
以上方法中没有判定打印机的状态,经过实验得到以下两种方法:
第一种:
printService.getAttribute(PrinterState.class);
printService.getAttribute(PrinterStateReasons.class);
但是此种方法有可能获取不到打印机的状态信息
第二种:获取不脱机的打印机,可参考下面链接:
获取不脱机的打印机