52 lines
3.4 KiB
Markdown
52 lines
3.4 KiB
Markdown
# 项目总览 PDF 中文字体配置化修复实施记录
|
||
|
||
## 保存路径确认
|
||
|
||
- 文档类型:实施记录
|
||
- 保存路径:`docs/reports/implementation/`
|
||
|
||
## 问题说明
|
||
|
||
- 异常信息:`com.ruoyi.common.exception.ServiceException: 未找到可用中文字体,无法导出PDF报告`
|
||
- 触发链路:结果总览导出 PDF 时,`CcdiProjectOverviewReportPdfExporter` 需要通过 PDFBox 加载中文字体;原实现依赖代码内置候选路径,部署环境字体路径不可控时会导致导出失败。
|
||
|
||
## 修改内容
|
||
|
||
- 修改 `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewReportPdfExporter.java`
|
||
- 删除 Java 代码内置多路径候选列表。
|
||
- 通过 `ccdi.report.pdf-font-path` 读取 profile 配置中的单个字体路径。
|
||
- 配置为空时提示 `未配置PDF中文字体路径,无法导出PDF报告`。
|
||
- 配置文件不存在、格式不支持或字体不可导出时,错误信息包含配置路径。
|
||
- `.ttc` 字体集合优先选择支持 TrueType 子集化的简体中文字体名,未命中时再使用集合内首个支持子集化的字体。
|
||
- 字体集合源在 `document.save()` 完成后再关闭,避免 PDFBox 保存阶段继续读取字体时源文件已关闭。
|
||
- 增加 `.otf` 字体文件加载支持。
|
||
- 修改 `ruoyi-admin/src/main/resources/application-dev.yml`
|
||
- 增加本地 macOS 字体路径:`/System/Library/Fonts/STHeiti Medium.ttc`。
|
||
- 修改 `ruoyi-admin/src/main/resources/application-nas.yml`
|
||
- 修改 `ruoyi-admin/src/main/resources/application-uat.yml`
|
||
- 修改 `ruoyi-admin/src/main/resources/application-pro.yml`
|
||
- 增加 Linux 字体路径:`/usr/share/fonts/truetype/wqy/wqy-microhei.ttc`。
|
||
- 未修改 `application.yml`,不提供全局默认值。
|
||
- 修改 `docker/backend/Dockerfile`
|
||
- 后端镜像安装 `fontconfig` 与 `fonts-wqy-microhei`,确保 NAS Docker 部署环境具备可用中文字体。
|
||
- 修改 `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewReportPdfExporterTest.java`
|
||
- 正常导出用例显式传入测试环境字体路径。
|
||
- 新增空配置与不存在路径的异常覆盖。
|
||
|
||
## 影响范围
|
||
|
||
- 影响结果总览 PDF 导出功能。
|
||
- 不改变报告数据组装、表格内容、前端下载接口和文件名规则。
|
||
- 不在 `application.yml` 增加默认配置,缺少 profile 配置时导出时报错。
|
||
- Docker 镜像构建会新增中文字体包安装步骤。
|
||
|
||
## 验证记录
|
||
|
||
- 已执行:`mvn -pl ccdi-project -Dtest=CcdiProjectOverviewReportPdfExporterTest -Dsurefire.failIfNoSpecifiedTests=false test`
|
||
- 结果:失败,失败原因是当前工作区已有其他源码编译错误,未进入 PDF 导出测试。
|
||
- 主要错误包括:`getDataTable` 调用参数不匹配、流水接口字段和方法签名不匹配。
|
||
- 已执行:手工编译 PDF 导出器及其依赖 VO 到 `ccdi-project/target/classes` 后,运行 `mvn -pl ccdi-project -Dtest=CcdiProjectOverviewReportPdfExporterTest -Dsurefire.failIfNoSpecifiedTests=false -Dmaven.main.skip=true test`
|
||
- 结果:失败,失败原因是 Maven 仍尝试编译 `ccdi-project` 下全量测试类,而当前 `target/classes` 缺少其他测试依赖的业务类。
|
||
- 已执行:手工编译 `CcdiProjectOverviewReportPdfExporterTest` 后,通过 JUnit Platform Launcher 指定运行该测试类
|
||
- 结果:通过,`Tests found: 3`,`Tests succeeded: 3`,`Tests failed: 0`。
|