让FoxitReader记住上次浏览的位置
我的电脑装的是Ubuntu10.04,阅读PDF文档,一般使用默认的evince。但evince有个问题,它不太支持中文,很多PDF文档打开后无法正常显示。如果装上AdobeReader,则一来是软件太大,二来是功能远比不上Windows下的AcrobatReader,实在是鸡肋,果断不用。
幸好,在Linux下还有个FoxitReader,不仅小(只有不到4MB哦),而且速度快,更重要的是,对中文的支持很好,基本不会出问题,所以它实在是个不二之选。
但让人郁闷的是,FoxitReader不会记住上次浏览的文档的位置,而evince却能轻易记住。我找遍所有设置(其实只有一个Edit->Preference),都没有这个功能。上网查多遍,几乎都是针对Windows平台的,而Linux平台下版本为1.1,过于老旧,实在没有这个功能。
有没有办法让foxit记住呢?我打开一个PDF文档后,跳转到一个位置,再关闭,然后再打开,发现它可以直接跳到原来的位置上。但当我打开多个文档后,原来的就没法记住了。所以它一定会在某个文件保存页面信息,只要找到这个文件,就有戏!
只有试试strace了!拿一个PDF来做实验
$ strace -ofoxit /opt/FoxitReader/1.1-release/FoxitReader abc.pdf
我的Foxit装在/opt/FoxitReader/1.1-release/下。上面这个命令是记录用FoxitReader来打开文档abc.pdf时的所有系统调用,记录到文件foxit。在Google上查一下就可以知道strace命令的简单用法了。
现在来研究文件foxit,当然是用神器vim了,没得说的:vim foxit 。
不得了了,居然那么多的记录:
这还怎么找啊?我一向没耐性,直接看最后的部分,发现了感兴趣的语句:
原来它会访问文件 ~/.Foxit/foxit.conf。那还等什么?直接去看看。
打开后,还好,文件不大,只有100多行。开头的[Preferences]是首选项,对应着软件里的Edit->Preference,以下还有[Toolbar],[FilePath],[FoxitReader]......,在软件里都有对应项,但我不感兴趣,一直往下看,终于发现了[RecentFilePage]项,记录着页面信息!
没错,它就是记录浏览页面的。紧接着的是[RecentFileZoom],[RecentFilePosX],[RecentFilePosY]......
不过相当可惜,它只记录4条信息,也就是说,只有最近打开的4个文档能够记住位置。这显然是不够的,我要的是更多!
仔细观察并分析后,可以知道,FoxitReader会在打开文档的时候来读取页面信息,并跳转到相应的页面;在关闭文档的时候,把页面信息保存到[RecentFilePage]下的第一行,并删除超过4行的部分。
所以关键就是在FoxitReader打开文档前保存之前的页面信息,当然,不保存当前文档的相应信息,在关闭后再把原来的信息添加回去,就可以让FoxitReader在下次打开的时候跳转到相应的页面。下面的脚本就是为这一目的的。
1#! /bin/bash
2# 调用FoxitReader,并保存页面信息
3target=~/.Foxit/foxit.conf # 要操作的目标配置文件
4tmp=~/.Foxit/tmp # 临时文件
5oldinfo=~/.Foxit/oldinfo # 保存旧信息的临时文件
6
7# 提取旧的页面信息取本文档之外的数据到$oldinfo 文件
8sed -n '/\[RecentFilePage\]/, /\[RecentFileZoom\]/p' $target | sed'1d;$d' | grep -v "$1" > $oldinfo
9# 并删除 $oldinfo 文件里的空行
10sed -i '/^\s*$/d' $oldinfo
11
12# 调用FoxitReader来打开文档
13/opt/FoxitReader/1.1-release/FoxitReader "$1"
14
15# 关闭文档后,该文档的页面信息会被保存到$target 中
16# 现提取出来,它位于[RecentFilePage]下的第一行
17newinfo=`sed -n '/\[RecentFilePage\]/, /\[RecentFileZoom\]/p' $target| sed '1d;3,$d'`
18
19# 替换 $target 中的相应部分信息
20sed -n '1,/\[RecentFilePage\]/p' $target > $tmp
21echo $newinfo >> $tmp
22cat $oldinfo >> $tmp
23echo >> $tmp
24sed -n '/\[RecentFileZoom\]/,$p' $target >> $tmp
25
26# 用新配置文件覆盖原文件
27cat $tmp > $target
[HowDoes It Works]
稍微解释一下脚本的工作原理。
先在开始处引入三个变量,代表要操作的配置文件target,以及两个中间文件tmp和oldinfo。在第8行的时候把页面信息提取到oldinfo文件中,它们位于[RecentFilePage]和[RecentFileZoom]项之间,注意后面的grep-v“$1”,也就是说,并不提取原来记录的本文档的信息。然后在13行的时候调用FoxitReader来打开文档。“$1”代表被打开的文档,只能一次打开一个文档,它必须加双引号。如果不加的话,当文件名里包含空格或者括号等必须使用”\”来转义的PDF文档是无法打开的。在第17行里提取当前文档关闭时由FoxitReader保存的页面信息,它是处于[RecentFilePage]项下的第一行。因为只提取一行,所以可以使用变量来保存,而无需文件。最后从20行开始就是覆盖原来的配置文件了。
脚本写完后,加上可执行权限,就可以用来打开PDF文档了。但总不可能每次都在终端里调用脚本来打开文档吧?所以要把它添加到右键菜单,甚至把它设置为默认的PDF文档打开方式。方法是在PDF文档上右键,选择“打开方式”或者“属性/打开方式”,见下图。然后选择“使用自定义命令”,定位到该脚本即可。
最后还有一点很烦人:FoxitReader打开时总是普通大小的窗口,而不是最大化窗口,这可以在配置文件里修改,就是前面提到的[FoxitReader]选项,见下图
可以试验,发现WindowState为0代表打开时是普通窗口,为1时为最大化。为了始终都能以最大窗口打开文档,把上面的脚本修改一下,即总是把WindowState设置为1即可。只需一条命令即可:
sed -i's/^WindowState=.*$/WindowState=1/' $target
即把以WindowState开始的行替换成WindowState=1。该命令应该添加到最后一行
把它复制到/usr/bin下,然后就可以把它设置为默认的PDF文档打开方式了。
脚本还是可以继续改进的,比如可以改成只记录若干条,一般来说,20条记录就已经足够多了,上面的脚本则是全部记录,使用时间长了之后,会记录太多东西,可能有隐患。而且某些文档可能被改名,或者移动,或者删除,记录信息就会过时,应该检查文档是否存在,不存在则删除相应的记录,这样会比较好。