一款基于Avalonia跨平台不联网免费且轻量的Pdf阅读器
一款基于Avalonia跨平台不联网免费且轻量的Pdf阅读器
为什么写 AirPDF
每天都要读 PDF,这些年换过不少阅读器,但一个都没能长期留在电脑上。
浏览器自带的查看器最省事,打开就走。可文档一多就散在标签堆里,找不回上次读到哪;缩略图、目录、阅读位置这些它都不管。装过的桌面阅读器反过来,功能堆得很满,启动要等,界面上大半按钮我从来没点过;有几个还要登录。还有一类是 Electron 做的,为了看一页纸,先起一个 Chromium。
所以想自己写一个。目标很小:打开文档,把页面放在你面前,然后闭嘴。
为此定了四条规矩:
- 不联网。阅读路径上不许有任何网络请求。
- 不要账号。没有登录,没有云同步,没有订阅。
- 不用内嵌浏览器。界面和渲染都在同一个原生进程里。
- 启动即用。不该有需要盯着看的"加载中"。
技术上还有另一半动力:想验证 .NET 加 Avalonia 到底能不能做出一个反应快的桌面应用。不少人对 .NET 桌面程序的印象还停在启动慢、内存大,而 Avalonia 的绘制路径和 WPF 不是一回事。这个项目算是我自己的答案——如果做不到快,它就没有存在的理由。
名字里的 Air 是"轻"的意思。不是指安装包小,是指打开和翻阅的时候感觉不到它。

阅读界面:左侧缩略图与目录,顶部页码与缩放,底部文件信息
现在有什么#
阅读#
- 基于 PDFium 的原生渲染,按实际显示比例解码,高 DPI 下保持清晰
- 连续滚动,页面虚拟化,只渲染视口附近的几页
- 缩略图侧栏和文档目录,页码可以直接输入跳转
- 全文搜索,结果按页分组,匹配处会在页面上画框
- 鼠标拖选、双击选词、全选、复制
- 超链接:文档内跳转到目标页,
http、https、mailto交给系统处理 - 加密 PDF 自动弹出密码框

搜索:结果按页分组,命中位置在页面和高亮框里同时标出
导航与记忆#
- 阅读位置按文档记忆,精确到页内偏移
- 缩放模式按文档记忆:适合宽度、适合页面,或某个固定比例
- 从目录、缩略图、搜索、页码跳转之后,可以用
Alt+Left回到原来的位置 - 状态栏显示当前位置和阅读进度百分比
界面#
- 浅色、深色、高对比度三套配色,跟随系统时会随系统明暗实时切换
- 英文和简体中文两套界面,
Ctrl+Shift+L即时切换 - 标签页与多窗口,共享同一份设置、主题和语言
- 工具栏按钮、输入框、列表都带无障碍名称

深色主题

中文界面与最近打开列表
跨平台#
同一份代码跑三个桌面平台,Windows、macOS 和 Linux 各有对应的构建产物,不依赖系统自带的 WebView,也不需要另外装运行时:
| 平台 | 发布产物 |
|---|---|
| Windows 10/11 | Velopack 安装器(支持自动更新)、便携 zip |
| macOS 13+ | arm64 / x64 的 pkg、便携包 |
| Linux | 便携 tar.gz(需要系统有 fontconfig) |
- 渲染后端 PDFium 的原生库按平台分别携带,开箱即用
- 每次发版三个平台一起构建,测试在 Linux CI 上跑
- 界面语言、快捷键、主题行为在各平台一致;
Cmd与Ctrl按平台自动映射 - 读中文文档时,Linux 上建议装一个 CJK 字体(例如
fonts-noto-cjk) - 目前三个平台的包都没有签名,Windows 和 macOS 会弹安全警告
工程#
- 安装版支持自动更新(Velopack)
- 命令行支持
--help、--version和--终止符 - 阅读过程中不产生任何网络请求,只有安装版检查更新时访问 GitHub
性能#
测试环境是本机,样本是美国法典的两卷公开数据(govinfo)。
| 场景 | 结果 |
|---|---|
| 打开 4,215 页 / 15.8 MB | 1.3 s |
| 打开 9,277 页 / 35.3 MB | 1.9 s |
| 单页渲染(同一文档) | 0.023 s |
| 4,215 页文档的内存占用 | 约 300 MB |
| 全文搜索(9,277 页) | 1.2–3.7 s |
打开文档后句柄常驻,翻页只渲染当前页,页面列表只实例化视口附近的页面,所以这些耗时基本不随页数线性增长。
搜索是例外。它目前还是逐页提取文本,没有做索引缓存,页数越多越慢,这也是它还留在待办里的原因。
接下来#
状态#
0.2 是预览版。阅读核心稳定,但上面那些限制都在,发布包也还没签名,Windows 和 macOS 会弹警告。
MIT 协议,代码在 https://github.com/RyzenWang/AirPDF ,issue 和 PR 都欢迎。
评论