Skip to content

fix(knowledge): 修复 PDF 转 Markdown 图片未提取持久化 + 前端渲染增强 - #540

Merged
ThreeFish-AI merged 4 commits into
feature/1.x.xfrom
ThreeFish-AI/pdf-markdown-render
May 14, 2026
Merged

fix(knowledge): 修复 PDF 转 Markdown 图片未提取持久化 + 前端渲染增强#540
ThreeFish-AI merged 4 commits into
feature/1.x.xfrom
ThreeFish-AI/pdf-markdown-render

Conversation

@ThreeFish-AI

Copy link
Copy Markdown
Owner

Summary

  • 修复 PDF 转 Markdown 后图片完全无法显示的根因:parse_pdf_to_markdown 返回的图片数据位于 structuredContent.image_assets(含 resource_uri),但提取管线未处理此来源,导致图片从未上传至 GCS
  • 增强 Document Markdown 渲染器:图片失败占位符、代码块语法高亮、表格样式改进

背景

  • 本次变更要解决的问题:Knowledge / Document 页面查看 PDF 转换后的 Markdown 时,所有图片请求返回 404(ASSET_NOT_FOUND),代码块无语法着色,图片失败时被 display:none 直接隐藏
  • 关联上下文:通过浏览器实机验证 + MCP 执行历史分析 + API 调试确认根因链路

核心变更

后端(图片提取修复)

  • mcp_client.py:在资源解析阶段扫描 structuredContent.image_assets[].resource_uri,加入 resources/read 同会话拉取队列
  • extraction.py:新增 _extract_structured_image_assets 函数,从 payload.image_assets 提取资产元数据并匹配 resolved_resources 中的二进制载荷,集成到四层资产合并链

前端(渲染增强)

  • DocumentMarkdownRenderer.tsx:提取 DocumentImage 为独立 React 组件,实现 loading/loaded/error 三态管理,图片失败时显示图标 + alt text 占位符
  • markdown-plugins.ts:添加 rehype-highlight 实现代码块语法高亮
  • 表格外层添加 border 和圆角

风险与回滚

  • 主要风险:resource_uri(如 perceives://pdf/...)的时效性取决于 MCP 会话生命周期;若 resources/read 失败,图片会标记 resource_read_failed 并显示前端占位符
  • 回滚方式:git revert 即可;已提取的文档可通过 "Re-Parse from GCS" 按钮重新触发

验证证据

  • 单元测试:test_extraction_image_assets.py 全部 60 个用例通过
  • TypeScript 类型检查 + ESLint 零报错
  • E2E/Workflow:浏览器实机验证 API 返回 404 → 修复后图片应可正确加载(需重新解析已有文档)

影响范围

  • 前端:DocumentMarkdownRenderermarkdown-pluginspackage.json(新增 rehype-highlight)
  • 后端:mcp_client.py(资源解析扩展)、extraction.py(新增提取函数 + 合并链集成)
  • GitHub Actions / 文档:无影响

Test plan

  • 对已有 PDF 文档点击 "Re-Parse from GCS" 重新提取,验证图片正确显示
  • 确认图片失败时显示占位符(alt text + 图标)而非空白
  • 确认代码块有语法高亮着色
  • 确认数学公式(KaTeX)和 Mermaid 图表不受影响
  • 运行 uv run pytest tests/unit_tests/knowledge/test_extraction_image_assets.py

🤖 Generated with Claude Code, CodeX, Gemini

MCP 工具 parse_pdf_to_markdown 返回的图片数据位于
structuredContent.image_assets 中(含 resource_uri),
但提取管线未处理此来源,导致图片从未上传至 GCS。

- mcp_client: 扫描 structuredContent.image_assets[].resource_uri
  加入资源解析队列,通过 resources/read 同会话拉取
- extraction: 新增 _extract_structured_image_assets 函数,
  从 payload.image_assets 提取资产并匹配 resolved_resources
  中的二进制数据,集成到资产合并链

🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
- 图片组件三态管理(loading/loaded/error),失败时显示占位符
  含图标和 alt text,替代原来的 display:none 隐藏
- 图片加载状态 spinner 指示器和 figcaption 标题显示
- 添加 rehype-highlight 代码块语法高亮支持
- 表格外层添加 border 和圆角,提升视觉层次

🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
1. 将 rehypeHighlight 从共享 defaultRehypePlugins 移至 DocumentMarkdownRenderer 局部,
   避免对 MessageBubble/McpServerCard 等其他 Markdown 渲染组件产生不必要的副作用;
2. 新增 highlight-theme.css,在 @import github.css 基础上补充 .dark 作用域的暗色覆写,
   修复暗色模式下 .hljs { color: #24292e } 导致深色文字在深色背景上不可见的问题。

🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
将 highlight.js 由 rehype-highlight 的传递依赖提升为直接依赖。
原因:highlight-theme.css 内部 @import 'highlight.js/styles/github.css',
经 PostCSS/Turbopack 解析时仅查找顶层 node_modules/highlight.js,
而 pnpm 默认不提升传递依赖,导致 CI 构建报 Can't resolve。
显式声明为直接依赖后顶层软链生效,本地 next build 验证通过。

🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
@ThreeFish-AI
ThreeFish-AI merged commit 8764df6 into feature/1.x.x May 14, 2026
15 checks passed
@ThreeFish-AI
ThreeFish-AI deleted the ThreeFish-AI/pdf-markdown-render branch May 14, 2026 07:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant