3.4 KiB
3.4 KiB
项目总览 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。
- 增加本地 macOS 字体路径:
- 修改
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,不提供全局默认值。
- 增加 Linux 字体路径:
- 修改
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缺少其他测试依赖的业务类。
- 结果:失败,失败原因是 Maven 仍尝试编译
- 已执行:手工编译
CcdiProjectOverviewReportPdfExporterTest后,通过 JUnit Platform Launcher 指定运行该测试类- 结果:通过,
Tests found: 3,Tests succeeded: 3,Tests failed: 0。
- 结果:通过,