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 天前
JavaEE初阶-jvm
java·jvm·java-ee
醇氧1 天前
Idea防止工具栏自动隐藏
java·ide·intellij-idea
m0_639817151 天前
基于springboot教学资料管理系统【带源码和文档】
java·spring boot·后端
靠沿1 天前
Java数据结构初阶——LinkedList
java·开发语言·数据结构
qq_12498707531 天前
基于springboot的建筑业数据管理系统的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·毕业设计
一 乐1 天前
宠物管理|宠物共享|基于Java+vue的宠物共享管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·springboot·宠物
a crazy day1 天前
Spring相关知识点【详细版】
java·spring·rpc
白露与泡影1 天前
MySQL中的12个良好SQL编写习惯
java·数据库·面试
foundbug9991 天前
配置Spring框架以连接SQL Server数据库
java·数据库·spring
凯酱1 天前
@JsonSerialize
java