首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >java使用 FreeMarker 模板生成包含图片的 `.doc` 文件

java使用 FreeMarker 模板生成包含图片的 `.doc` 文件

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

通常的做法是首先利用 FreeMarker 生成 HTML 内容(包括图片),然后将该 HTML 转换为 .doc 格式。

方法概述

  1. 使用 FreeMarker 生成包含图片的 HTML。
  2. 将生成的 HTML 直接保存为 .doc 文件。尽管这不是最完美的解决方案,但大多数现代文字处理软件(如 Microsoft Word)能够打开并正确显示这种类型的文件。

实现步骤

1. 准备 FreeMarker 模板 template.ftl

创建一个 FreeMarker 模板文件,用于定义你的文档结构和如何嵌入图片。这里假设图片以 Base64 编码的形式嵌入。

代码语言: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>
2. Java 代码实现

编写 Java 代码,利用 FreeMarker 处理模板,并生成最终的 .doc 文件。

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

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

public class FreeMarkerDocGenerator {

    public static void main(String[] args) throws Exception {
        // 1. 设置FreeMarker配置
        Configuration cfg = new Configuration(new Version("2.3.31"));
        cfg.setClassForTemplateLoading(FreeMarkerDocGenerator.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. 将HTML内容保存为.doc文件
        try (BufferedWriter fileWriter = new BufferedWriter(new FileWriter("output_with_image.doc"))) {
            fileWriter.write(writer.toString());
        }

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

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

注意事项

  • 兼容性问题:虽然上述方法可以生成一个包含内联图片的 .doc 文件,但是请注意,这种方法依赖于文字处理软件对 HTML 的解释能力。不同的软件可能对此有不同的支持程度。
  • 样式和布局:由于 .doc 文件格式限制,复杂的样式和布局可能无法完美呈现。对于复杂需求,建议考虑生成 .docx 文件。
  • 转换工具:如果需要更高的兼容性和更丰富的功能(如更好的样式控制、表格等),可以考虑使用专门的库(如 Apache POI 或 Docx4j)来生成 .docx 文件,而不是直接生成 .doc 文件。

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

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

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

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

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