朋友们!在数字化浪潮滚滚向前的今天,电子凭证的应用越来越广泛。咱做开发的,经常会碰到这样的需求:要在 HTML 电子凭证模版的指定位置贴上二维码,然后把它生成 PDF 电子凭证文档。这事儿听起来复杂,但只要找对方法,其实也不难。今天,我就带大家一起探索一下怎么用 Java 实现这个功能。
前期准备:依赖先行
咱做开发,依赖库就像是咱的武器库,选对了武器,战斗起来才能得心应手。在这个项目里,我们需要用到几个强大的开源库。如果你用 Maven 管理项目,在 pom.xml
里加上下面这些依赖:
<dependencies>
<!-- ZXing 用于生成二维码 -->
<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>
<!-- Thymeleaf 用于处理 HTML 模板 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<!-- Flying Saucer 用于将 HTML 转换为 PDF -->
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.1.22</version>
</dependency>
</dependencies>
这些依赖就像是我们的得力助手,有了它们,后面的开发工作就能顺利开展。
第一步:生成二维码
二维码在如今的数字化生活中无处不在,它就像是一把钥匙,能快速打开信息的大门。我们用 ZXing
库来生成二维码,代码如下:
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
public class QRCodeGenerator {
public static String generateQRCodeBase64(String text, int width, int height) throws WriterException, IOException {
QRCodeWriter qrCodeWriter = new QRCodeWriter();
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hints);
BufferedImage qrCodeImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(qrCodeImage, "png", byteArrayOutputStream);
byte[] imageBytes = byteArrayOutputStream.toByteArray();
return Base64.getEncoder().encodeToString(imageBytes);
}
}
这里我们把生成的二维码转换为 Base64 编码的字符串,方便后面插入到 HTML 模板中。
第二步:创建 HTML 模板
HTML 模板就像是我们电子凭证的“骨架”,它规定了整个凭证的结构和样式。我们创建一个 voucher_template.html
文件,在需要插入二维码的地方留个占位符,就像这样:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>电子凭证</title>
</head>
<body>
<h1>电子凭证</h1>
<p>以下是二维码信息:</p>
<img th:src="'data:image/png;base64,' + ${qrCodeBase64}" alt="QR Code">
</body>
</html>
这个占位符就像是一个“坑”,等着我们把生成的二维码“填”进去。
第三步:处理 HTML 模板并插入二维码
有了模板和二维码,接下来就是把它们结合起来。我们用 Thymeleaf
库来处理 HTML 模板,把二维码的 Base64 编码字符串插入到占位符的位置。代码如下:
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class HtmlTemplateProcessor {
public static String processTemplate(String templateName, Map<String, Object> variables) {
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setTemplateMode(TemplateMode.HTML);
templateResolver.setCharacterEncoding("UTF-8");
TemplateEngine templateEngine = new TemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
Context context = new Context();
context.setVariables(variables);
return templateEngine.process(templateName, context);
}
}
通过这个方法,我们就能把二维码“贴”到 HTML 模板的指定位置。
第四步:将 HTML 转换为 PDF
最后一步,就是把处理好的 HTML 转换成 PDF 文件。我们用 Flying Saucer
库来完成这个任务,代码如下:
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class HtmlToPdfConverter {
public static void convertHtmlToPdf(String htmlContent, String outputPath) throws IOException {
try (OutputStream outputStream = new FileOutputStream(outputPath)) {
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(htmlContent);
renderer.layout();
renderer.createPDF(outputStream);
}
}
}
这样,我们就把 HTML 电子凭证转换成了 PDF 电子凭证文档。
主程序调用示例
下面是一个完整的主程序调用示例,把上面的步骤串起来:
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.google.zxing.WriterException;
public class Main {
public static void main(String[] args) {
try {
// 要生成二维码的内容
String qrCodeContent = "https://www.example.com";
// 生成二维码的 Base64 编码
String qrCodeBase64 = QRCodeGenerator.generateQRCodeBase64(qrCodeContent, 200, 200);
// 准备模板变量
Map<String, Object> variables = new HashMap<>();
variables.put("qrCodeBase64", qrCodeBase64);
// 处理 HTML 模板
String processedHtml = HtmlTemplateProcessor.processTemplate("voucher_template.html", variables);
// 生成的 PDF 文件输出路径
String pdfOutputPath = "path/to/your/output.pdf";
// 将 HTML 转换为 PDF
HtmlToPdfConverter.convertHtmlToPdf(processedHtml, pdfOutputPath);
System.out.println("PDF 电子凭证文档生成成功!");
} catch (WriterException | IOException e) {
e.printStackTrace();
}
}
}
注意事项
在开发过程中,有几个地方需要注意。首先,要确保 voucher_template.html
文件放在类路径下,不然程序找不到模板文件可就麻烦了。其次,可以根据实际需求调整二维码的大小和 HTML 模板的样式,让电子凭证看起来更美观。另外,处理中文等非 ASCII 字符时,要保证字符编码设置正确,避免出现乱码的情况。
朋友们,技术的魅力就在于不断探索和创新。通过今天的分享,希望大家能掌握在 HTML 电子凭证模版指定位置贴上二维码,并生成 PDF 电子凭证文档的方法。让我们一起在技术的道路上勇往直前,创造更多的可能!