当前位置: 首页 > article >正文

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

在实际业务场景中,我们常常需要在 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 库生成二维码的代码如下:

 
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 模板的指定位置插入二维码,这里假设模板中使用特定占位符来标记二维码的插入位置。

 
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。

 
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. 主程序调用示例

 
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 文档转换为 PDF
            WordToPdfConverter.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.kler.cn/a/544073.html

相关文章:

  • Ubuntu 20.04 安装 Intel AX211 网卡驱动
  • Leetcode1760:袋子里最少数目的球
  • transformer
  • 游戏引擎学习第100天
  • π 的奥秘:如何用有理数逼近无理数?
  • JavaScript相关知识点
  • Flutter 的 Widget Key 提议大调整?深入聊一聊 Key 的作用
  • Python中的HTTP客户端库:httpx与request | python小知识
  • 本地部署DeepSeek摆脱服务器繁忙
  • 在 Mac ARM 架构上使用 nvm 安装 Node.js 版本 16.20.2
  • Spring Cloud — 深入了解Eureka、Ribbon及Feign
  • Microsoft Word xml 字符非法解决
  • PyCharm 批量替换
  • java后端开发day12--面向对象
  • 【k8s应用管理】kubernetes Pod控制器
  • 推荐一个免费的、开源的大数据工程学习教程
  • 使用Python爬虫获取1688工厂档案信息:深入解析
  • 传统CV到深度学习:特征工程与卷积神经网络实战(进阶篇)
  • 面试准备——Java理论高级【笔试,面试的核心重点】
  • 什么是XMLHttpRequest?及其详细使用说明
  • 功能测试的范畴与目标
  • 通过环境变量实现多个 python 版本的自由切换以及 Conda 虚拟环境的使用教程
  • 深入探究 Rust 测试:灵活控制测试的执行方式
  • 【数据结构入门】一、数组
  • FlutterWeb实战:07-自动化部署
  • Spring Boot + ShardingSphere 踩坑记