# 删除 PDF 书签，不删除正文页

本例复用已经公开的三页自编 PDF，原稿有三个活动书签和一条第 1 页到第 3 页的页内链接。实际上传一次，点击全选一次，打开更多菜单并点击“删除选中 (3)”一次；本轮没有确认弹窗。界面显示“共 0 项”后，“保存并导出 PDF”仍可用，实际保存一次并点击“下载文件”一次。

## 原生文件核对了什么

原稿 53,991 B，SHA-256 `88758198252911eeeff768eb53c53a3b6095c49ff7fe7c5ac08720a1d7b6d5fc`。原生下载为 51,474 B，SHA-256 `0b777289a6e10cce24ad516e34eea745196431eb87000be8a870903b5ef805a0`，没有在本地重存、修复或改写。

本例原生 PDF 的当前 Catalog 不含 `/Outlines`，按当前目录可达的 First/Next 书签链计数为 0，文件读取的 outline 列表也为空。因此结论来自原生文件，不只来自工具列表变空。

正文仍为原来的三页，页序标记依次为 ROTATE-PAGE-1、2、3。每页全文、原始编码和解码后的页面内容流，以及有界解析的页面资源结构、字体和图像流均与对应原页一致。MediaBox、CropBox 和 Rotate 也保持本例原值：第 2 页原本带 90° 旋转和裁剪框偏移，第 3 页原本为横向页，删除书签没有将它们转正或统一尺寸。

## 四种不同任务

| 你想改变的内容 | 与本例的关系 |
| --- | --- |
| 清空随文件保存的左侧书签导航 | 本例检查活动 Catalog 与可达书签树 |
| 删除纸面目录页或正文页面 | 本轮没有删除页面，三页正文仍在 |
| 临时隐藏阅读器侧栏 | 不会据侧栏外观代替文件结构核对 |
| 移除页面里的链接 | 不是本例目标，原页内 Link 结构另行记录 |

原第 1 页的 `/Link` 注释在成品中仍结构性指向当前第 3 页，注释 `/P` 属于当前第 1 页。没有点击阅读器链接或书签，结构存在不等于已验证任意阅读器跳转。也不能把移除活动书签当作删除文件中所有历史对象、不可恢复的信息清理或隐私擦除。

主观察没有遍历全部历史对象或垃圾；独立有限的已知标题原始字节探针在原稿本身也没有命中，不能用这个结果证明成品已经彻底清除旧标题的所有表示方式。

## 三张图与保存记录

`settings.jpg` 是真实的三项书签已选中及“删除选中 (3)”菜单。`empty.jpg` 是删除后工具显示 0 项、空列表和仍可保存的状态。它们属于操作界面，不单独证明原生书签移除或阅读器效果。

`comparison.png` 是已有本地分析联系表，以 pdftoppm 25.03.0、54 dpi 并按真实 CropBox/Rotate 渲染三个原页与三个原生页，再等比缩略排布。它说明本例页面显示与原有几何，活动书签 3→0 来自文件结构报告；该图不是产品预览、书签点击或安全擦除测试，本包未重新渲染。导出完成截图保留为原始阶段身份记录，不另外堆入公开预览。三份原 DOM TXT 仅核对文件身份，不读取正文或公开复制。

本轮输出文件名保持默认；没有继续编辑、第二次导出、重复点击下载或阅读器交互。下载事件等待 10 秒超时后，按原界面文件名取得唯一新鲜文件，保持原字节；这不是重试可靠性验证。

## 检查计数和公开副本

主观察为 45/45，其中包含输入冻结 6 个文件和原生阶段冻结 11 个文件的身份约束。独立原生观察 46/46、独立参考源检查 23/23 分列。早期准备独审 6 组只是任务记录提供的历史信息，不能当作输入冻结文件数或输入描述总数；各项不相加作产品成功率。

`checks.json` 保存完整主报告、独立报告、总结与相关 JSON。公开副本只逐字段把本地绝对路径替换为文件名，同时列出原报告的字节/SHA、字段与原值摘要。输入冻结只提供名称、字节和 SHA 身份投影，明确省去本地路径。旧计划中的确认删除步骤、null、pending 和下载记录的“分析待完成”保留原阶段；实际没有确认弹窗的观察另列，不回填改写旧记录。

本例只有一份正常三页自编 PDF，不证明签名、表单、附件、加密文件、大文档、所有 PDF 属性或全部阅读器效果。原稿和原生下载的容器字节不同，不称全部属性无损。外层 ZIP 为本地整理的核对包，不是产品 ZIP。解压后可执行 `python3 -I -S verify_pdf_remove_bookmarks_snapshot.py`，仅核对固定文件、PDF 头尾、图像签名及完整已存 JSON；校验器不解析 PDF、解码图片、解压媒体、重算活动书签、渲染、点击阅读器或调用产品。
