正文内容:
大家好,分享一个最近完成的实用小工具:PaperVaultQR (赛博冷存储)。
👉 GitHub 地址:https://github.com/100pangci/PaperVaultQR
不知道大家平时是怎么备份加密钱包助记词、Bitwarden 导出库、GPG/SSH 私钥这些极低频但要命的数据的? 我的选择是“终极冷备份”:物理纸张打印。
但直接打印 Base64 乱码的话,几页纸不仅费眼,真到了需要恢复的时候,OCR 的错误率绝对能让人崩溃。所以我顺手做出了这个工具。
📸 界面截图
- 编码:把任何文件(纯文本或二进制文件,自动 Base64 )按
500字符切片,生成 M 级容错的二维码,并自动排版成标准的 A4 纸、4 列的 Word 文档,打开直接点打印就行。 - 解码:把扫描后的图片(手机拍的也行)放在一个文件夹里,丢给它,它能自动按顺序提取、校验、并无损还原成原始文件(连原始文件名都能保留)。
💡 核心亮点:强力抗污损的“抠图式”解码算法
很多同类工具的通病是:一张 A4 纸上如果有 20 个二维码,直接调用 pyzbar 识别,经常会漏掉几个,导致整个文件无法还原。
为了解决这个问题,我构思了一套多阶梯的解码策略(大部分代码是我提供核心思路,然后指导 AI 辅助编写完成的):
- 高阈值二值化(去底噪):首先对扫描图进行高阈值( 220 )二值化处理,强行抹除纸张纹理、轻微折痕和阴影。
- 连通域分析与物理裁切(核心):在二值图上寻找黑色连通域(模拟寻找二维码定位块/主体),找到区块后,向外扩展 20px 生成 Bbox 边界框,将每一个二维码从大图上“抠”下来,单独喂给解码器。
- 多重 Fallback 机制:如果连通域裁切有遗漏,程序还会自动采用“原图”、“灰度图”、“自动对比度图”进行多重回放扫描。配合并发线程池(
ThreadPoolExecutor)和seen_payloads集合去重,极大地拉高了召回率。
同时,在生成 Word 排版时,我没有用复杂的坐标计算,而是**利用了 Word 原生的单行大表格属性 (autofit=False)**,让引擎自己去计算跨页断行,保证了打印格式绝对不会错乱。
提供纯命令行和带界面的 GUI ( Release 页面有打包好的 Windows exe ,Linux 也可跑)。
# 生成打印文档 (支持多文件)
python src/core/auto_split_qr.py path/to/input.txt
# 恢复扫描内容 (扫描目录里的图片)
python src/core/scanner_decoder.py path/to/scanned_images_folder
# 打开带界面的 GUI
python src/gui.py
⚠️ 警告
- 请勿裸奔:二维码也是明文!请务必只备份已经加密过的数据(例如带密码的压缩包、已加密的钱包私钥)。未加密的数据拿微信扫一下就全漏了。
- 介质寿命:如果你用家用喷墨打印机,记得用防水自封袋密封或者过塑,防止受潮洇墨。
造轮子不易,如果这个小工具刚好能解决你的备份焦虑,或者觉得解码算法的思路有点意思,欢迎去 GitHub 赏个 Star ⭐️ !
也欢迎大家在帖子里聊聊:你们手里最核心的数据,现在用的是什么极致的备份方案?