Java 实现:在 Word 模板指定位置贴二维码并生成 PDF 电子凭证文档

server/2025/2/13 14:59:24/

在实际业务场景中,我们常常需要在 Word 模板的指定位置贴上二维码,然后将其转换为 PDF 电子凭证文档。下面将详细介绍如何使用 Java 完成这一任务,我们会借助 Apache POI 处理 Word 文档,ZXing 生成二维码,以及 Docx4J 将 Word 文档转换为 PDF。

1. 引入依赖

如果你使用 Maven 管理项目,在 pom.xml 中添加以下依赖:

 
<dependencies><!-- Apache POI 处理 Word 文档 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency><!-- 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><!-- Docx4J 将 Word 转换为 PDF --><dependency><groupId>org.docx4j</groupId><artifactId>docx4j-JAXB-Internal</artifactId><version>11.4.9</version></dependency><dependency><groupId>org.docx4j</groupId><artifactId>docx4j-JAXB-ReferenceImpl</artifactId><version>11.4.9</version></dependency><dependency><groupId>org.docx4j</groupId><artifactId>docx4j</artifactId><version>11.4.9</version></dependency><dependency><groupId>org.docx4j</groupId><artifactId>docx4j-export-fo</artifactId><version>11.4.9</version></dependency>
</dependencies>

2. 生成二维码

使用 ZXing 库生成二维码的代码如下:

 
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 java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;public class QRCodeGenerator {public static BufferedImage generateQRCode(String text, int width, int height) throws WriterException {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);return MatrixToImageWriter.toBufferedImage(bitMatrix);}
}

3. 在 Word 模板指定位置插入二维码

使用 Apache POI 在 Word 模板的指定位置插入二维码,这里假设模板中使用特定占位符来标记二维码的插入位置。

 
java">import org.apache.poi.xwpf.usermodel.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;public class WordQRCodeInserter {public static void insertQRCodeIntoWord(String templatePath, String outputPath, BufferedImage qrCodeImage, String placeholder) throws IOException {try (FileInputStream fis = new FileInputStream(templatePath);XWPFDocument document = new XWPFDocument(fis)) {for (XWPFParagraph paragraph : document.getParagraphs()) {for (XWPFRun run : paragraph.getRuns()) {String text = run.getText(0);if (text != null && text.contains(placeholder)) {// 清除占位符文本run.setText("", 0);// 插入二维码图片ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();ImageIO.write(qrCodeImage, "png", byteArrayOutputStream);byte[] imageBytes = byteArrayOutputStream.toByteArray();int pictureType = XWPFDocument.PICTURE_TYPE_PNG;int width = qrCodeImage.getWidth();int height = qrCodeImage.getHeight();paragraph.createRun().addPicture(new ByteArrayInputStream(imageBytes), pictureType, "qrcode.png", width * 20, height * 20);}}}try (FileOutputStream fos = new FileOutputStream(outputPath)) {document.write(fos);}}}
}

4. 将 Word 文档转换为 PDF

使用 Docx4J 将插入二维码后的 Word 文档转换为 PDF。

 
java">import org.docx4j.Docx4J;
import org.docx4j.convert.out.FOSettings;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;import java.io.*;public class WordToPdfConverter {public static void convertWordToPdf(String wordPath, String pdfPath) throws Exception {WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(wordPath));FOSettings foSettings = Docx4J.createFOSettings();foSettings.setWmlPackage(wordMLPackage);try (OutputStream os = new FileOutputStream(pdfPath)) {Docx4J.toPDF(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);}}
}

5. 主程序调用示例

 
java">import java.io.IOException;import com.google.zxing.WriterException;public class Main {public static void main(String[] args) {try {// 要生成二维码的内容String qrCodeContent = "https://www.example.com";// 生成二维码图片BufferedImage qrCodeImage = QRCodeGenerator.generateQRCode(qrCodeContent, 200, 200);// Word 模板文件路径String templatePath = "path/to/your/template.docx";// 插入二维码后的 Word 文件输出路径String wordOutputPath = "path/to/your/output.docx";// 最终生成的 PDF 文件输出路径String pdfOutputPath = "path/to/your/output.pdf";// Word 模板中的二维码占位符String placeholder = "{QR_CODE}";// 在 Word 模板中插入二维码WordQRCodeInserter.insertQRCodeIntoWord(templatePath, wordOutputPath, qrCodeImage, placeholder);// 将插入二维码后的 Word 文档转换为 PDFWordToPdfConverter.convertWordToPdf(wordOutputPath, pdfOutputPath);System.out.println("PDF 电子凭证文档生成成功!");} catch (WriterException | IOException | Exception e) {e.printStackTrace();}}
}

6. 代码解释

生成二维码

QRCodeGenerator 类使用 ZXing 库根据指定的文本内容生成二维码的 BufferedImage 对象。

在 Word 模板插入二维码

WordQRCodeInserter 类遍历 Word 文档的段落和运行对象,查找包含占位符的文本,清除占位符文本后插入二维码图片。

Word 转 PDF

WordToPdfConverter 类使用 Docx4J 将插入二维码后的 Word 文档转换为 PDF 文件。

主程序调用

Main 类的 main 方法中,依次调用生成二维码、在 Word 模板插入二维码、将 Word 转换为 PDF 的方法,最终生成 PDF 电子凭证文档。

7. 注意事项

  • 确保 Word 模板文件和输出文件的路径正确,并且程序有读写权限。

  • 可以根据需要调整二维码的大小和占位符的内容。

  • 处理中文等非 ASCII 字符时,要确保字符编码设置正确。

通过以上步骤,你就可以使用 Java 在 Word 模板指定位置贴上二维码,并将其生成为 PDF 电子凭证文档啦!


http://www.ppmy.cn/server/167353.html

相关文章

mysql基本使用

什么是数据库&#xff1f; 数据库是按照数据结构来组织、存储和管理数据的仓库。 什么是数据库管理系统(DBMS)&#xff1f; 数据库管理系统&#xff08;DBMS&#xff09;是用于创建、管理和维护数据库的软件。 什么是SQL&#xff1f; SQL&#xff08;Structured Query Lan…

什么是蒸馏大型语言模型

文章目录 前言概念目标核心思想步骤优势应用例子总结 前言 蒸馏大型语言模型&#xff08;Distillation of Large Language Models, LLMs&#xff09; 是一种知识压缩技术&#xff0c;用于将一个大型、计算量大、性能优秀的模型&#xff08;通常称为“教师模型”&#xff09;的…

LabVIEW多电机CANopen同步

核心问题与解决方案 通信层配置 节点ID与波特率冲突问题&#xff1a;在多电机系统中&#xff0c;节点ID重复或波特率不匹配常导致通信中断或数据丢失。案例&#xff1a;某3轴贴片机因步科驱动器的默认节点ID均为1&#xff0c;触发了总线仲裁错误。解决方案&#xff1a;通过配置…

一键查看电脑各硬件详细信息 轻松查看电脑硬件参数

今天为大家推荐两款非常实用的电脑硬件查看软件&#xff0c;它们能够一键快速查看电脑的各种配置信息&#xff0c;使用起来非常方便。 一键查看电脑各硬件详细信息 这款软件是绿色版的&#xff0c;无需安装&#xff0c;打开即可使用&#xff0c;文件大小仅为900多KB&#xff0…

护照识别设备-护照信息识别系统-PHP护照信息识别接口

护照是公民出入本国国境和到国外旅行时&#xff0c;由本国发给的一种证明该公民国际和身份的合法证件。护照作为重要的个人身份证明证件之一&#xff0c;对于出入境、酒店、旅游业等需要对护照进行信息提取与真伪查验的场景来说至关重要。 人工智能时代&#xff0c;基于文字识…

【2025新】基于springboot的问卷调查小程序设计与实现

目录 一、整体目录&#xff08;示范&#xff09;&#xff1a; 文档含项目技术介绍、E-R图、数据字典、项目功能介绍与截图等 二、运行截图 三、代码部分&#xff08;示范&#xff09;&#xff1a; 四、数据库表(示范)&#xff1a; 数据库表有注释&#xff0c;可以导出数据…

19.4.8 数据库综合运用

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 需要北风数据库的请留言自己的信箱。 本节中将通过实例综合展示对数据表的查询、增加、修改和删除。 【例 19.16】【项目&#xf…

Android10 Framework系列 需求定制(一)修改按键映射相关,顺便看了看按键事件分发

一、前言 客户的丰富需求又来啦。记录一下这次需求的实现。眼看着这个客户的很多定制需求都做完了,可以去忙其他事情了,结果有一天下午又接到了新的需求。客户想把之前的按键重新定义一下。于是乎我开始有点懵了。 一起来看一下这个需求 1、修改设备原有的按键功能,通用版本…