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:

相关推荐
小羊没烦恼!3 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里3 天前
java中的继承和多态的区别
java
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕3 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖3 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时3 天前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang3 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi3 天前
mysql 查询所有表名并授权
java
ProcessOn官方账号3 天前
java函数式编程--入门基础
java·编程·函数式编程