使用 FreeMarker 生成 HTML,然后通过 Docx4j 将 HTML 转换为 .docx
文件;
确保你的项目中包含了 FreeMarker 和 Docx4j 的依赖。以下是 Maven 的 pom.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>
template.ftl
模板文件将用于生成包含图片的 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>
编写 Java 代码,利用 FreeMarker 处理模板,并通过 Docx4j 将生成的 HTML 转换为 .docx
文件。
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);
}
}
XHTMLImporterImpl
类来将 HTML 转换为 DOCX 内容。这是 Docx4j 提供的一个实用工具,它能够解析大部分标准的 HTML 标签并将它们转换为相应的 DOCX 元素。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。