feat(export): PDF 内嵌函数图像矢量图 #39

Closed
yxx wants to merge 0 commits from feat/export-service into main
Collaborator

PDF 导出器内嵌函数图像矢量图,与 HTML 的静态 SVG 视觉一致。

  • 抽取 render.py 共享几何:新增 PlotGeometry + compute_geometry,render_svg 改为薄序列化层,SVG 输出与重构前逐字节一致(8 组用例回归验证)
  • 新增 app/plot/render_reportlab.py:消费共享几何产出 reportlab 矢量 Drawing(网格/坐标轴 Line、曲线 PolyLine、刻度/标签 String、ylabel Group 旋转),复用 STSong-Light 渲染中文,按页面内容宽 renderScale 缩放
  • pdf.py 的 _block_function_plot 改为内嵌矢量图(解析/渲染失败或超预算回退占位,单图失败不阻断整篇);mermaid 仍占位
  • 抽取 FunctionPlotBudget + format_plot_diagnostic 到 _common.py,HTML/PDF 共用
  • 文档同步:PDF 已内嵌函数图像,DOCX 仍占位(栅格化范围外)

新增 6 个测试(共享几何、reportlab Drawing、PDF 内嵌/回退/超限),717 测试全部通过。

🤖 Generated with Claude Code

PDF 导出器内嵌函数图像矢量图,与 HTML 的静态 SVG 视觉一致。 - 抽取 `render.py` 共享几何:新增 `PlotGeometry` + `compute_geometry`,`render_svg` 改为薄序列化层,SVG 输出与重构前逐字节一致(8 组用例回归验证) - 新增 `app/plot/render_reportlab.py`:消费共享几何产出 reportlab 矢量 `Drawing`(网格/坐标轴 `Line`、曲线 `PolyLine`、刻度/标签 `String`、ylabel `Group` 旋转),复用 STSong-Light 渲染中文,按页面内容宽 `renderScale` 缩放 - `pdf.py` 的 `_block_function_plot` 改为内嵌矢量图(解析/渲染失败或超预算回退占位,单图失败不阻断整篇);mermaid 仍占位 - 抽取 `FunctionPlotBudget` + `format_plot_diagnostic` 到 `_common.py`,HTML/PDF 共用 - 文档同步:PDF 已内嵌函数图像,DOCX 仍占位(栅格化范围外) 新增 6 个测试(共享几何、reportlab Drawing、PDF 内嵌/回退/超限),717 测试全部通过。 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Owner

审阅结论

暂不建议合并,仍有以下问题需要修复:

P2:显式范围外的曲线未裁剪

函数图像采样仅排除了非有限坐标,没有将曲线裁剪到绘图区。

例如设置 range: -1, 1 并绘制 y = 10*x 时,生成的曲线坐标会远超图表和页面范围。ReportLab 不会像 SVG viewport 一样自动裁剪,可能导致曲线覆盖 PDF 中的其他内容。

建议:

  • 将线段裁剪到绘图矩形范围内,或在 ReportLab 渲染层设置裁剪路径。
  • 增加曲线超出显式 range 时的回归测试。

P2:PDF 纵轴标签被旋转到画布之外

纵轴标签先使用绝对坐标定位,随后又以相同坐标作为旋转中心,造成坐标重复变换。实测标签边界落在负数横坐标区域,因此导出的 PDF 中无法正常显示纵轴标签。

建议:

  • 使用组内局部坐标创建文本,再对分组执行旋转和平移。
  • 增加断言,确保纵轴标签的最终边界位于 Drawing 范围内。

P3:PDF 导出器说明已经过时

当前实现已经支持把 Function Plot 作为矢量图嵌入 PDF,但 pdf.py 的模块说明仍称函数图像使用占位内容,请同步更新。

已确认修复

上一轮提出的问题均已解决:

  • PDF 混合嵌套列表顺序正确。
  • PDF/DOCX 列表项保留加粗、链接等行内语义。
  • Function Plot 静态渲染的文档状态已经更新。

验证结果

  • 后端完整测试:717 passed
  • git diff --check:通过
  • 与当前 main:无合并冲突

另外,本 PR 后续加入了 PDF 函数图像矢量渲染,但标题和描述尚未体现,测试数量仍写为 711。建议修复上述问题后同步更新 PR 描述和测试结果。

## 审阅结论 暂不建议合并,仍有以下问题需要修复: ### P2:显式范围外的曲线未裁剪 函数图像采样仅排除了非有限坐标,没有将曲线裁剪到绘图区。 例如设置 `range: -1, 1` 并绘制 `y = 10*x` 时,生成的曲线坐标会远超图表和页面范围。ReportLab 不会像 SVG viewport 一样自动裁剪,可能导致曲线覆盖 PDF 中的其他内容。 建议: - 将线段裁剪到绘图矩形范围内,或在 ReportLab 渲染层设置裁剪路径。 - 增加曲线超出显式 `range` 时的回归测试。 ### P2:PDF 纵轴标签被旋转到画布之外 纵轴标签先使用绝对坐标定位,随后又以相同坐标作为旋转中心,造成坐标重复变换。实测标签边界落在负数横坐标区域,因此导出的 PDF 中无法正常显示纵轴标签。 建议: - 使用组内局部坐标创建文本,再对分组执行旋转和平移。 - 增加断言,确保纵轴标签的最终边界位于 Drawing 范围内。 ### P3:PDF 导出器说明已经过时 当前实现已经支持把 Function Plot 作为矢量图嵌入 PDF,但 `pdf.py` 的模块说明仍称函数图像使用占位内容,请同步更新。 ## 已确认修复 上一轮提出的问题均已解决: - PDF 混合嵌套列表顺序正确。 - PDF/DOCX 列表项保留加粗、链接等行内语义。 - Function Plot 静态渲染的文档状态已经更新。 ## 验证结果 - 后端完整测试:`717 passed` - `git diff --check`:通过 - 与当前 `main`:无合并冲突 另外,本 PR 后续加入了 PDF 函数图像矢量渲染,但标题和描述尚未体现,测试数量仍写为 711。建议修复上述问题后同步更新 PR 描述和测试结果。
Kronecker closed this pull request 2026-09-06 21:33:31 +08:00

Pull request closed

This pull request cannot be reopened because the branch was deleted.
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Kronecker/NotesAgentic#39