打造全鍵盤操作的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.pswp.cn/news/397174.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397174.shtml
英文地址,請注明出處:http://en.pswp.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…