首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java 结合 FreeMarker 和 Docx4j 来生成包含图片的 docx 文件

java 结合 FreeMarker 和 Docx4j 来生成包含图片的 docx 文件

原创
作者头像
JQ实验室
发布2025-08-18 14:36:09
发布2025-08-18 14:36:09
1620
举报
文章被收录于专栏:都到8月了都到8月了

使用 FreeMarker 生成 HTML,然后通过 Docx4j 将 HTML 转换为 .docx 文件;

步骤

1. 添加依赖

确保你的项目中包含了 FreeMarker 和 Docx4j 的依赖。以下是 Maven 的 pom.xml 示例:

代码语言:xml
复制
<dependencies>
    <!-- FreeMarker -->
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.31</version>
    </dependency>

    <!-- Docx4j -->
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j</artifactId>
        <version>8.3.3</version>
    </dependency>

    <!-- docx4j-export-fo for HTML to DOCX conversion -->
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-export-fo</artifactId>
        <version>8.3.3</version>
    </dependency>
</dependencies>
2. 创建 FreeMarker 模板文件 template.ftl

模板文件将用于生成包含图片的 HTML 内容。

代码语言:html
复制
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>${title}</title>
</head>
<body>
<h1>${title}</h1>
<p><strong>Author:</strong> ${author}</p>
<p><strong>Date:</strong> ${date}</p>

<!-- 插入Base64编码的图片 -->
<img src="data:image/png;base64,${base64Image}" alt="Embedded Image" />
</body>
</html>
3. Java 代码实现

编写 Java 代码,利用 FreeMarker 处理模板,并通过 Docx4j 将生成的 HTML 转换为 .docx 文件。

代码语言:java
复制
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.Version;

import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.convert.in.xhtml.XHTMLImporterImpl;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Base64;

public class FreeMarkerDocxWithImageGenerator {

    public static void main(String[] args) throws Exception {
        // 1. 设置FreeMarker配置
        Configuration cfg = new Configuration(new Version("2.3.31"));
        cfg.setClassForTemplateLoading(FreeMarkerDocxWithImageGenerator.class, "/templates");
        cfg.setDefaultEncoding("UTF-8");

        // 2. 加载模板
        Template template = cfg.getTemplate("template.ftl");

        // 3. 准备数据模型
        Map<String, Object> dataModel = new HashMap<>();
        dataModel.put("title", "My Generated Document with Image");
        dataModel.put("author", "John Doe");
        dataModel.put("date", "2025-04-16");
        dataModel.put("base64Image", encodeImageToBase64(new File("path/to/your/image.png"))); // 图片路径

        // 4. 合并模板和数据
        StringWriter writer = new StringWriter();
        template.process(dataModel, writer);

        // 5. 使用Docx4j将HTML转换为.docx
        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
        MainDocumentPart mdp = wordMLPackage.getMainDocumentPart();

        XHTMLImporterImpl xhtmlImporter = new XHTMLImporterImpl(wordMLPackage);
        mdp.getContent().addAll(xhtmlImporter.convert(writer.toString(), null));

        // 6. 保存文档
        wordMLPackage.save(new File("output_with_image.docx"));

        System.out.println("Word document generated successfully.");
    }

    private static String encodeImageToBase64(File imageFile) throws IOException {
        FileInputStream imageInFile = new FileInputStream(imageFile);
        byte[] imageData = imageInFile.readAllBytes();
        return Base64.getEncoder().encodeToString(imageData);
    }
}

注意事项

  • 图片处理:在这个示例中,图片是以 Base64 编码的形式嵌入到 HTML 中的。这样做可以简化图片插入的过程,但是请注意,这会增加 HTML 文档的大小。
  • HTML 到 DOCX 转换:使用 XHTMLImporterImpl 类来将 HTML 转换为 DOCX 内容。这是 Docx4j 提供的一个实用工具,它能够解析大部分标准的 HTML 标签并将它们转换为相应的 DOCX 元素。
  • 样式和布局:尽管这个方法适用于大多数基本的 HTML 结构,复杂的样式或特定于浏览器的功能(如某些 CSS 属性)可能不会被完美地转换到 DOCX 格式中。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 步骤
    • 1. 添加依赖
    • 2. 创建 FreeMarker 模板文件 template.ftl
    • 3. Java 代码实现
  • 注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档