PDF 引用 #page= 跳转后被拉回第 1 页¶
状态:已修复(pending 页意图优先于 reading-position restore + 短时重试跳转)
影响面:从 Markdown / Agent / Wiki 打开 papers/.../*.pdf#page=N(及 section/figure/region 片段)时的首次落地页
相关代码:
src/lib/pdf/pending-pdf-page.ts— 一次性待跳页意图src/components/viewer/pdf/hooks/use-pdf-navigation.ts— 恢复阅读位置时优先消费 pendingsrc/lib/workspace/actions.ts—scheduleCitationJump写入 pending 并短时重试
1. 问题现象¶
点击 papers/vla/2504.16054/2504.16054.pdf#page=11 后,PDF 会短暂滚到第 11 页,随即又显示第 1 页(或上次保存的阅读位置)。
2. 根因¶
openCitation → resolvePdfCitation → scheduleCitationJump 在 PDF handle 一注册就 scrollToLayoutRegion。与此同时 usePdfNavigation 在 scrollReady + totalPages 就绪时恢复 localStorage 里的上次阅读页;EmbedPDF 完成布局时也可能把视口重置到首页。
时序常见为:
- 引用跳转先滚到第 11 页(handle 已在,文档布局未稳)。
- 布局完成或 restore effect 把视口拉回第 1 页 / 已保存页。
scheduleCitationJump是一次性完成,不会再跳。
#427 的 currentPage > 1 守卫挡的是「用户已手动翻页后的迟到 restore」,挡不住「程序化跳转尚未稳定就被 restore / 初始化覆盖」。
3. 修复方案¶
- 解析出 citation target 后写入内存 pending 页(abs + vault-relative 别名,对齐 viewer 的
paperKey)。 - 首次 restore:有 pending 则滚到该页并消费,否则才读 saved reading position。
scheduleCitationJump在 0 / 300 / 800ms 重试跳转,约 2s 后停止;pending 再多留 2s 给迟到的 restore。
4. 验收¶
- 关闭该 PDF 面板后,从 NOTES 点击
#page=11链接。 - 应稳定停在第 11 页,不应先闪后回到第 1 页。
- 无 fragment 普通打开 PDF 仍应恢复上次阅读位置。
pnpm exec vitest run test/pdf-pending-page.test.ts