Episode 002
本地 PDF 工具,哪些功能真的留在电脑里?
用签名 Windows MSI 的桌面本地运行,实测 Stirling PDF 的合并、旧脱敏、新脱敏和 OCR 边界,公开保留哈希、签名、输入输出和失败分支。
一句话结论这轮桌面本地实测里,合并通过;旧 auto-redact 虽然返回 200 但目标文本仍可提取;统一 redact-execute 配合 IMAGE_FINALIZE 在当前样本通过;桌面本地 OCR 直接返回 403,不可用。
- 打包日期
- 2026-07-20
- 原始证据目录
- experiments/stirling-pdf/2026-07-20/
- 签名与哈希
- GitHub Release SHA-256 与下载值一致,Windows Authenticode 状态为 Valid
- 桌面本地 OCR
- POST /api/v1/misc/ocr-pdf 返回 403 This endpoint is disabled
本集视频
8 张公开证据图








四条结论与验收矩阵
- 合并通过:本地后端可调用,HTTP 200 后又独立确认页序 A1、A2、B1 全部正确,当前样本通过。
- 旧 auto-redact 失败:它能调用、能返回 200、也会吐出文件,但目标文本仍可提取,所以不能写成脱敏成功。
- 统一脱敏当前样本通过:统一 redact-execute 加 IMAGE_FINALIZE 在当前单页虚构样本里既保留黑框,也让独立文本提取变成 0。
- 桌面本地 OCR 不可用:本地后端确实起来了,但 OCR 接口直接返回 403 disabled,所以这轮不能虚构中文 OCR 准确率。
这轮怎么测
这期只用 experiments/stirling-pdf/2026-07-20/ 里的合成样本做核验:两个合并输入 PDF、一个带虚构手机号和邮箱的脱敏样本、一个 300 DPI 的中文图片 PDF,以及对应的本地输出、哈希和机器验收 JSON。页面的公开链接会保留同名原始证据路径。
- 只引用 experiments/stirling-pdf/2026-07-20/verification-results.json、run-report.md、supply-chain.json、inputs 和 outputs 里的证据,不用宣传页替代实测。
- 先核对供应链:v2.14.2 的 Windows MSI 下载哈希必须与 GitHub Release 公布值一致,Authenticode 必须是 Valid,签名主体是 Stirling PDF Inc。
- 合并不只看 HTTP 200,还要独立读取 merged-a1-a2-b1.pdf,确认三页顺序与 expected-results.json 的 A1、A2、B1 完全一致。
- 旧脱敏路径不把文件名里的 redacted 当结果,而是继续做独立文本提取,看手机号和邮箱是否还留在输出里。
- 统一脱敏路径要同时看视觉黑框和文本提取字符数是否归零,并把边界写明为当前单页虚构样本,不外推到所有复杂 PDF。
不能夸大的边界
- 这不是“全部离线”或“绝对隐私”的证明。run-report.md 只记录了一个受限的 loopback 观察窗口,不能证明程序永远不联网。
- 这不是“OCR 准确”或“桌面中文 OCR 可用”的结论。原始 OCR 请求在本地桌面模式直接返回 403 This endpoint is disabled。
- 这不是“全部 MIT”或“免费商用”的结论。project-research.md 和公开 LICENSE 来源都指出它是 open-core,桌面编辑器与 engine 目录有单独许可边界。
- 这不是所有 PDF 都能安全脱敏的保证。统一路径只在当前单页虚构样本通过,owner issue 6153 还记录了银行 PDF 的失败样本。
官方链接、许可边界与已知问题
官方 Release 页面,公开列出 Windows MSI、发布时间和校验值来源。
官方说明桌面版安装方式与运行边界。
官方说明 OCR 需要 Stirling Cloud 或自托管 Tesseract 后端,不等于桌面本地默认可用。
MIT 只覆盖未列入例外的内容,不能把整个项目简化成“全部 MIT”。
桌面编辑器目录单独许可,构成 open-core 边界的一部分。
engine 目录单独许可,不把“免费商用”写成默认前提。
owner issue 记录复杂 PDF 的手动脱敏失败边界,本页不把当前单页样本外推成通用结论。
owner issue 记录本地安装 backend offline 场景,提醒桌面运行并不等于每台机器零配置可用。
你可以怎样复测这期结论
如果你也想复测一款本地 PDF 工具,不要先问它“支不支持某功能”,而是先锁定你要公开的输入、输出、哈希、失败分支和不能夸大的边界。
- 先做合成样本,把隐私测试控制在虚构手机号、无效邮箱和公开可见的测试备注,不把真人数据放进流程。
- 先锁供应链,再跑功能:记录版本号、下载地址、GitHub Release 哈希、Authenticode 状态和签名主体。
- 每条功能结论都要有独立验收,不把 HTTP 200、按钮可点或文件名变化当成真正通过。
- 脱敏一定同时看可见输出和独立文本提取,必要时把目标字符串写进 expected-results.json 里做机器核验。
- 遇到本地桌面接口报 403、disabled 或缺少依赖时,直接把不可用写清楚,不补写主观体验分。
- 把官方文档、LICENSE 和 owner issue 分开记:文档说明意图,LICENSE 说明边界,issue 说明真实失败样本。
- 最后只公开你能复现的最强证据图、原始 JSON 和运行报告,让别人能沿着同一路径复测。
原始证据路径
保留原始公开证据路径,便于回看同一轮记录。
保留原始公开证据路径,便于回看同一轮记录。
保留原始公开证据路径,便于回看同一轮记录。
保留原始公开证据路径,便于回看同一轮记录。
保留原始公开证据路径,便于回看同一轮记录。