为 adobe reder(pdf文件)添加书签

在Adobe Reader中添加书签的解决方案
本文介绍如何在Adobe Reader中通过JavaScript插件实现书签功能,解决了官方不支持书签的问题,包括菜单乱码、书签跳转延迟和自动排序。详细步骤包括编写并保存Bookmark.js文件,开启JavaScript权限,以及操作书签的菜单选项。

为 adobe reder(pdf阅读器)添加书签

--------完美解决中文乱码和支持reder10.0/reader11.0

从adobe reder的官方说明书中可以看到,adobe reder是不支持书签功能的。这给我们阅读带来了很大的麻烦,我每次都是在桌面新建一文本文件,专门用来记录书签信息。(当然,adobe reder支持一种类似的功能,即:视图->页面导览->上一视图,它记录了你关闭PDF时的当时的页面,但功能单一且不实用)。

从adobe reder的技术手册中发现,adobe reder支持插件功能,且提供相应的SDK说明书,并借鉴网友们的帮助和建议,实现了书签功能。完美支持adobe reder 10.0 ,adobe reder11.0和中文显示等。

1.解决了菜单乱码问题。

   使用cUser成员为菜单命名,防止乱码。

2.优化了书签跳转算法,使打开书签没有延迟。

原程序中使用的是for(page = 0; page < gotogage; ++page) nextPage(); 这样的机制,使得书签跳转速度慢,修改为gotoPage( gotopage);。

3.添加了书签自动排序功能。

 书签保存形式为“《文件名》第N...N页/共N...N页 yyyy/mm/dd 备注”(其中备注为可选填项)书签会按照字母顺序自动排序,排序优先级为:文件名>页面>日期>备注。可以打开不同文件。

 

第一步,将以下代码复制到记事本,另存为Bookmark.js文件.放到安装目录 X:\Program Files\Adobe\Reader10.0\Reader\Javascripts文件夹下(X代表盘符,Reader 10.0这个版本随你安装的版本而不同)

第二步  运行Adobe Reader,菜单编辑->首选项->JavaScript->勾选启用Acrobat JavaScript和启用菜单项目JavaScript执行权限。

第三步  在“视图(view)”下面已经出现4个选择项:设置本页为书签、转到指定书签、删除一个书签、清除所有书签.

====================================================================================================================================

代码如下:

varbp_delim= '%#%#';
functionSaveData( data )
{
// data isan array of arrays that needs
// to beserialized and stored into a persistent
// globalstring
    var ds= '';
    data.sort();
    for( ii= 0; ii< data.length; ++ii )
    {
        for( jj= 0; jj< 3; ++jj )
        {
            if( ii!= 0 || jj!= 0 )
                ds+= bp_delim;
            ds+= data[ii][jj];
        }
    }
    global.pdf_hacks_js_bookmarks= ds;
    global.setPersistent("pdf_hacks_js_bookmarks", true );
}
 
functionGetData()
{
//  reverseof SaveData; return an array of arrays
    if( global.pdf_hacks_js_bookmarks== null )
    {
        return new Array(0);
    }
    var flat=global.pdf_hacks_js_bookmarks.split( bp_delim );
    var data= new Array();
    for( ii= 0; ii< flat.length; )
    {
        var record= new Array();
        for( jj= 0; jj< 3 && ii<flat.length; ++ii, ++jj )
        {
            record.push( flat[ii] );
        }
        if( record.length== 3 )
        {
            data.push( record );
        }
    }
    return data;
}
 
//GetCurrent Date
functionDateNow()
{
    var d, tmp ,s ;
    d = new Date();
    t = d.getFullYear();
    s = t + "/";
    t = (d.getMonth() + 1).toString();
    if(t.length!=2) t = "0" + t;
    s += t + "/";
    t = (d.getDate()).toString();
    if(t.length!=2) t = "0" + t;
    s += t;
    return(s);
}
 
functionAddBookmark()
{
// querythe user for a name, and then combine it with
// thecurrent PDF page to create a record; store this record
   var thisfilename=this.documentFileName;
   thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));
   var numLen =this.numPages.toString().length;
   var numPlugInss=this.pageNum+1;
 
   while(numPlugInss.toString().length <numLen)
   {
     numPlugInss = "0" + numPlugInss;
   }
   var currentdate=DateNow();
   var label="《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页 " + currentdate;
   var cResponse = app.response(
   {          
            cQuestion: label,               
            cTitle: "添加书签",                 
            cDefault: "无备注",                
            cLabel: "备注:"  
    });
    if( cResponse!= null )
    {
        var record= new Array(3);
        record[0]= label + "        " + cResponse;
        record[1]= this.path;
        record[2]= this.pageNum;
        data= GetData();
        data.push( record );
        SaveData( data );
    }
}
 
functionShowBookmarks()
{
// show apop-up menu; this seems to only work when
// a PDFis alreay in the viewer;
    var data= GetData();
    var items= '';
    for( ii= 0; ii< data.length; ++ii )
    {
        if( ii!= 0 )
            items+= ', ';
        items+= '"'+ ii+ ': '+data[ii][0]+ '"';
    }
//  assemble the command and the execute it with eval()
    var command= 'app.popUpMenu( '+ items+ ');';
    var selection= eval( command );
    if( selection== null )
    {
       return; // exit
    }
 
// theuser made a selection; parse out its index and use it
// toaccess the bookmark record
   var index= 0;
// toString() converts the String object to a string literal
// eval()converts the string literal to a number
    index= eval( selection.substring( 0,selection.indexOf(':') ).toString() );
    if( index< data.length )
    {
        try
        {
            // the document must be 'disclosed'for us to have any access
            // to its properties, so we usethese FirstPage NextPage calls
            //
                   if(this.path ==  data[index][1])
                   {
                          this.pageNum =  data[index][2];
                   }
                   else
                   {
                          var otherDoc =app.openDoc( data[index][1]);      
                          otherDoc.pageNum =data[index][2];
                   }
        }
        catch( ee )
        {
            var response=
                app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");
            if( response== 4 &&index< data.length )
            {
                data.splice( index, 1 );
                SaveData( data );
            }
        }
    }
}
 
functionDropBookmark()
{
//  modelled after ShowBookmarks()
    var data= GetData();
    var items= '';
    for( ii= 0; ii< data.length; ++ii )
    {
        if( ii!= 0 )
            items+= ', ';
        items+= '"'+ ii+ ': '+data[ii][0]+ '"';
    }
    var command= 'app.popUpMenu( '+ items+ ');';
    var selection= eval( command );
    if( selection== null )
    {
        return; // exit
    }
 
    var index= 0;
    index= eval( selection.substring( 0,selection.indexOf(':') ).toString() );
    if( index< data.length )
    {
        data.splice( index, 1 );
        SaveData( data );
    }
}
 
functionClearBookmarks()
{
    if( app.alert("确认要清除所有的书签吗,删除后将不可恢复?", 2, 2,"删除书签" )== 4 )
    {
        SaveData( new Array(0) );
    }
}
 
app.addMenuItem(
{
cName:"-",              // menudivider
cParent:"View",         // append tothe View menu
cExec:"void(0);"
} );
 
app.addMenuItem(
{
cName:"AddBookmark",
cUser:"设置本页为书签(&B)",
cParent:"View",
cExec:"AddBookmark();",
cEnable:"event.rc= (event.target != null);"
} );
 
app.addMenuItem(
{
cName:"ShowBookmarks",
cUser:"转到指定书签(&T)",
cParent:"View",
cExec:"ShowBookmarks();",
cEnable:"event.rc= (event.target != null);"
} );
 
app.addMenuItem(
{
cName:"DropBookmark",
cUser:"删除一个书签(&D)",
cParent:"View",
cExec:"DropBookmark();",
cEnable:"event.rc= (event.target != null);"
} );
 
app.addMenuItem(
{
cName:"ClearBookmarks",
cUser:"删除所有书签(&C)",
cParent:"View",
cExec:"ClearBookmarks();",
cEnable:"event.rc= true;"
} );

===========================================================

最后附上已经写好的Bookmark.js文件,以供大家直接下载使用:

地址:http://download.youkuaiyun.com/detail/cbnotes/4825981

******声明:以上代码是某位大神改进的代码~亲测可用,感谢大神!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值