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

来源:互联网 发布:网络程琳为什么不红了 编辑:程序博客网 时间:2024/05/16 12:22

为 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 DatefunctionDateNow(){    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:"-",              // menudividercParent:"View",         // append tothe View menucExec:"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.csdn.net/detail/cbnotes/4825981

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