Skip to content

Releases

LeebertyPDF 1.0.0

Choose a tag to compare

@leerogerstheman leerogerstheman released this 05 Oct 20:11

LeebertyPDF 1.0.0

一个为 Windows 打造的本地优先 PDF 阅读器。渲染用 Mozilla 官方的 PDF.js 6.3.289
(与 Firefox 内置阅读器同源),外层界面、批注系统、页面编辑器与 PDF 解析引擎全部自研。
不联网、不登录、不收集任何数据,所有文件与批注只留在本机。

下载

文件 说明
LeebertyPDF-1.0.0-portable-win-x64.zip 便携版(推荐),133 MB。解压到任意目录,双击 LeebertyPDF.exe 即可,绿色免安装。

需要 Windows 10 / 11 (x64)。解压后约 331 MB —— 里面含完整的 Electron/Chromium
运行时,这也是它不依赖任何系统组件、解压即用的原因。

亮点

  • 阅读 — 标签页、目录大纲、缩略图、书签、阅读进度记忆、全文搜索(带命中的高亮与计数)、
    夜间/智能反色、单页/双页/横向布局、演示模式、适合宽度/适合页面/实际大小。
    图像密集型页面通过提高画布上限保持清晰,而不是随缩放糊掉。
  • 批注与编辑 — 高亮、墨迹、文本框、图章、签名,以及一个独立橡皮擦:
    它按几何位置把批注与存储条目配对,因此别的阅读器写入的、或从未被打开成编辑器的批注
    同样能擦掉。批注会写回文件本身,在 Acrobat / Firefox / 预览 里打开都正常。
  • 页面编辑 — 重排、旋转、删除、插入、合并、拆分、提取。跑在自己写的对象级 PDF 引擎上:
    词法分析 → 文档 → 编辑器,支持经典 xref、xref 流、对象流、混合 XRefStm,
    Flate/LZW/A85/AHx/RunLength 解码加 PNG/TIFF 预测器,以及裸 N G obj 扫描兜底。
    DCTDecode 图像流按字节原样透传,不重新编码 —— 这是图像文档无损且快速的关键。
  • 图文重排 — 单栏阅读视图。按文字位置还原行与段落,标题自动放大;
    图片位置取自页面操作符表里 transform + paintImageXObject 的真实变换矩阵
    (不是猜的),矢量图用墨迹扫描兜底,两者重叠时以精确矩形为准;裁图会裁到实际墨迹。
  • 省内存 — 重排里的图形平时只存一份紧凑 PNG 数据,滚到视口附近才挂载位图,
    离开即释放;缩略图随文档切换释放并按数量上限淘汰。滚动完 24 页相册后关闭全部标签页,
    画布占用从 7.3 MB 降到 0。

修掉的两个真问题

  • 第 3 页之后全空白:.pdfViewer 与 .pdf-container 的滚动/宿主角色装反了,
    PDF.js 量到的 scrollTop 永远是 0,可见元素被钉死在第一屏。已修正并加了回归探针。
  • 双击没反应:启动器用 ProcessStartInfo.EnvironmentVariables 过滤环境变量,
    而 .NET Framework 这个属性的 getter 会用「大小写不敏感」的字典装载「大小写敏感」的
    环境块 —— 只要 NO_PROXY 和 no_proxy 同时存在(配了代理的机器很常见)就抛异常,
    且发生在建窗口之前,表现为闪退无提示。现在改用 cmd /c set "X=" & electron 绕开。

验证

仓库自带测试台,全部通过:

项目 结果
PDF 引擎单测 20/20(纯 Node,不需要 Electron)
功能体检 47/47,0 控制台错误
界面自测 PASS,无渲染层报错
空白页探针 PASS,可见页全部绘制
图像大文件 5/5,0 控制台错误
内存探针 分阶段记录 JS 堆 / 画布背储 / DOM 节点

已知限制

  • 加密 PDF 只读:PDF.js 的 saveDocument() 无法导出加密文档,此时请用「导出页面为图片」。
  • 未做代码签名:首次运行 Windows SmartScreen 可能提示,选择「仍要运行」即可。
  • 重排不重排表格(表格会被当作多个文字段落,列关系丢失)——那需要完整的版面分析引擎,
    收益不值这个复杂度。当前目标是「能读、能复制、图片不丢」。
  • 超大文档(>500 页)首次打开缩略图会边滚动边生成,属预期行为。

许可

应用代码 MIT。渲染内核为 PDF.js(Apache-2.0),
许可证文本随包提供(resources/app/src/renderer/vendor/pdfjs/LICENSE_pdfjs.txt)。