Java 富文本内容生成 PDF 文件
演示环境:JDK 8 + Spring Boot
1. 前言
B 端系统常见需求:用户在富文本编辑器里撰写月度总结 → 系统一键导出版式固定、中文字体完整、可直接打印的 PDF 文件。 本文给出一个开箱即用的 Java 实现,覆盖:
- 富文本清洗 → 防 XSS、图片/表格适配 PDF
- FreeMarker 渲染静态 HTML
- Flying-Saucer + iText 2.x 生成 PDF
- 中文字体(宋体、黑体、楷体、仿宋、小标宋)动态加载 & 嵌入
- 本地 | MinIO 双存储策略
- 常见坑(图片断开、字体缺失、分页错乱)定位与修复
2. 技术选型
| 功能 | 组件 | 版本 | 备注 |
|---|---|---|---|
| 富文本过滤 | Jsoup | 1.17.2 | 白名单模式,保留基本样式 |
| 模板引擎 | FreeMarker | 2.3.32 | 纯 Java,不依赖 Web |
| HTML→PDF | Flying-Saucer | 9.1.22 | 基于 iText 2.x,完美支持 CSS 2.1 |
| 字体加载 | iText | 2.1.7 | 支持 TTC/TTF 嵌入 |
| 文件存储 | MinIO / 本地 | 最新 | 通过配置切换 |
3. 项目结构
src
├── main
│ ├── java/org/example
│ │ ├── entity/
│ │ ├── service/
│ │ └── utils/
│ └── resources/
│ ├── fonts/
│ └── templates/
4. 核心流程
BrowserReportService → RichTextProcessor → HtmlEscapeUtil → PdfGenerateUtil → Storage 提交富文本报告 JSON → processRichTextContent() 清洗后的 HTML → createEscapedReportForRichText() 仅转义纯文本字段 → generatePdf("monthly_report.ftl", model) byte[] → 上传 / 本地落盘返回 PDF 下载地址
5. 代码详解
5.1 实体类(字段节选)
@Data
@Table(name = "monthly_work_report")
public class MonthlyWorkReport implements Serializable {
private Long id;
private String month; // 2024-12
private String creator;
String departmentName;
String reportTitle;
String monthlyKeyWorkCompletion;
String monthlyWorkOverview;
String nextMonthWorkPlan;
String reviewIssueCoordination;
String fileName;
String fileUrl;
}


