给 Okular 加一个图片转 LaTeX 代码功能

前几天刷推特发现了一个很好用的工具叫 Mathpix,主要功能就是给公式截图生成对应的 $ \LaTeX $ 代码,不仅给了一个跨平台的免费软件,还提供了 API. 这个东西出了好久了我才刚知道。

今天写作业的时候猛然想起来 KDE 的默认 PDF 阅读器 Okular 也是支持像截图那样框一个方框然后把图片存起来的,稍微改一改不就可以支持框出来公式直接转 $ \LaTeX $ 代码了吗?

于是马上把 okular 源码拖了下来改着玩,中间遇到了一些坑,最终还是完成了。

改 Okular

先编译一下看看缺不缺环境,源码用的是 cmake 构建的,没怎么用过,发现缺了一个ECM什么的,我的解决方法就是用AUR假装要装okular-git,把依赖装好之后,取消。发现缺的是extra-cmake-modules. 然后就正常编译运行,测试ok.

接下来看代码,首先用搜字符串大法在代码直接定位到了 ui/pageview.cpp,这里就是 okular 选中区域弹出菜单的地方。直接仿照存图片加了一个 QAction,重新编译。嗯?运行发现竟然没加上。

试了很久终于发现这块代码生成的是一个动态库,然而运行的时候用的还是系统里面已经装好了的。到 Archlinux 的包列表里面总算找到了位置是在 /usr/lib/qt/plugins/okularpart.so,每次用 make okularpart编译好这部分替换原有的库就可以了。

接着就是怎么调用 API,用到了QNetworkRequest, QNetworkReply, QNetworkAccessManager这三个类,发HTTP请求这么常用的场景官方文档也没有个例子,stackoverflow 上找来找去总算会用了。

调用 API

MathPix 提供的接口非常简单,把图片 base64 发一个 POST 过去就好,遇到的坑就是还需要注册一个 app_key. 每月前 1k 个请求免费。诶,等一下,官方不是有个免费的工具么,直接看看它用什么请求的不就可以了。

本来想的是抓包,然后折腾半天也不知道怎么解密不经过浏览器的HTTPS,索性逆向一下吧。官方其实也没有做个混淆什么的,实际上也根本不用看代码,直接把数据段里的字符串过一遍,API url 的附近正好就是官方试用 key,把这个 key 用 cURL 请求一下果然能用。

然后就是接着查文档了,怎么转 base64,怎么拼 json 串,怎么从 json 串生成对象,然后怎么复制到剪贴板。

毕竟是写着玩,什么错误处理完全没有在意,自己能用就可以了。

收获

本来想着给 okular 官方提个 PR,仔细一想这肯定需要 Mathpix 同意才行,不然这么一搞 Mathpix 不就挣不到钱了吗?所以说还是自己私下用一用就好了。官方的那个 key 应该也是有限制的,不过我也就偶尔用一下,应该达不到限制。

最终完成的几十行代码

虽然干了一件超简单的事,感觉还是有些收获的。

最大的收获就是 我的学位和工作都是 GitHub 和 StackOverflow 给的!没有它们我毛也不是!