打造全键盘操作的PDF阅读器

其实我只想要一个非常简单的PDF阅读器,不要很花哨的功能,只要能够:

  1. 速度够快,不要翻一页等半天;

  2. 全键盘操作,不想在鼠标和键盘之间来回倒腾;

  3. 可以改变背景色,深夜的白光好刺眼;

  4. 自由旋转页面,有些PDF的页面简直是太斜了;

用过PDF Expert、PDF Reader、Skim……,发现这些个玩意还没有系统自带的Preview好用。轮子不够,看来只能自己造了,谁叫咱是码农呢?

最接近我需求的是Mupdf,但是这货问题太多而且需要XQuartz的支持,要X11支持也就算了, 竟然还不能全屏 ,这意味着EI Capitan的Splitview也无法使用。

编译好的macOS执行文件 https://pan.baidu.com/s/1misB9GG

去除X11的依赖,用Cocoa窗口

好在mupdf源代码支持多平台,可以用OpenGL,而OpenGL与Cocoa结合很紧密,所以工程的关键是让mupdf用glfw来建立窗口,具体步骤我在Github上说了很多,这里就不啰嗦

修改Bug,增加快捷键操作,添加功能

这开源代码的Bug就是多啊,不过不要紧,谁叫咱是码农呢?修改的几个主要问题在Github上我也提到了,咱说如何使用吧

命令行打开,键盘阅读

打开文件的正确方式是在终端中运行如下操作:

  mupdf-gl filename.pdf <page>

干嘛不来一个Bundle App?再设计一个菜单,从菜单中选择打开文件,最好再搞一个Command+O之类的快捷键,再整合到Findle的右键菜单……
等等,咱是码农,对吧?码农打开文件的正确方式难道不是在终端中输入命令的吗?

左边是打开的PDF

Splitview方式

左边是裁边之后的效果,右边是原始页面

运指如飞

Vim 常用键大部分都有,我又整合进去了一部分
h,j,k,l,你懂的
空格键,d,u,b当然是上下翻页了
+,-放大缩小
x,y 进行左右或上下裁边,如果裁多了,按大写X,Y缩小裁边区域
w,W,H 自适应宽度和高度
q一键退出,别乱按
m,t书签跳转
g前面加一个数字就是跳转到指定页面
[,]左右旋转,微调不正的页面,这个太有用了
v 反转颜色
还有好多,你自己摸索下?

旋转页面之前

旋转之后

反转颜色

背景色任意换

由于是采用OpenGL绘图,换一个背景色那是相当的Easy!启动的时候指定RGB就行

  mupdf-gl -C 0xFDF6E3 filename.pdf

经典的Solarized light

  mupdf-gl -C 0x00F600 filename.pdf

随意来一个绿色

源代码

想自己编译的可以在Github下载,最新的代码都在 https://github.com/dean-wong/... ,有空就帮忙点一个Star吧^_^

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397174.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python筛选含变量的特定行_Python SQL从特定变量字段中选择行

我想从基于随机变量的行中获取一个特定的值。下面是一个示例表&#xff0c;PID列是一个“自动递增主键整数”&#xff0c;其他两列是文本示例表PID NAME PHONE--- ---- -----1 bill 999-99992 joe 888-8888我想把一个随机变量扔到桌子上randomVariable raw_input(Enter someth…

mysql 导出dmp文件_一文带你了解MySQL主从复制(Master-Slave)

1.复制概述Mysql内建的复制功能是构建大型&#xff0c;高性能应用程序的基础。将Mysql的数据分布到多个系统上去&#xff0c;这种分布的机制&#xff0c;是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上&#xff0c;并重新执行一遍来实现的。复制过程中一个服务器充当…

iOS开发学无止境 - NSFileManager文件操作的十个小功能

&#xff08;配图的小故事还记得嘛&#xff09; NSFileManager是一个单列类&#xff0c;也是一个文件管理器。可以通过NSFileManager创建文件夹、创建文件、写文件、读文件内容等等基本功能。 下面将介绍NSFileManager文件操作的十个小功能。我们在Documents里面进行举例&#…

smokeping自动检测系统

如何的使用smokeping来监控idc机房的网络质量情况&#xff0c;从监控图上的延时与丢包能分辨出你机房的网络是否稳定&#xff0c;是否为多线&#xff0c;是否为BGP机房&#xff0c;到各城市的3个运行商网络各是什么情况&#xff0c;如果出现问题&#xff0c;如果有针对的解决。…

ElasticSearch聚合分析

聚合用于分析查询结果集的统计指标&#xff0c;我们以观看日志分析为例&#xff0c;介绍各种常用的ElasticSearch聚合操作。 目录&#xff1a; 查询用户观看视频数和观看时长聚合分页器查询视频uv 单个视频uv批量查询视频uvHaving查询 根据 count 进行过滤根据其它指标进行过滤…

bg感_【0328】BG推文 | 5本我在逃生游戏里养娃娃+岁月缱绻已无你+关于我比女主苏这回事+消失的白月光又回来了等...

大家多多支持原文&#xff01;以下内容多为网络搜集&#xff0c;非商业用途。版权归原作者所有&#xff0c;侵联&#xff01;BG文《我在逃生游戏里养娃娃》作者&#xff1a;鹤舫闲人《岁月缱绻已无你》作者&#xff1a;酒爷《关于我比女主苏这回事》作者&#xff1a;欢何极《消…

android 屏幕最小宽度_AndroidTV屏幕适配-smallestWidth(最小宽度) 限定符

背景前几天接到一个需求&#xff0c;把项目上的原来的2k屏幕适配到4k屏幕。我采用的是smallestWidth最小宽度限定符进行适配的我们项目的。1&#xff0c;smallestWidth 限定符适配原理系统都是根据限定符去寻找对应的 dimens.xml 文件。例如在最小宽度为 720dp 的设备上&#x…

mysql 组合索引

MySQL单列索引是我们使用MySQL数据库中经常会见到的&#xff0c;MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解&#xff0c;下面就为您分析两者的主要区别&#xff0c;供您参考学习。 为了形象地对比两者&#xff0c;再建一个表&#xff1a; CREATE TABLE myInde…

cmake使用总结(转)---工程主目录CMakeList文件编写

在linux 下进行开发很多人选择编写makefile 文件进行项目环境搭建&#xff0c;而makefile 文件依赖关系复杂&#xff0c;工作量很大&#xff0c;搞的人头很大。采用自动化的项目构建工具cmake 可以将程序员从复杂的makefile 文件中解脱出来。cmake 根据内置的规则和语法来自动生…

微信开发者工具 wxmi修改模版颜色_十款高效好用的在线网页工具,提升你的办公效率...

大家好&#xff0c; 我是阿毛&#xff0c;今天给大家推荐高效办公的10个在线网页工具&#xff0c;可以不用下载安装很多app&#xff0c;也不用在电脑上装很多软件。在线制作精彩视频操作非常简单&#xff0c;选择模板&#xff0c;上传照片然后点击制作等待完成就可以了&#xf…

三星ml1660拆机图解_三星s6拆机图解介绍

三星s6拆机图解介绍三星s6怎么拆机?不管你是手机维修者还是狂热的手机玩家&#xff0c;相信对您手中的三星s6内部构造和组装步骤应该都是非常有兴趣的吧?今天绿茶通过Fixit发布的三星s6拆机教程来和大家一起分享一下三星s6拆机步骤&#xff0c;从三星s6的内部构造一起来了解一…

Ajax请求利用jsonp实现跨域

跨域: js有一个同源限制,简单说来源不一样的话就无法相互间交互.那么怎么算来源不一样呢, 举个例子:浏览器访问-->服务器A--->得到页面A---页面A中的js脚本只能访问服务器A的资源(相同域名和端口,此外域名与对应的ip也算不同源,要么都域名,要么都ip). 以上就是js的跨域问…

[转]使用Navicat for Oracle工具连接oracle的

使用Navicat for Oracle工具连接oracle的 这是一款oracle的客户端的图形化管理和开发工具&#xff0c;对于许多的数据库都有支持。之前用过 Navicat for sqlserver,感觉很好用&#xff0c;所以下载了Oracle版的用。上网查看了一下这个工具可以用于任何版本 8i 或以上的 Oracle …

微信小程序基于第三方插件微信同声传译,以及一些问题解决办法

使用之前首先得在微信微信小程序后台添加插件&#xff0c;获取插件的appid 名称 使用时在app.json文件添加插件配置 1 plugins: { 2 WechatSI: { 3 version: 0.1.0, 4 provider: wx069ba97219f66d99 5 } 6 } 其次就是在使用的页面进行调用 在index.js外…

TF卡里删掉文件后内存没变大_内存卡损坏怎么修复?数据恢复方法教程

内存卡损坏怎么修复&#xff1f;内存卡又叫SD卡&#xff0c;是一种很轻便小巧的便携存储装置&#xff0c;往往内置于各种便携媒体设备内部。内存卡本身具有坚固、抗冲击等外部特性和读写快、空间大等内部特性&#xff0c;但是内存卡因为每天都要读写大量数据很容易从内部发生损…

apollo持久化sentinel_Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则

上一篇我们介绍了如何通过Nacos的配置功能来存储限流规则。Apollo是国内用户非常多的配置中心&#xff0c;所以&#xff0c;今天我们继续说说Spring Cloud Alibaba Sentinel中如何将流控规则存储在Apollo中。使用Apollo存储限流规则Sentinel自身就支持了多种不同的数据源来持久…

Lintcode: Unique Paths

C dp 递推式&#xff1a;dp[i][j] dp[i-1][j] dp[i][j-1] 初值&#xff1a;dp[i][j] 1&#xff0c;i0 or j0 空间优化&#xff1a;省掉一维 1 class Solution {2 public:3 /**4 * param n, m: positive integer (1 < n ,m < 100)5 * return an integer6…

idea 如何隐藏/展示不想看到的文件

隐藏&#xff1a;在 Ignore files and folders中添加想要过滤的文件或文件夹名称 展示隐藏文件&#xff1a; 在过滤列表中删除掉文件或者文件夹就好了 转载于:https://www.cnblogs.com/mengjianzhou/p/6177897.html

BZOJ2286: [Sdoi2011]消耗战(虚树)

BZOJ2286: [Sdoi2011]消耗战 Time Limit: 20 Sec   Memory Limit: 512 MB Description 在一场战争中&#xff0c;战场由n个岛屿和n-1个桥梁组成&#xff0c;保证每两个岛屿间有且仅有一条路径可达。现在&#xff0c;我军已经侦查到敌军的总部在编号为1的岛屿&#xff0c;而且…

Java基础知识:Java实现Map集合二级联动4

comboBox.setModel(new DefaultComboBoxModel(getProvince())); // 添加省份信息 final JLabel label new JLabel(); label.setText("省/直辖市"); label.setBounds(155, 30, 66, 18); panel.add(label); final JLabel label_1 new JLabel(); label_1.setText(&quo…