让PDF文件也支持书签功能

每次看完pdf,下次打开还得从头翻,想着pdf为啥不支持书签呢。遂google。还真有。

代码如下。

编辑成bookmark_page.js 文件,放入到安装目录的“C:\Program Files (x86)\Adobe\Reader 9.0\Reader\Javascripts”下。

 

View Code 
  1  //  bookmark_page.js, ver. 1.0
  2  //  visit: www.pdfhacks.com/bookmark_page/
  3  //  edit:cjs 2008-02-17 
  4  //  1 修改为中文标签
  5  //  2 设置书签时可以自动获取当前的书名
  6  //  3 自动获取当前所在的页码与总页数,方便查阅
  7  //  4 实现更多功能可以参看Adobe Reader的SDK
  8  //  use this delimiter for serializing our array
  9  var  bp_delim =   ' %#%# ' ;
 10  function  SaveData( data ) {
 11     //  data is an array of arrays that needs
 12     //  to be serialized and stored into a persistent
 13     //  global string
 14     var  ds =   '' ;
 15     for ( ii =   0 ; ii <  data.length;  ++ ii ) {
 16       for ( jj =   0 ; jj <   3 ++ jj ) {
 17         if ( ii !=   0   ||  jj !=   0  )
 18          ds +=  bp_delim;
 19        ds +=  data[ii][jj];
 20      }
 21    }
 22    global.pdf_hacks_js_bookmarks =  ds;
 23    global.setPersistent(  " pdf_hacks_js_bookmarks " true  );
 24  }
 25  function  GetData() {
 26     //  reverse of SaveData; return an array of arrays
 27     if ( global.pdf_hacks_js_bookmarks ==   null  ) {
 28       return   new  Array( 0 );
 29    }
 30     var  flat =  global.pdf_hacks_js_bookmarks.split( bp_delim );
 31     var  data =   new  Array();
 32     for ( ii =   0 ; ii <  flat.length; ) {
 33       var  record =   new  Array();
 34       for ( jj =   0 ; jj <   3   &&  ii <  flat.length;  ++ ii,  ++ jj ) {
 35        record.push( flat[ii] );
 36      }
 37       if ( record.length ==   3  ) {
 38        data.push( record );
 39      }
 40    }
 41     return  data;
 42  }
 43  // Get Current Date
 44  function  DateNow(){
 45      var  d, s ;
 46     d  =   new  Date();
 47     s  =  d.getFullYear() + " / " ;
 48     s  +=  (d.getMonth()  +   1 +   " / " ;
 49     s  +=  d.getDate() ;
 50      /*
 51     s += d.getHours() + ":";
 52     s += d.getMinutes() + ":";
 53     s += d.getSeconds() ;
 54      */
 55      return (s);
 56  }
 57  function  AddBookmark() {
 58     //  query the user for a name, and then combine it with
 59     //  the current PDF page to create a record; store this record
 60     var  thisfilename = this .documentFileName;
 61    thisfilename = thisfilename.substr( 0 ,thisfilename.lastIndexOf( " . " ));
 62     var  numPlugInss = this .pageNum + 1 ;
 63     var  currentdate = DateNow();
 64     var  label =  
 65      app.response(  " 书签名称,可以修改以便于记忆: " ,
 66                     " 书签名称 " ,
 67                     " " + thisfilename + " 》第  " + numPlugInss + "  页/共  " + this .numPages + "  页   " + currentdate,
 68                     false  );
 69     if ( label !=   null  ) {
 70       var  record =   new  Array( 3 );
 71      record[ 0 ] =  label;
 72      record[ 1 ] =   this .path;
 73      record[ 2 ] =   this .pageNum;
 74      data =  GetData();
 75      data.push( record );
 76      SaveData( data );
 77    }
 78  }
 79  function  ShowBookmarks() {
 80     //  show a pop-up menu; this seems to only work when
 81     //  a PDF is alreay in the viewer;
 82     var  data =  GetData();
 83     var  items =   '' ;
 84     for ( ii =   0 ; ii <  data.length;  ++ ii ) {
 85       if ( ii !=   0  )
 86        items +=   ' ' ;
 87      items +=   ' " ' +  ii +   ' ' +  data[ii][ 0 ] +   ' " ' ;
 88    }
 89     //  assemble the command and the execute it with eval()
 90     var  command =   ' app.popUpMenu(  ' +  items +   '  ); ' ;
 91     var  selection =  eval( command );
 92     if ( selection ==   null  ) {
 93       return //  exit
 94    }
 95     //  the user made a selection; parse out its index and use it
 96     //  to access the bookmark record
 97     var  index =   0 ;
 98     //  toString() converts the String object to a string literal
 99     //  eval() converts the string literal to a number
100    index =  eval( selection.substring(  0 , selection.indexOf( ' : ' ) ).toString() );
101     if ( index <  data.length ) {
102       try  {
103         //  the document must be 'disclosed' for us to have any access
104         //  to its properties, so we use these FirstPage NextPage calls
105         //
106        app.openDoc( data[index][ 1 ] );
107         //       app.execMenuItem( "FirstPage" );
108         //       for( ii= 0; ii< data[index][2]; ++ii ) {
109         //         app.execMenuItem( "NextPage" );
110         //       }
111         this .pageNum  =  data[index][ 2 ];
112      }
113       catch ( ee ) {
114         var  response =  
115          app.alert( " 打开书签错误. 是否删除本书签? " 2 2 , " 删除书签 " );
116         if ( response ==   4   &&  index <  data.length ) {
117          data.splice( index,  1  );
118          SaveData( data );
119        }
120      }
121    }
122  }
123  function  DropBookmark() {
124     //  modelled after ShowBookmarks()
125     var  data =  GetData();
126     var  items =   '' ;
127     for ( ii =   0 ; ii <  data.length;  ++ ii ) {
128       if ( ii !=   0  )
129        items +=   ' ' ;
130      items +=   ' " ' +  ii +   ' ' +  data[ii][ 0 ] +   ' " ' ;
131    }
132     var  command =   ' app.popUpMenu(  ' +  items +   '  ); ' ;
133     var  selection =  eval( command );
134     if ( selection ==   null  ) {
135       return //  exit
136    }
137     var  index =   0 ;
138    index =  eval( selection.substring(  0 , selection.indexOf( ' : ' ) ).toString() );
139     if ( index <  data.length ) {
140      data.splice( index,  1  );
141      SaveData( data );
142    }
143  }
144  function  ClearBookmarks() {
145     if ( app.alert( " 确认要清除所有的书签吗? " 2 2 , " 删除书签 "  ) ==   4  ) {
146      SaveData(  new  Array( 0 ) );
147    }
148  }
149  app.addMenuItem( {
150  cName:  " - " ,               //  menu divider
151  cParent:  " View " ,          //  append to the View menu
152  cExec:  " void(0); "  } );
153  app.addMenuItem( {
154  cName:  " 设置本页为书签(&B) " ,
155  cParent:  " View " ,
156  cExec:  " AddBookmark(); " ,
157  cEnable:  " event.rc= (event.target != null); "  } );
158  app.addMenuItem( {
159  cName:  " 转到指定书签(&T) " ,
160  cParent:  " View " ,
161  cExec:  " ShowBookmarks(); " ,
162  cEnable:  " event.rc= (event.target != null); "  } );
163  // cEnable: "event.rc= true;" } );
164  app.addMenuItem( {
165  cName:  " 删除一个书签(&D) " ,
166  cParent:  " View " ,
167  cExec:  " DropBookmark(); " ,
168  cEnable:  " event.rc= (event.target != null); "  } );
169  app.addMenuItem( {
170  cName:  " 清除所有书签(&C) " ,
171  cParent:  " View " ,
172  cExec:  " ClearBookmarks(); " ,
173  cEnable:  " event.rc= true; "

你可能感兴趣的:(pdf)