探索技术新边界:让 HTML 电子凭证与二维码、PDF 完美融合

devtools/2025/2/12 12:20:30/
htmledit_views">

朋友们!在数字化浪潮滚滚向前的今天,电子凭证的应用越来越广泛。咱做开发的,经常会碰到这样的需求:要在 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>html" title=java>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-html" title=pdf>pdf</artifactId><version>9.1.22</version></dependency>
</dependencies>

这些依赖就像是我们的得力助手,有了它们,后面的开发工作就能顺利开展。

第一步:生成二维码

二维码在如今的数字化生活中无处不在,它就像是一把钥匙,能快速打开信息的大门。我们用 ZXing 库来生成二维码,代码如下:

 
html" title=java>java">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 html" title=java>javax.imageio.ImageIO;
import html" title=java>java.awt.image.BufferedImage;
import html" title=java>java.io.ByteArrayOutputStream;
import html" title=java>java.io.IOException;
import html" title=java>java.util.Base64;
import html" title=java>java.util.HashMap;
import html" title=java>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 文件,在需要插入二维码的地方留个占位符,就像这样:

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 编码字符串插入到占位符的位置。代码如下:

html" title=java>java">import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;import html" title=java>java.io.IOException;
import html" title=java>java.util.HashMap;
import html" title=java>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 库来完成这个任务,代码如下:

 
html" title=java>java">import org.xhtmlrenderer.html" title=pdf>pdf.ITextRenderer;
import html" title=java>java.io.FileOutputStream;
import html" title=java>java.io.IOException;
import html" title=java>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 电子凭证文档。

主程序调用示例

下面是一个完整的主程序调用示例,把上面的步骤串起来:

 
html" title=java>java">import html" title=java>java.io.IOException;
import html" title=java>java.util.HashMap;
import html" title=java>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 html" title=pdf>pdfOutputPath = "path/to/your/output.html" title=pdf>pdf";// 将 HTML 转换为 PDFHtmlToPdfConverter.convertHtmlToPdf(processedHtml, html" title=pdf>pdfOutputPath);System.out.println("PDF 电子凭证文档生成成功!");} catch (WriterException | IOException e) {e.printStackTrace();}}
}

注意事项

在开发过程中,有几个地方需要注意。首先,要确保 voucher_template.html 文件放在类路径下,不然程序找不到模板文件可就麻烦了。其次,可以根据实际需求调整二维码的大小和 HTML 模板的样式,让电子凭证看起来更美观。另外,处理中文等非 ASCII 字符时,要保证字符编码设置正确,避免出现乱码的情况。

朋友们,技术的魅力就在于不断探索和创新。通过今天的分享,希望大家能掌握在 HTML 电子凭证模版指定位置贴上二维码,并生成 PDF 电子凭证文档的方法。让我们一起在技术的道路上勇往直前,创造更多的可能!


http://www.ppmy.cn/devtools/158205.html

相关文章

CP AUTOSAR标准之HWTestManager(AUTOSAR_SWS_HWTestManager)(更新中……)

1 简介和功能概述 本规范描述了模块硬件测试管理启动和关闭(HTMSS)的概念、接口和配置。   HTMSS模块是AUTOSAR标准化基础软件架构服务层的基础软件模块,HTMSS模块应为应用程序SWC使用提供测试状态/结果。   该模块的目的是提供一个基础设施,用于在AUTOSAR标准软件平台内…

支持向量机(一)

支持向量机是典型的二分类模型&#xff0c;以其模型简单、实现简单、效果卓越而著称。 一元支持向量机 我们通过一条中间线根据特征对样本实现分类&#xff0c;很明显&#xff1a;两个支持样本的差别越大&#xff0c;两个支持样本的分类效果就越好。 二元支持向量机 在实际生…

Java Stream 全面解析

Java Stream 全面解析 Java 8 引入的 Stream API 提供了一种高效且声明式的方式来处理集合数据。Stream 允许你以函数式编程风格操作数据&#xff0c;支持并行处理&#xff0c;并且可以显著简化代码。下面我们将从 创建操作、中间操作 和 终端操作 三个方面进行全面深入的解析…

SSM-SpringBoot-总结

文章目录 一、基础功能1.1 属性绑定 ConfigurationProperties1.2 YAML 文件&#xff08;或者YML&#xff09;1.3 Spring 启动的配置和方式&#xff08;1&#xff09;分布式地启动程序&#xff08;2&#xff09;构建器启动【了解】 二、日志2.1 为什么要有日志2.2 日志记录&…

Zookeeper 作注册中心 和nacos 和eruka 有什么差异 ?基于什么理论选择?

目录 三者的差异 1. 设计定位与功能特性 2. 服务注册与发现机制 3. 可用性与容错性 4. 性能 选择依据 1. 业务场景 2. 可用性和一致性需求 3. 性能需求 三者的差异 1. 设计定位与功能特性 Zookeeper 设计定位:最初是为分布式应用提供协调服务的,本身并不是专门作为…

《图解设计模式》笔记(八)管理状态

十七、Observer模式&#xff1a;发送状态变化通知 Observer &#xff1a;“进行观察的人”&#xff0c;也就是“观察者”。 在 Observer模式中&#xff0c;当观察对象的状态发生变化时&#xff0c;会通知给观察者。 适用场景&#xff1a;根据对象状态进行相应处理. 示例程序…

EXCEL数据解析与加密处理方法

在 Excel 中&#xff0c;你可以通过以下步骤将字符串 h1,-109218;h10,-103431;h101,-102563;... 解析为两列数据&#xff08;一列为 h 变量&#xff0c;另一列为对应的数字&#xff09;&#xff1a; 步骤 1&#xff1a;准备数据 将字符串 h1,-109218;h10,-103431;h101,-102563…

构建资源池化与降本增效

一、背景 在安卓手机DevOps的CI流程中&#xff0c;我们基于原生jenkins自研了分布式jenkins平台承载编译任务&#xff0c;而在分布式jenkins平台中主要有三大构建业务&#xff1a; 个人级验证&#xff1a;相比个人调试有更正式的编译环境用于工程师跑构建任务&#xff0c;基本…