一、maven配置
<!--PDF打印-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
<scope>compile</scope>
</dependency>
<!--图片打印-->
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.5.0</version>
</dependency>
<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>
二、根据自己的需求看是否选择pdf打印,还是图片,也可以将图片直接加入pdf,这里采用两种pdf打印和图片绘画。pdf打印需要先根据原型绘制pdf模板,然后传数据
public byte[] generatePdf() {
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
// 创建 PDF 文档
Document document = new Document();
PdfWriter.getInstance(document, outputStream);
// 添加内容
document.add(new Paragraph("Hello, World!"));
// 关闭文档
document.close();
return outputStream.toByteArray();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@GetMapping("/generate-pdf")
public ResponseEntity<byte[]> generatePdf() {
byte[] pdfBytes = pdfService.generatePdf(); // 调用 Service 生成 PDF 文件
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_PDF);
headers.setContentDispositionFormData("filename", "example.pdf");
return new ResponseEntity<>(pdfBytes, headers, HttpStatus.OK);
}
这里的pdf只是简单的创建一个空的pdf,然后加入文字,直接点击可以下载
三、图片绘画,在图片里加入了二维码生成。特别注意,服务器上一般没有文字文件,这里是加入在项目的资源文件里,用类加载器获取路径,创建流
@GetMapping("/getImages")
public R<List> getImages(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
List<String> images = new ArrayList<>();
List<Tbmmu002aEntity> list = TBMMU002AService.getBaseMapper().selectBatchIds(Func.toStrList(ids));
for (Tbmmu002aEntity tbmmu002aEntity : list) {
try {
Tbmmu001Entity tbmmu001Entity = tbmmu002c.checkInvLogicId(tbmmu002aEntity.getTbmmu002Id());
BufferedImage image = generateImage(tbmmu002aEntity,tbmmu001Entity);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "png", baos);
String base64Image = Base64.getEncoder().encodeToString(baos.toByteArray());
images.add(base64Image);
} catch (Exception e) {
e.printStackTrace();
}
}
return R.data(images);
}
private BufferedImage generateImage(Tbmmu002aEntity tbmmu002aEntity,Tbmmu001Entity tbmmu001Entity) throws Exception {
int width = 842;
int height = 595;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = image.createGraphics();
g2.setColor(Color.WHITE);
g2.fillRect(0, 0, width, height);
g2.setColor(Color.BLACK);
// 使用类加载器获取字体文件流
InputStream fontStream = PdfController.class.getResourceAsStream("/PDF/SIMYOU.TTF");
if (fontStream == null) {
System.err.println("字体文件未找到");
return image;
}
Font customFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(40f);
g2.setFont(customFont);
g2.drawString("库区储位标牌", 300, 70);
g2.drawString("逻辑库区:", 50, 170);
g2.drawString(tbmmu001Entity.getInvLogicId(), 250, 170);
g2.drawString(tbmmu001Entity.getInvLogicName(), 250, 245);
g2.drawString("物理库区:", 50, 320);
g2.drawString(tbmmu002aEntity.getInvPhysicId(), 250, 320);
g2.drawString(tbmmu002aEntity.getInvPhysicName(), 250, 395);
g2.drawString("库区储位:", 50, 470);
g2.drawString(tbmmu002aEntity.getInvBinId(), 250, 470);
g2.drawString(tbmmu002aEntity.getInvBinName(), 250, 545);
BufferedImage qrCodeImage = generateQRCodeImage(tbmmu001Entity.getInvLogicId()+"/"+tbmmu002aEntity.getInvPhysicId()+"/"+tbmmu002aEntity.getInvBinId(), 300, 300);
int x = width - qrCodeImage.getWidth() - 50;
int y = height - qrCodeImage.getHeight() - 200;
g2.drawImage(qrCodeImage, x, y, null);
g2.dispose();
return image;
}
//二维码
private static BufferedImage generateQRCodeImage(String text, int width, int height) throws WriterException {
QRCodeWriter qrCodeWriter = new QRCodeWriter();
Map<EncodeHintType, Object> hints = new EnumMap<>(EncodeHintType.class);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hints);
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) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());
}
}
return image;
}
文字文件有专门的下载渠道