java springboot实现pdf 和图片绘画

一、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;
	}

文字文件有专门的下载渠道

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值