最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)在Word模板指定位置添加二維碼并生成?PDF

 更新時(shí)間:2025年02月12日 09:04:47   作者:五行星辰  
在實(shí)際業(yè)務(wù)場景中,我們常常需要在?Word?模板的指定位置貼上二維碼,然后將其轉(zhuǎn)換為?PDF?電子憑證文檔,下面我們就來看看具體實(shí)現(xiàn)方法吧

在實(shí)際業(yè)務(wù)場景中,我們常常需要在 Word 模板的指定位置貼上二維碼,然后將其轉(zhuǎn)換為 PDF 電子憑證文檔。下面將詳細(xì)介紹如何使用 Java 完成這一任務(wù),我們會借助 Apache POI 處理 Word 文檔,ZXing 生成二維碼,以及 Docx4J 將 Word 文檔轉(zhuǎn)換為 PDF。

1. 引入依賴

如果你使用 Maven 管理項(xiàng)目,在 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 轉(zhuǎn)換為 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 模板的指定位置插入二維碼,這里假設(shè)模板中使用特定占位符來標(biāo)記二維碼的插入位置。

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 文檔轉(zhuǎn)換為 PDF

使用 Docx4J 將插入二維碼后的 Word 文檔轉(zhuǎn)換為 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. 主程序調(diào)用示例

import java.io.IOException;
 
import com.google.zxing.WriterException;
 
public class Main {
    public static void main(String[] args) {
        try {
            // 要生成二維碼的內(nèi)容
            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 文檔轉(zhuǎn)換為 PDF
            WordToPdfConverter.convertWordToPdf(wordOutputPath, pdfOutputPath);
 
            System.out.println("PDF 電子憑證文檔生成成功!");
        } catch (WriterException | IOException | Exception e) {
            e.printStackTrace();
        }
    }
}

6. 代碼解釋

1.生成二維碼

QRCodeGenerator 類使用 ZXing 庫根據(jù)指定的文本內(nèi)容生成二維碼的 BufferedImage 對象。

2.在 Word 模板插入二維碼

WordQRCodeInserter 類遍歷 Word 文檔的段落和運(yùn)行對象,查找包含占位符的文本,清除占位符文本后插入二維碼圖片。

3.Word 轉(zhuǎn) PDF

WordToPdfConverter 類使用 Docx4J 將插入二維碼后的 Word 文檔轉(zhuǎn)換為 PDF 文件。

4.主程序調(diào)用

在 Main 類的 main 方法中,依次調(diào)用生成二維碼、在 Word 模板插入二維碼、將 Word 轉(zhuǎn)換為 PDF 的方法,最終生成 PDF 電子憑證文檔。

7. 注意事項(xiàng)

確保 Word 模板文件和輸出文件的路徑正確,并且程序有讀寫權(quán)限。

可以根據(jù)需要調(diào)整二維碼的大小和占位符的內(nèi)容。

處理中文等非 ASCII 字符時(shí),要確保字符編碼設(shè)置正確。

通過以上步驟,你就可以使用 Java 在 Word 模板指定位置貼上二維碼,并將其生成為 PDF 電子憑證文檔啦!

以上就是Java實(shí)現(xiàn)在Word模板指定位置添加二維碼并生成 PDF的詳細(xì)內(nèi)容,更多關(guān)于Java Word添加二維碼的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 了解Java多線程的可見性與有序性

    了解Java多線程的可見性與有序性

    這篇文章主要介紹了了解Java多線程的可見性與有序性,在Java內(nèi)存模型中,允許編譯器和處理器對指令進(jìn)行重排序,但是重排序過程不會影響到單線程程序的執(zhí)行,卻會影響到多線程并發(fā)執(zhí)行的正確性。,需要的朋友可以參考下
    2019-06-06
  • Rabbitmq消息推送功能實(shí)現(xiàn)示例

    Rabbitmq消息推送功能實(shí)現(xiàn)示例

    rabbitMQ為異步消息處理提出了一個(gè)很好的解決方案,它是一個(gè)非常好用的消息中間件。主要解決當(dāng)生產(chǎn)者大量產(chǎn)生數(shù)據(jù)時(shí),消費(fèi)者無法快速消費(fèi)的問題。這個(gè)時(shí)候需要一個(gè)中間層,保存這個(gè)數(shù)據(jù),rabbitMQ是一個(gè)很好的解決方案
    2022-12-12
  • 詳解 Java Maximum redirects (100) exceeded

    詳解 Java Maximum redirects (100) exceeded

    這篇文章主要介紹了詳解 Java Maximum redirects (100) exceeded的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Java管道流實(shí)現(xiàn)線程間通信過程解析

    Java管道流實(shí)現(xiàn)線程間通信過程解析

    這篇文章主要介紹了Java管道流實(shí)現(xiàn)線程間通信過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • SpringAop日志找不到方法的處理

    SpringAop日志找不到方法的處理

    這篇文章主要介紹了SpringAop日志找不到方法的處理方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java操作Redis詳細(xì)介紹

    Java操作Redis詳細(xì)介紹

    這篇文章主要介紹了Java操作Redis詳細(xì)介紹,涉及對key的操作,string數(shù)據(jù)類型,list數(shù)據(jù)類型等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java項(xiàng)目有中多個(gè)線程如何查找死鎖

    Java項(xiàng)目有中多個(gè)線程如何查找死鎖

    這篇文章主要介紹了Java項(xiàng)目有中多個(gè)線程如何查找死鎖,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • MyBatis-Plus如何最優(yōu)雅最簡潔地完成數(shù)據(jù)庫操作

    MyBatis-Plus如何最優(yōu)雅最簡潔地完成數(shù)據(jù)庫操作

    Mybatis-Plus是一個(gè)?Mybatis?的增強(qiáng)工具,在?Mybatis?的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于MyBatis-Plus如何最優(yōu)雅最簡潔地完成數(shù)據(jù)庫操作的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • 淺談@FeignClient中name和value屬性的區(qū)別

    淺談@FeignClient中name和value屬性的區(qū)別

    這篇文章主要介紹了@FeignClient中name和value屬性的區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java可重入鎖reentrantLock解析

    Java可重入鎖reentrantLock解析

    這篇文章主要介紹了Java可重入鎖reentrantLock解析,reentrantLock跟synchronized代碼結(jié)構(gòu)差不多,只是多了一個(gè)lock和unlock的過程,需要的朋友可以參考下
    2023-12-12

最新評論

延津县| 彝良县| 扶风县| 屏南县| 彭州市| 镇安县| 玛沁县| 建昌县| 抚松县| 桦川县| 大丰市| 东山县| 金湖县| 永济市| 花莲市| 温泉县| 陆良县| 博白县| 瑞金市| 宜黄县| 九江县| 和林格尔县| 富源县| 鹤山市| 萝北县| 维西| 施秉县| 铜鼓县| 曲沃县| 习水县| 莒南县| 高碑店市| 陵川县| 丹棱县| 方正县| 改则县| 治多县| 宁都县| 兴仁县| 辽阳县| 彭州市|