Export4j 项目立项文档
项目类型: 开源基础设施 / 文档生产引擎
首选实现语言: Java
构建工具: Gradle(多模块)
目标许可证: Apache License 2.0
文档性质: 初始立项与目标范围;当前项目已进入开发与分项验收阶段
本文保留初始规划及阶段目标,不作为已实现功能清单。当前支持范围、使用方式和剩余工作分别见文档导航、能力矩阵和能力缺口表。
1. 项目背景
现有 PDF 生产方案通常存在以下问题:
- 底层 PDF 绘制 API 与高级排版逻辑耦合,难以扩展和替换。
- 不同编程语言的框架具有不同的文档模型和布局机制,跨语言迁移与统一抽象成本较高。
- PDF、DOCX 等格式在文档结构、布局语义和输出机制上存在差异,难以通过简单的格式转换接口统一处理。
- 复杂文档涉及字体度量、文字塑形、自动换行、表格布局、分页和资源管理,单纯封装现有 PDF 库无法满足通用排版引擎的设计目标。
- 部分成熟框架的许可证、商业使用限制或架构约束,不适合直接作为长期自主维护的项目基础。
因此,计划开发一套独立的文档生产引擎,采用模块化架构,将精确绘制、文档格式适配和高级排版能力分离,在复用成熟开源基础设施的同时,建立自主可控的核心模型与扩展体系。
2. 项目目标
2.1 总体目标
建设一套可扩展、可替换后端、支持多种文档格式的通用文档生产框架。
项目应具备以下核心能力:
- 精确控制页面、文字、图形、图片和绘制坐标。
- 支持基于约束的文档布局、文本换行、表格排版和自动分页。
- 通过独立适配器支持不同文档格式的导入与导出。
- 允许不同语言、不同实现的底层组件通过统一接口接入。
- 提供可复现的排版结果、测试工具和扩展 API。
- 采用 Apache-2.0 许可证发布自研项目代码,并对第三方依赖实施许可证审计。
2.2 项目定位
本项目不是现有 PDF 库的简单封装,也不是对某个成熟框架的 Fork。
项目采用自主设计核心架构、复用成熟基础设施、独立实现关键排版算法的路线。
2.3 非目标
第一阶段不以以下能力为交付目标:
- 完整兼容 Microsoft Word 的全部排版行为。
- 完整实现 PDF 规范的所有高级特性。
- 从零实现字体解析、复杂文字塑形、图像解码和压缩算法。
- 直接实现 PDF 数字签名、增量更新、完整 PDF 无损编辑等高级能力。
- 以浏览器作为生产 PDF 的渲染引擎。
- 一次性实现所有目标文档格式。
3. 总体架构
系统采用分层、模块化设计,核心分为文档模型、布局引擎、精确绘制能力和格式适配器。
3.1 架构分层
第一层:文档模型(Document Model)
负责表达文档的语义结构,包括:
- 文档、章节与页面设置。
- 段落、文本、字符样式和段落样式。
- 表格、单元格、图片及其他内容元素。
- 字体、颜色、资源引用和元数据。
- 页眉、页脚、脚注、书签等高级结构。
该层不直接依赖 PDF 页面坐标、PDF 对象编号或具体后端 API。
第二层:布局引擎(Layout Engine)
负责将语义文档转换为确定的布局结果,包括:
- 字体度量和文本测量。
- 文本塑形与行布局。
- 段落换行、对齐和缩进。
- 约束布局与尺寸计算。
- 表格列宽、行高及单元格布局。
- 页面分割、自动分页和分页控制。
- 页眉页脚、重复表头和页码处理。
布局引擎应与具体文件格式解耦,不在测量和布局阶段直接写入 PDF 文件。
第三层:精确绘制内核(Graphics Core)
负责统一表达精确绘制操作,包括:
- 页面坐标和变换矩阵。
- 路径、填充、描边和裁剪。
- 文字与字形绘制。
- 图片绘制及资源引用。
- 颜色、透明度和图形状态管理。
- Display List 的生成、存储和执行。
该层提供稳定的公共接口,并允许接入不同的输出后端。
第四层:格式适配器(Format Adapters)
分别负责不同格式的导入、导出和资源映射。
- PDF:页面绘制、文件生成、PDF 内容分析和编辑能力。
- DOCX:OOXML 文档结构的导入与导出。
- SVG:矢量绘制输出。
- Raster:测试、预览和图像输出。
- 其他格式:后续按实际需求扩展。
不同格式之间不要求所有功能一一映射。对于无法无损转换的功能,应明确支持范围和信息损失。
3.2 核心数据流
Document Model
|
v
Layout Engine
|
v
Layout IR
|
v
Display List
|
+------> PDF Backend
|
+------> SVG Backend
|
+------> Raster BackendDOCX 采用独立的数据流:
DOCX / OOXML
|
v
DOCX Importer
|
v
Document Model
|
v
DOCX Exporter
|
v
DOCX / OOXMLDOCX 导出器可以复用文档模型、样式、字体和资源管理能力,但不应强制消费已经分页并转换为 PDF 式坐标的 Display List。
4. 技术选型
4.1 核心技术栈
| 项目 | 初步选型 | 说明 |
|---|---|---|
| 实现语言 | Java | 作为第一版核心实现语言 |
| 构建系统 | Gradle | 采用多模块构建 |
| Java 版本 | Java 21 LTS | 初步基线,最终以依赖兼容性验证为准 |
| 目标许可证 | Apache-2.0 | 自研代码统一采用 |
| PDF 基础设施 | Apache PDFBox | 初期 PDF 输出及 PDF 处理 |
| DOCX 基础设施 | JDK ZIP/安全 XML | 受支持 OOXML 语义子集的导入与导出 |
| 字体处理 | 独立接口 + 兼容依赖 | 评估字体解析、字形塑形与字体嵌入能力 |
| 测试体系 | JUnit + 结构验证 + 视觉回归 | 检查正确性与兼容性 |
| 发布方式 | Maven Central 等 | 待公共 API 稳定后实施 |
上述依赖属于候选方案,正式采用前必须验证具体版本、传递依赖许可证、Java 兼容性和目标功能覆盖情况。
4.2 依赖使用原则
- 优先通过 Maven 或 Gradle 引入成熟开源库。
- 不以 Fork 现有项目作为核心开发路线。
- 不直接复制其他项目的实现代码、注释或测试代码。
- 将第三方依赖封装在内部模块之后,避免公共 API 泄漏具体实现类型。
- 核心模型与布局算法应由项目自主设计和实现。
- 只有在性能、兼容性或产品需求明确时,才考虑替换现有底层组件。
- 对直接依赖、传递依赖、字体、图像和测试资源持续进行许可证审计。
4.3 许可证策略
项目整体采用 Apache-2.0 作为默认发布许可证。
第三方依赖应逐项审查其许可证、传递依赖条件、NOTICE 要求、专利条款及商业分发限制。
对于字体、图片和其他非代码资源,应独立记录其版权及使用条件。
MIT、BSD 等其他宽松许可证的依赖,可以在审查通过后使用,但不能仅凭许可证名称就认定所有使用场景均符合要求。
5. 模块规划
建议采用以下多模块结构:
export4j/
├── export4j-api/ # 公共 API
├── export4j-model/ # 文档语义模型
├── export4j-graphics-api/ # 精确绘制接口
├── export4j-graphics-core/ # 图形原语与 Display List
├── export4j-text-core/ # 文本测量与塑形接口
├── export4j-font-core/ # 字体抽象与资源管理
├── export4j-layout-model/ # 布局结果模型
├── export4j-layout-core/ # 布局与分页算法
├── export4j-components/ # 段落、表格、页眉、页脚
├── export4j-backend-pdf/ # PDF 输出后端
├── export4j-backend-svg/ # SVG 输出后端
├── export4j-backend-raster/ # 测试与预览后端
├── export4j-adapter-docx/ # DOCX 导入与导出
├── export4j-adapter-pdf/ # PDF 导入与编辑扩展
├── export4j-testing/ # 通用测试工具
├── export4j-conformance-tests/ # 格式及行为一致性测试
├── export4j-bom/ # 依赖版本管理
└── examples/ # 使用示例模块拆分应遵循实际依赖关系逐步实施,不要求第一版一次性建立所有模块。
6. 核心 API 设计原则
6.1 精确绘制接口
统一封装绘制操作,例如:
- 文档和页面生命周期。
- 绘制路径、文字、字形和图片。
- 图形状态、变换和裁剪。
- 字体及图片资源注册。
- 输出、刷新和资源释放。
业务代码和布局引擎不应直接操作 PDFBox 的具体类。
6.2 文档模型接口
文档模型以语义结构为主,支持构建、修改、遍历和验证。
模型应明确区分文档级属性、段落级属性、字符级属性及资源引用,避免将所有样式都转换成绘制参数。
6.3 布局接口
布局过程应分离测量与渲染:
- 测量可用空间与内容尺寸。
- 确定换行、组件尺寸和分页。
- 生成布局结果。
- 将布局结果转换为绘制指令。
- 由后端输出目标格式。
布局引擎应具备明确的约束模型、错误报告和可追踪的布局诊断信息。
6.4 格式适配器接口
格式适配器应区分导入与导出,并声明格式支持范围。
对于不支持或无法无损转换的结构,应通过明确的诊断信息处理,而不是静默丢弃。
7. 研发路线
阶段一:项目基础与 PDF 最小闭环
目标:验证整体架构。
- 建立 Gradle 多模块项目。
- 定义 Document Model 和 Graphics API。
- 实现基础绘制指令及 Display List。
- 封装 PDFBox,输出包含文字、图形和图片的 PDF。
- 建立文件结构验证和基础回归测试。
交付物:可运行的核心库、基础 API、示例程序和架构文档。
阶段二:字体与文本排版
目标:实现可靠的文本布局。
- 建立字体资源及字体度量接口。
- 实现字体加载、字形映射和文字测量。
- 实现普通文本换行、对齐、缩进和行距。
- 支持中文与中英文混排。
- 验证字体嵌入、Unicode 映射和字体回退。
交付物:可独立使用的文本排版模块和对应测试集。
阶段三:自动布局与分页
目标:从精确绘制库升级为文档排版引擎。
- 实现约束布局和组件尺寸测量。
- 实现段落流式布局与自动分页。
- 实现表格列宽计算、行高计算和跨页处理。
- 支持页眉页脚、页码和重复表头。
- 建立布局诊断和视觉回归机制。
交付物:可生成多页复杂报告的排版引擎。
阶段四:多格式支持
目标:建立格式适配体系。
- 实现 DOCX 导入和导出基础能力。
- 实现 SVG 输出。
- 增加 PDF 导入、内容分析或编辑扩展。
- 明确不同格式之间的功能映射和损失规则。
- 建立格式兼容性测试集。
交付物:可扩展的多格式文档处理框架。
阶段五:性能、稳定性与正式发布
目标:形成可长期维护的开源项目。
- 建立性能基准测试。
- 优化大文档内存占用和资源缓存。
- 验证并发使用与资源隔离。
- 完善许可证清单、SBOM 和发布流程。
- 稳定公共 API,发布正式版本。
交付物:正式版本、用户文档、开发文档及发布规范。
8. 测试与质量要求
测试体系至少覆盖以下方面:
8.1 功能测试
- 页面尺寸、坐标和变换正确。
- 文本测量与实际绘制结果一致。
- 图片、路径和字体资源正确输出。
- 自动分页与跨页表格符合预期。
- 不支持的格式特性能够产生明确诊断。
8.2 格式测试
- PDF 文件能够被独立工具解析和渲染。
- 字体嵌入、Unicode 文本提取和图片显示符合预期。
- DOCX 导入导出能够验证支持范围内的结构。
- 格式转换不会静默丢弃已声明支持的关键属性。
8.3 性能测试
- 单文档生成耗时。
- 批量任务吞吐量。
- 大文档峰值内存。
- 字体与图片缓存效果。
- 并发执行时的资源隔离。
- 异常文档、超大图片和资源不足场景下的行为。
性能目标应在基准文档、硬件环境和并发规模确定后制定,不预设未经测量的性能指标。
9. 项目风险
| 风险 | 应对策略 |
|---|---|
| 排版引擎范围过大 | 分阶段实现,优先普通文本、表格与分页 |
| PDF 和 DOCX 语义差异 | 使用不同后端与适配器,明确功能映射 |
| 字体与复杂文字处理困难 | 复用成熟组件,先定义统一接口 |
| 第三方许可证不符合要求 | 建立依赖清单与自动化许可证检查 |
| 底层依赖限制后续扩展 | 将外部 API 封装在内部模块之后 |
| 不同阅读器渲染差异 | 使用独立渲染器与视觉回归测试 |
| 公共 API 过早固化 | 在核心模型稳定前采用明确的版本管理策略 |
10. 项目验收标准
第一阶段至少应满足:
- 项目可以通过 Gradle 构建。
- 核心 API 不直接暴露 PDFBox 类型。
- 可以通过 Document Model 或 Graphics API 生成有效 PDF。
- 支持文字、图片、图形和基本页面设置。
- 基础输出能够通过独立 PDF 工具验证。
- 自研代码具备 Apache-2.0 许可证声明。
- 所有直接依赖和传递依赖均有许可证审查记录。
- 提供可执行示例和基础自动化测试。
后续阶段应分别增加文本排版、自动分页、复杂表格及多格式适配的验收标准。
11. 开源项目治理
正式公开前,应建立以下项目规范:
- LICENSE、README、CONTRIBUTING 和 CODE_OF_CONDUCT。
- 第三方依赖许可证清单。
- 发布版本与兼容性策略。
- 公共 API 变更规则。
- 自动化构建、测试和发布流程。
- 安全漏洞反馈和依赖升级流程。
- 设计决策记录(ADR),记录关键架构取舍。
12. 预期成果
项目最终形成一套独立的文档生产基础设施,具备:
- 自主可控的文档模型和布局引擎。
- 可替换的精确绘制后端。
- 可扩展的多格式导入与导出体系。
- 基于宽松开源许可证的依赖策略。
- 可复现的测试体系和持续演进的公共 API。
项目的核心竞争力不在于重复实现 PDF 文件格式,而在于建立统一的文档模型、可靠的排版算法、清晰的后端抽象和可长期扩展的多格式架构。