起因是因为 Zathura作为一款我很喜欢的使用键盘移动的PDF阅读器, 居然拥有如此糟糕的划词功能(Text Select), 其划词功能通过一个方框框选出一片区域, Zathura自动提取出其中的文本, 并自动复制到剪贴板, 看上去很美好但是存在两个问题:
-
选区粒度粗, 不能做到精准到某个字符
-
划词不准确, 有时候阅读PDF文章时, 框出来的内容要么会变得很多要么缺胳膊断腿
那么能否使其变得和Okular/Acrobat这类阅读器一样便利呢?
最开始希望自己阅读源码, 并尝试检索到对应的代码进行修改; 不过折腾了半天没法通过编译, 就懒得再折腾了.
不过后续开始在网上搜索, 看看有没有前辈对Zathura如此糟糕的功能提出改进, 意外地发现已经有 相关的讨论, 甚至发现已经有人提了相关的 issue, 并且有能人已经于3个月前提交了 PR并成功merge到develop分支中, 不过archlinux源的zathura和zathura-pdf-mupdf等插件都远远过期了…
那么为了体验到如此fantastic的功能必须要编译一下最新的zathura源码, 至此动力更加强劲了, 又折回去重新开始编译zathura.
从源码包编译Zathura
官方有比较清楚的 installation guide.
我们安装developer version, 首先是girara库, 由于archlinux此前为了安装zathura已经通过pacman安装过, 因而这里考虑沿用pacman下的girara.
随后安装zathura本体(与官网有一点不同):
1 $ git clone https://git.pwmt.org/pwmt/zathura.git
2 $ cd zathura
3 $ git checkout --track -b develop origin/develop
4 $ meson -Dprefix=/usr/ build
5 $ cd build
6 $ ninja
7 $ ninja install
官网直接通过meson build
生成的系统默认居然会安装到/usr/local
下的bin和lib等目录, 如果这样的话后续安装zathura-mupdf会报错Run-time dependency found: NO zathura (tried pkgconfig and cmake)
通过添加参数将其强制安装到/usr
下的对应目录即可解决该问题.
然后安装plugins, zathura没有后端的plugin则无法解析任何文件, 这里我们只考虑PDF, 选用zathura-pdf-mupdf, 官网也有一些 guide, 参考指令为:
1 $ git clone https://git.pwmt.org/pwmt/zathura-pdf-mupdf.git
2 $ cd zathura-pdf-mupdf
3 $ git checkout --track -b develop origin/develop
4 $ meson build
5 $ cd build
6 $ ninja
7 $ ninja install
不过遗憾的是并不能编译通过, 会报错找不到mupdf-third
和mupdf
这个C的第三方库, 相应的mesion配置文件为:
1...
2mupdf = dependency('mupdf', required: false)
3mupdfthird = cc.find_library('mupdf-third')
4
5...
6
7if not mupdf.found()
8 # normal build of mupdf
9 mupdf = cc.find_library('mupdf')
10 build_dependencies += [mupdf, mupdfthird]
11else
12
13...
这是因为首先还需要安装mupdf, 去
mupdf官网找到后下载源码包, 该源码包用Makefile管理, 通过make install
即可安装.
随后再次回头安装zathura-mupdf, 还是失败, 编译器告诉我们可能是库链接什么的问题.
回想到pwmt的guide中提到编译mupdf必须要加上-fPIC
(在编译动态库时用于生成位置无关的代码)选项, 在Makefile的CFLAGS中添加后重新install, 最后即可成功安装zathura-mupdf.
划词效果
简直是太好了!
后记
有没有考虑转战Gentoo或者LFS呢?
问题出现
很快问题就出现了, 自己从源码安装果然还是有不少坑, 打开zathura就会这样:
1error: jpeg error: Wrong JPEG library version: library is 80, caller expects 90
好像PNG没有问题, 但是JPG就会像这样:
首先考虑安装libjpeg9库, 但是问题多多, 最初的尝试如下:
-
Wrong jpeg library version in develop branch. - Gitlab zathura issue
第一次提出issue, 好像是被狠狠嫌弃了 -
Wrong libjpeg version in zathura develop branch - StackOverflow
由于看到了BUG报告 FS#34590 - [mupdf] mupdf-1.2 is building with the wrong libjpeg header, 开始尝试歪门邪道, 修改thirdparty libjpeg header为80, 不过新的报错为:
1error: jpeg error: JPEG parameter struct mismatch: library thinks size is 656, caller expects 632
记得有篇zhihu的人写的
Wrong JPEG library version, 继续歪门邪道, 但有所不同. 我先尝试往里面加个int shit;
, 变为:
1error: jpeg error: JPEG parameter struct mismatch: library thinks size is 656, caller expects 640
再次加2个shit, 一共3个shit, 变为648, em确实有struczt对齐的问题. 最后一共5个shit, 对齐了656, 但是报错:
1Application transferred too many scanlines
看起来果然不会这么容易. 又开始迷茫了.
不过不经意间又发现arch好像自己就有zathura-git和zathura-mupdf-git?? 火速搞起来.
中途甚至因为配置混乱的原因出现了报错, 太傻逼了….(置换反应):
1error: jpeg error: Wrong JPEG library version: library is 90, caller expects 80
将libjpeg.so.9相关全部移除, 卸载并重新下载,重新编译,重新安装:girara, zathura-git, zathura-pdf-mupdf-git.
至此兜兜转转又从from source到AUR了…. 不过zathura可以稳定运行了…