java word模板内容替换并转pdf

功能:根据word模板替换模板中占位符生成新的word文件、将word文件转换成pdf文件。

maven依赖:

xml 复制代码
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>4.1.2</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>4.1.2</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.poi.xwpf.converter.pdf-gae</artifactId>
    <version>2.0.2</version>
</dependency>

工具类:CreatePdfUtils.java

java 复制代码
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.pdf.BaseFont;
import fr.opensagres.poi.xwpf.converter.pdf.PdfConverter;
import fr.opensagres.poi.xwpf.converter.pdf.PdfOptions;
import org.apache.poi.xwpf.usermodel.*;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Map;

/**
 * CreatePdfUtils
 *  1:替换word内容
 *  2:word转pdf文件
 */
public class CreatePdfUtils {

    /**
     *替换文档内容
     */
    public static void replaceWords(String filePath, String outputFilePath, Map<String, String> replacements) throws IOException {
        try (FileInputStream fis = new FileInputStream(filePath);
             XWPFDocument document = new XWPFDocument(fis)) {

            // 替换段落中的占位符
            for (XWPFParagraph para : document.getParagraphs()) {
                replaceInParagraph(para, replacements);
            }

            // 替换表格中的占位符
            document.getTables().forEach(table -> {
                for (XWPFTableRow row : table.getRows()) {
                    for (XWPFTableCell cell : row.getTableCells()) {
                        for (XWPFParagraph paragraph : cell.getParagraphs()) {
                            replaceInParagraph(paragraph, replacements);
                        }
                    }
                }
            });

            // 输出新文档
            try (FileOutputStream fos = new FileOutputStream(outputFilePath)) {
                document.write(fos);
            }
        }
    }

    private static void replaceInParagraph(XWPFParagraph paragraph, Map<String, String> replacements) {
        for (XWPFRun run : paragraph.getRuns()) {
            String text = run.getText(0);
            if (text != null) {
                for (Map.Entry<String, String> entry : replacements.entrySet()) {
                    if (text.contains(entry.getKey())) {
                        text = text.replace(entry.getKey(), entry.getValue());
                        run.setText(text, 0);
                    }
                }
            }
        }
    }

    /**
     * word转pdf
     */
    public static String wordToPdf(String toPdf) {
        try {
            FileInputStream fis = new FileInputStream(toPdf);
            // 转换后pdf路径 与word同路径名称
            String tarPdf = toPdf.substring(0, toPdf.lastIndexOf(".")) + ".pdf";
            FileOutputStream fos = new FileOutputStream(tarPdf);
            XWPFDocument xwpfDocument = new XWPFDocument(fis);
            PdfOptions pdfOptions = PdfOptions.create();
            // 添加字体库 解决liunx环境word转pdf中文不显示
            pdfOptions.fontProvider((familyName, s1, size, style, color) -> {
                BaseFont bfChinese = null;
                try {
                    bfChinese = BaseFont.createFont(getFontPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                } catch (DocumentException e) {
                    throw new RuntimeException(e);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                Font fontChinese = new Font(bfChinese, size, style, color);
                if (familyName != null) {
                    fontChinese.setFamily(familyName);
                }
                return fontChinese;
            });
            PdfConverter.getInstance().convert(xwpfDocument, fos, pdfOptions);
            // word转换后的pdf文件路径
            return tarPdf;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取中文宋体字体库资源路径
     */
    private static String getFontPath() {
        try {
            return CreatePdfUtils.class.getClassLoader().getResource("font/" + "simsun.ttf").toURI().toString();
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }
}

字体库(宋体):simsun.ttf

下载字体库:pan.baidu.com/s/1vobIy1gt...

创建测试word模板: word模板.docx

工具类使用:

typescript 复制代码
public static void main(String[] args) {
    Map<String, String> replace = new HashMap<>();
    replace.put("name","李四");
    replace.put("age", "31");
    try {
        // word内容替换
        CreatePdfUtils.replaceWords("C:\Users\lisi\Desktop\word模板.docx",
                "C:\Users\lisi\Desktop\word版文档.docx", replace);
        // word转pdf
        CreatePdfUtils.wordToPdf("C:\Users\lisi\Desktop\word版文档.docx"); 
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

最终生成的word文档和转换后的pdf:

相关推荐
一生了无挂1 小时前
Java处理JSON技巧教学(从基础到高阶实战全覆盖)
java·开发语言·json
李白的天不白1 小时前
使用 SmartAdmin 进行前后端开发
java·前端
swordbob1 小时前
Spring 单例 Bean 是线程安全的吗?
java·开发语言
2601_951643772 小时前
Python第一,Java跌出前三,C语言杀回来了
java·c语言·python·编程语言排行·技术趋势
IT 行者4 小时前
GitHub Spec Kit 实战(五):/speckit.tasks 怎么拆——Spec Kit 五部曲收官
java·ai编程·claude
(Charon)4 小时前
【C++ 面试高频基础:指针、引用、const、static、new/delete 总结】
java·开发语言
Yeats_Liao4 小时前
Feed流系统设计(三):数据模型与存储设计,从表结构到Redis收件箱
java·javascript·redis
JiaHao汤5 小时前
分布式事务方案全景:从理论到 Seata 落地
java·分布式·spring·spring cloud
色空大师5 小时前
【debug调试详解-idea】
java·ide·intellij-idea·调试·远程调试
程序猿阿越5 小时前
AutoMQ源码(一)读、写、Compaction
java·后端·源码