- 图形学
- 图像处理
【免费下载链接】mupdf
mupdf mirror
mupdf-gl 是 MuPDF 仓库中基于 OpenGL + FreeGLUT 的跨平台 GUI 查看器,可显示 PDF、XPS、CBZ、EPUB/FB2 文档以及 SVG 等常见图片格式。本篇以官方文档 docs/tools/mupdf-gl.md 为主体,逐条覆盖其命令行选项、操作示例、鼠标与键盘绑定,并结合 platform/gl/gl-main.c 等源码补充默认值、启动流程、历史记录机制等文档未展开的实现细节,帮助读者从“会用”深入到“知其所以然”。
一、mupdf-gl 在项目中的定位
从 Makefile 可以看到,mupdf-gl是条件构建目标:只有当HAVE_GLUT=yes时才会编译platform/gl/*.c下的所有源文件(gl-main.c、gl-app.h、gl-input.c、gl-ui.c 等),链接libmupdf、第三方库与libmupdf-glut静态库。若系统已有 FreeGLUT,可设USE_SYSTEM_GLUT=yes,否则使用仓库自带的 thirdparty/freeglut;Windows 下则通过 platform/win32/mupdf-gl.vcxproj 构建,入口为WinMain。
它与同为查看器的mupdf-x11(仅 Linux X11)不同,mupdf-gl 依赖 OpenGL 管线渲染页面位图,是 Windows、macOS(通过 glut 回调)和 Linux 上的通用图形界面。
二、命令行选项全表
官方文档给出的调用形式为:
mupdf-gl [options] document [page]其中page是初始页码(源码中解析为anchor,见 gl-main.c)。下表完整继承文档所列选项,并用源码核对出的默认值补充了“默认值/实现”一栏:
| 选项 | 说明 | 默认值 / 实现要点(来自源码) |
|---|---|---|
-p password | 打开加密 PDF 所需的密码 | 存入password全局变量 |
-c profile.icc | 加载用于显示的 ICC 配置文件 | 缺省使用 sRGB(DeviceRGB)。源码中通过fz_new_icc_colorspace建立 ICC colorspace,未提供时回退fz_device_rgb(gl-main.c) |
-r resolution | 初始缩放级别,单位为 DPI | 文档标注默认 72;从源码结构看,当前仓库将初始 zoom 定义为DEFRES 96,且解析后会再乘以 UI 缩放系数ui.scale(gl-main.c) |
-W width | EPUB 版式页面宽度(点) | FZ_DEFAULT_LAYOUT_W |
-H height | EPUB 版式页面高度(点) | FZ_DEFAULT_LAYOUT_H |
-S size | EPUB 版式默认字号(点) | FZ_DEFAULT_LAYOUT_EM |
-U stylesheet | 加载用户 CSS 样式文件用于 EPUB 版式 | 以位掩码layout_use_css |= 2启用用户样式 |
-X | EPUB 版式忽略出版方样式 | layout_use_css ^= 1,即切换 publisher-css 位 |
-J | 禁用 PDF 表单中的 JavaScript | enable_js取反 |
-A level | 设置抗锯齿级别/像素渲染规则 | 0=关闭;2=4 级;4=16 级;8=256 级;9=像素中心规则;10=像素任意部分规则;默认currentaa = 8 |
-I | 以反色模式启动 | currentinvert取反 |
-B hex-color | 设置黑色色调(tinted) | 默认303030(源码0x303030) |
-C hex-color | 设置白色色调 | 默认FFFFF0(源码0xFFFFF0) |
-Y factor | 设置 UI 缩放系数 | 默认由屏幕 DPI 计算得出,经ui_init_dpi(scale)生效 |
文档未列出、但源码实际支持的选项
main()中的 getopt 字符串为"p:r:IW:H:S:U:XJb:A:B:C:T:Y:R:c:vf"(gl-main.c),usage()帮助文本还列出了以下文档未记载的选项,实际使用时同样有效:
-b box:使用指定页面 box 渲染,可取 MediaBox、CropBox、BleedBox、TrimBox、ArtBox(fz_box_type_from_string);-R options:启用 reflow 模式(阅读模式),并设置文本抽取选项,示例mupdf-gl -R dehyphenate,preserve-images book.epub;-T tracefile:将交互操作记录为 JavaScript 风格的跟踪脚本(源码中trace_action输出如page.update()、doc.loadPage(n)等语句,可配合mutool run复现);-f:以全屏模式启动;-v:输出版本号后退出;--external-access:允许文档访问其所在目录中的外部资源(用于本地资源引用的 EPUB 等)。
三、常用示例
文档给出的两个基础用法:
# 不带参数启动:弹出文件浏览器窗口 mupdf-gl # 以反色模式打开指定文件的第 10 页 mupdf-gl -I mupdf_explored.pdf 10结合上表的补充示例(均可直接复制运行):
# 使用广色域 ICC 配置、150 DPI 缩放打开 PDF mupdf-gl -c display-p3.icc -r 150 report.pdf # 打开 EPUB:宽 900pt、字号 20pt,并应用用户样式 mupdf-gl -W 900 -S 20 -U user.css -X book.epub # 色调模式(米色纸张感):黑 303030、白 FFFFF0,再叠加反色 mupdf-gl -C FFFFF0 -I scan.pdf启动时的缩放细节值得一知:main()在加载文档后会检查页面纹理尺寸是否超出可用屏幕(GLUT_SCREEN_WIDTH/HEIGHT减去边框预留SCREEN_FURNITURE_W/H),若超出则按比例缩小currentzoom,保证初始窗口不被页面撑破(gl-main.c)。
四、鼠标绑定
文档明确两个鼠标行为:
- 中键(滚轮按钮):平移(pan)文档视图;
- 右键:框选区域并将所选文本复制到剪贴板。
这一行为与源码中的help_dialog_text帮助文本完全一致(gl-main.c)。
五、键盘绑定
文档说明多个快捷键支持“数字参数前缀”,例如输入150z可将缩放设为 150 DPI。数字参数在 gl-input.c 的按键处理中暂存、待命令键触发时生效。完整绑定表如下(前部分来自文档,带 * 的条目补充自源码帮助文本 gl-main.c):
| 按键 | 动作 |
|---|---|
F1 | 显示帮助(F1 帮助对话框即源码help_dialog文本) |
F12* | 显示 JavaScript 控制台(需启用 JS 的构建) |
i | 显示文档信息 |
o | 显示文档大纲 |
u* | 显示撤销(undo)历史 |
Y* | 显示图层(layer)列表 |
L | 高亮链接 |
F | 高亮表单字段 |
a | 显示批注编辑器 |
R* | 显示编辑(redaction)编辑器 |
x* | 显示鼠标坐标 |
r | 重新加载文档 |
S | 保存文档(仅 PDF) |
q | 退出查看器 |
\</\> | 减小 / 增大电子书字号 |
I | 切换反色模式 |
C | 切换色调(tinted)模式 |
E | 切换 ICC 色彩管理 |
e | 切换专色(spot color)模拟 |
A | 切换抗锯齿 |
B* | 在 MediaBox/CropBox/ArtBox 等 box 间切换 |
c* | 切换 document/user CSS |
f | 切换全屏 |
w | 收缩窗口至页面大小(shrinkwrap) |
W | 页面宽度适应窗口 |
H | 页面高度适应窗口 |
Z | 页面整体适应窗口 |
[number] z | 设置缩放分辨率(DPI) |
+/- | 放大 / 缩小 |
[/] | 逆时针 / 顺时针旋转 |
方向键或hjkl | 小步长平移页面 |
b | 智能回退一屏 |
space | 智能前进一屏 |
,或 Page Up | 后退一页 |
.或 Page Down | 前进一页 |
g* | 跳到第一页 |
[number] g | 跳到指定页码 |
G | 跳到最后一页 |
m | 将当前位置保存进导航历史 |
t/T | 后退 / 前进导航历史 |
[number] m | 保存为编号书签 |
[number] t | 跳到编号书签 |
/ | 向前开始搜索 |
? | 向后开始搜索 |
n/N | 继续向前 / 向后搜索 |
关于放大/缩小的一个实现细节:+/-并非按固定步长缩放,而是沿着一个预定义的 DPI 序列取上/下一档(gl-main.c):
static const int zoom_list[] = { 6, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 144, 168, 192, 228, 264, 300, 350, 400, 450, 500, 550, 600 };因此连续按+会以非线性的档位递增,最低 6 DPI、最高 600 DPI。
六、源码纵深:启动流程、搜索与持久化
6.1 启动主流程
从main()的结构看(gl-main.c),mupdf-gl 的启动顺序是:
glutInit后按 getopt 解析全部选项;ui_init_dpi(scale)依屏幕 DPI 计算 UI 网格尺寸,随后currentzoom *= ui.scale;fz_register_document_handlers(ctx)注册所有格式 handler(这也是它能同时打开 PDF/XPS/CBZ/EPUB/SVG 的原因);- 若给了
-c则读取 ICC 文件构造 colorspace,否则用 DeviceRGB; - 带文件名启动时:
load_document()→ 若给了-R则reflow_document()(把 EPUB 等转为 reflow 文档)→load_page();不带文件名时则初始化“打开文档”对话框,由fz_recognize_document过滤可识别文件(gl-main.c); - 进入
glutMainLoop()事件循环;退出时在cleanup()中先save_history()、再尝试save_accelerator()(页面缓存文件)。
6.2 文本搜索
/、?、n、N背后的搜索状态集中在 gl-main.c:搜索默认选项为FZ_SEARCH_IGNORE_CASE(忽略大小写),命中的 quad 最多缓存 5000 个(fz_quad search_hit_quads[5000]),并在屏幕上以高亮显示。
6.3 阅读历史与页面缓存
- 阅读位置:
m/t/T与[number] m/t操作的history、future、marks数组(各 256/256/10 条)会被序列化为 JSON 持久化到~/.mupdf.history,可被环境变量MUPDF_HISTORY、XDG_CACHE_HOME覆盖(gl-main.c)。下次打开同一文件时自动恢复current位置与书签。 - 页面缓存(accelerator):
fz_save_accelerator将渲染页写入 XDG 缓存目录(如~/.cache/mupdf/,文件名由绝对路径转义而来,见convert_to_accelerator),仅对支持该机制的文档类型生效(fz_document_supports_accelerator),可显著加快二次打开速度。 - 外部链接:点击指向外部 URL 的链接时,只放行
file://、http(s)://、mailto:前缀,经确认对话框后调用系统浏览器(Linux 用BROWSER环境变量或xdg-open,macOS 用open,Windows 用ShellExecuteA,见 gl-main.c)。
6.4 修改与保存
S保存与退出/重载时的确认逻辑:若pdf_has_unsaved_changes为真,会弹出含 Save/Discard/Cancel 的对话框(quit_dialog/reload_dialog),避免批注丢失;窗口标题中文件名后加*表示存在未保存修改(update_title)。
七、小结与使用建议
- mupdf-gl 是“一个二进制开遍格式”的通用查看器:命令行选项覆盖加密文档(
-p)、色彩管理(-c/-B/-C/-I)、EPUB 版式(-W/-H/-S/-U/-X)与 PDF 表单 JS(-J); - 文档未记载但源码确实支持的
-R(reflow 阅读模式)、-T(操作跟踪脚本)、-f(全屏)值得在实际部署中利用,尤其是-T生成的 JS 可直接用mutool run做回归验证; - 阅读历史与页面缓存都落在用户目录,清理
~/.mupdf.history与~/.cache/mupdf即可重置状态; - 所有键盘绑定均可在运行中按
F1随时查看,源码帮助文本 gl-main.c 是键位最全的权威清单。
- 图形学
- 图像处理
【免费下载链接】mupdf
mupdf mirror
相关推荐
MuPDF JavaScript OutlineIterator 完全指南:遍历、查询与编辑文档书签
MuPDF JavaScript OutlineIterator 完全指南:遍历、查询与编辑文档书签 OutlineIterator 是 MuPDF JavaS
图形学图像处理MuPDF终极指南:轻量级PDF查看与转换框架完全解析
MuPDF终极指南:轻量级PDF查看与转换框架完全解析 MuPDF是一个轻量级的开源PDF查看器与文档转换框架,专为高性能PDF渲染和处理而设计。在PDF文档处
图形学图像处理SumatraPDF 仓库中的 MuPDF Android 集成指南:从嵌入查看器到源码级定制
SumatraPDF 仓库中的 MuPDF Android 集成指南:从嵌入查看器到源码级定制 本篇技术指南以 MuPDF 官方 Android 使用文档( e
桌面应用文档
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考