让FoxitReader记住上次浏览的位置

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,以及两个中间文件tmpoldinfo。在第8行的时候把页面信息提取到oldinfo文件中,它们位于[RecentFilePage][RecentFileZoom]项之间,注意后面的grep-v“$1”,也就是说,并不提取原来记录的本文档的信息。然后在13行的时候调用FoxitReader来打开文档。“$1”代表被打开的文档,只能一次打开一个文档,它必须加双引号。如果不加的话,当文件名里包含空格或者括号等必须使用”\”来转义的PDF文档是无法打开的。在第17行里提取当前文档关闭时由FoxitReader保存的页面信息,它是处于[RecentFilePage]项下的第一行。因为只提取一行,所以可以使用变量来保存,而无需文件。最后从20行开始就是覆盖原来的配置文件了。

脚本写完后,加上可执行权限,就可以用来打开PDF文档了。但总不可能每次都在终端里调用脚本来打开文档吧?所以要把它添加到右键菜单,甚至把它设置为默认的PDF文档打开方式。方法是在PDF文档上右键,选择“打开方式”或者“属性/打开方式”,见下图。然后选择“使用自定义命令”,定位到该脚本即可。


最后还有一点很烦人:FoxitReader打开时总是普通大小的窗口,而不是最大化窗口,这可以在配置文件里修改,就是前面提到的[FoxitReader]选项,见下图

可以试验,发现WindowState0代表打开时是普通窗口,为1时为最大化。为了始终都能以最大窗口打开文档,把上面的脚本修改一下,即总是把WindowState设置为1即可。只需一条命令即可:

sed -i's/^WindowState=.*$/WindowState=1/' $target

即把以WindowState开始的行替换成WindowState=1。该命令应该添加到最后一行

把它复制到/usr/bin下,然后就可以把它设置为默认的PDF文档打开方式了。

脚本还是可以继续改进的,比如可以改成只记录若干条,一般来说,20条记录就已经足够多了,上面的脚本则是全部记录,使用时间长了之后,会记录太多东西,可能有隐患。而且某些文档可能被改名,或者移动,或者删除,记录信息就会过时,应该检查文档是否存在,不存在则删除相应的记录,这样会比较好。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值