下沙论坛

 找回密码
 注册论坛(EC通行证)

用新浪微博连接

一步搞定

QQ登录

QQ登录

下沙大学生网QQ群8(千人群)
群号:6490324 ,验证:下沙大学生网。
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
查看: 3905|回复: 0
打印 上一主题 下一主题

让PDF文件也支持书签功能

[复制链接]
  • TA的每日心情
    奋斗
    昨天 15:16
  • 签到天数: 2341 天

    [LV.Master]伴坛终老

    跳转到指定楼层
    1
    发表于 2011-5-20 10:18:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近经常看一些PDF的电子文档,痛苦的是Adobe Reader竟然没有提供书签的功能,每次看完之后再回到上次看的地方都很麻,到网上一找,还真有人就做了PDF的书签,下载一试效果不错,于是参看了一下Adobe Reader的SDK,修改了一点地方,以更方便的使用,下面是程序的使用方法5 v/ x, y6 f% e0 c' ?) N6 j
    1、打开编辑的首选项项
    7 x$ {" U; ]. L) o+ G/ _* S* Q
    , `% f& i# b! F2 g2、确保下面的选项都被选中
    5 i6 w: ^0 U5 ~3 M" k! U& R7 k1 p& g9 t! g! ^
    3 把下面的代码保存为一个bookmark_page.js文件% \- h4 i: X) L' v9 G
    // bookmark_page.js, ver. 1.0
    ( |& X' z5 A: _0 G: s( v// visit: www.pdfhacks.com/bookmark_page/
    / M, N, F/ E( ^9 N) \8 p// edit:cjs 2008-02-17 6 _7 z, P+ j* x- Q& X  l* P
    // 1 修改为中文标签
    7 F3 c; M2 I* Y; k+ {0 x// 2 设置书签时可以自动获取当前的书名
    3 S! Z1 X( H4 f5 H- Z* ]' Y// 3 自动获取当前所在的页码与总页数,方便查阅8 @4 Q, n/ |0 e# l( ~5 b
    // 4 实现更多功能可以参看Adobe Reader的SDK; U9 m" P1 T# w. u# x2 F1 L4 [9 j
    - Z$ V0 c, ?% q/ G3 b
    // use this delimiter for serializing our array
    3 n" }$ m% Q$ T: |" Z0 W' Svar bp_delim= '%#%#';7 E  O  ?+ {  x. L3 H; _
    function SaveData( data ) ...{
    4 T$ |) ?% g( |9 M- t3 D) m, Q: I  // data is an array of arrays that needs0 c/ X$ A: B  o1 o% T' ]) i& |
      // to be serialized and stored into a persistent
    . T3 H$ L; y: a/ M  // global string/ h& E% }: _! K. f2 k
      var ds= '';
    * S  t# s/ n" |  for( ii= 0; ii< data.length; ++ii ) ...{! R! j# l, X& N7 |+ S; L6 ~7 ^- A
        for( jj= 0; jj< 3; ++jj ) ...{
    1 d% p5 g+ E" i4 [, u: B7 D      if( ii!= 0 || jj!= 0 )
      Y+ Q$ P) Q4 {" {0 k7 k        ds+= bp_delim;; R; Y8 d6 N9 F0 E
          ds+= data[ii][jj];: _5 k9 t7 M  L4 q0 t
        }+ k+ ^6 Q; q0 ]$ W; D* ?5 c# _% D$ _
      }
    2 }7 o4 @' d7 E- U  global.pdf_hacks_js_bookmarks= ds;
    " j, c! M; x+ A9 C  global.setPersistent( "pdf_hacks_js_bookmarks", true );
    9 x" b3 w' b$ N6 Y}
    # F$ B+ P6 k6 [( Jfunction GetData() ...{
    " C/ `* V1 M; Y, S* D) j) L  // reverse of SaveData; return an array of arrays
    1 V4 v. X" \6 O' s/ }  if( global.pdf_hacks_js_bookmarks== null ) ...{
    + t; {% A# z# z: v: S  ]+ E    return new Array(0);
    & `0 d& v- ~9 u1 P1 I: ~. S  }! W0 e- h3 A: C: `! i5 I# W
      var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );
    9 ~. K  A! H1 ^5 h% ^. X1 D7 A+ m  var data= new Array();
    ; ]' `! k5 a& J0 o# F  for( ii= 0; ii< flat.length; ) ...{& N& j) E! a+ z# {9 x: L
        var record= new Array();6 i3 Z  T+ ?6 N# m! k7 j5 o
        for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) ...{
    1 m/ Q, F4 Q- U1 i2 T% D/ ^+ H4 g      record.push( flat[ii] );
    * B  @3 }; A2 \8 |' j: R    }
    $ w5 s& c1 j$ J6 ^    if( record.length== 3 ) ...{6 G2 i6 G6 S2 J: F
          data.push( record );
    4 a" R/ C4 V: c, V- B    }
    ; F" V+ U( m+ Z6 {& v  }
    , I& |; e, h& M- e1 o6 H! l  return data;# s$ f% c; j& B0 I+ ?" ^- c
    }
      V$ J3 ]- ^" e. \4 _) f//Get Current Date  H3 a* Q7 [; h- X8 Y- N
    function DateNow()...{
    # |5 M7 ~! I" x- j/ |   var d, s ;
    / m: a, \" q% v2 _" i0 E   d = new Date();0 \  [; e" ]/ @" Q" e; t% s4 S1 y
       s = d.getFullYear()+"/";
    0 p7 \5 F4 |/ ~. G  Y   s += (d.getMonth() + 1) + "/";
    - S% p. q1 \- K( t( `0 x9 \# T   s += d.getDate() ;3 b5 Q# K" `* l  k, ]
       /**//*
    , M8 r) g0 ~0 t4 l/ q   s += d.getHours() + ":";
    5 u* O4 M" S+ x0 F. k   s += d.getMinutes() + ":";
    9 S  w: G1 B" Y! E5 ^. ]   s += d.getSeconds() ;" J' K" S( D' U# `0 [
       */
    1 N2 c7 K" b3 k6 B" p: R1 }   return(s);
    ) ?# R; T  r# q' W" r}
    * [  V$ V1 ~- R4 S9 w, Y
    0 i5 u6 B* \& {% Pfunction AddBookmark() ...{/ d) Q  P5 G  {9 k# {
      // query the user for a name, and then combine it with. I0 L7 ?6 |4 M& T# M0 d: x8 ~
      // the current PDF page to create a record; store this record
    4 h! I4 n- Z' G  var thisfilename=this.documentFileName;1 R4 Z! T, K: K4 K+ E& i8 \' ?* S1 u
      thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));
    8 e6 L* e- v: j( ?) {1 O  var numPlugInss=this.pageNum+1;
    $ u7 }# @, d1 g% i  var currentdate=DateNow();
    ( Z4 w5 J/ f6 m4 s7 B* n  var label=
    ; d5 D5 H. _! @# c4 D/ V    app.response( "书签名称,可以修改以便于记忆:",
    : P" r6 b7 ]# b2 q2 `( |                  "书签名称",
    ( o, X* q& M0 u' F                  "《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页  "+currentdate,4 {! u" i/ ]8 K8 ?) X( [
                      false );
    % K) I+ d; t5 J" ?5 L1 R  if( label!= null ) ...{1 o; B' N* L* v* B% A6 ~- n
        var record= new Array(3);4 [3 P; s6 D/ h9 J0 c1 S; e" t6 H, j
        record[0]= label;
    2 k/ B, z7 t( N, q* D  k5 t    record[1]= this.path;
    2 I7 m# Z. O- ^2 c: D7 C    record[2]= this.pageNum;
    8 z, z; J* [$ A# r2 U    data= GetData();
    : i/ ?5 P8 x+ f$ Y5 L' T0 l    data.push( record );- [1 R; J0 F2 _) e9 E/ E: A2 x! H
        SaveData( data );
    : X, z2 D% p& S; ^. X3 w5 N  }
    . ~' C0 e# D3 e" p8 n  @}! W2 H+ E8 ?& ]$ [5 j
    function ShowBookmarks() ...{
      k9 S) V% l% ^& Q) O( E  // show a pop-up menu; this seems to only work when
    & j+ W" T7 F+ d  // a PDF is alreay in the viewer;4 ?. W6 G5 g% \8 m
      var data= GetData();2 g0 p$ x" @8 F( O# a% n) z( ~. P& f
      var items= '';
    & p( f: U/ k* s( n# }1 q  for( ii= 0; ii< data.length; ++ii ) ...{6 ^6 N9 d/ e: D
        if( ii!= 0 )- t" }5 D3 L, W1 E1 M2 t5 B1 F
          items+= ', ';" A3 G5 ?- C: C' ~
        items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
    * i* |4 U& L0 O' v  }
    & D* M& g- \+ ?1 T: ]- a7 W  // assemble the command and the execute it with eval()' a$ V1 x; s( `
      var command= 'app.popUpMenu( '+ items+ ' );';. T  L) ~" Y2 _* d
      var selection= eval( command );
    * u. z) o, @, k' m  if( selection== null ) ...{
    6 K  z) n- v! N' }    return; // exit  p; J/ i% f/ O! t2 D7 H
      }$ _8 ?4 n6 L) }! ~+ A
      // the user made a selection; parse out its index and use it
    & H; B+ `" X# x3 Y; M$ @! {8 K  // to access the bookmark record6 k# `4 V8 A* h7 A2 p/ d
      var index= 0;
    # X9 C9 r; k. m  A1 q' T9 e  // toString() converts the String object to a string literal
    1 @) J% B3 {$ ~  // eval() converts the string literal to a number
    8 `( g; E/ X) e  @5 R0 R  index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );4 ]. ~$ @  J  E$ c% |
      if( index< data.length ) ...{* m+ |5 p# r! a5 a" B# n& q
        try ...{) H# [4 P) I. U+ U  w- Q# l
          // the document must be 'disclosed' for us to have any access2 B! i6 w4 R2 G/ M0 m
          // to its properties, so we use these FirstPage NextPage calls
    # Q, i  j: _/ ^: ^- j/ G& r8 z      //  |8 G8 [8 q% ?* \5 f2 g9 f
          app.openDoc( data[index][1] );- u& z2 o1 ?2 K8 c
          app.execMenuItem( "FirstPage" );
    6 J' I7 H' K- o4 V# p4 P8 L      for( ii= 0; ii< data[index][2]; ++ii ) ...{
    ; K* n1 X8 h9 j9 L  ?3 o, S$ n        app.execMenuItem( "NextPage" );/ `. ^7 b& J( k' y; L, e* R
          }# u, y5 J. v5 u% B
        }
    ( ^- i5 c0 ^: h0 b$ ^/ o2 s    catch( ee ) ...{2 n# ~) C/ C" t! ~- B$ k
          var response=
    1 v/ C* F3 Q- n$ l- c+ q        app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");; o* L* w, }. Z! c8 L) b) ~8 D
          if( response== 4 && index< data.length ) ...{
    ! a. }. _% r0 A9 ?: ~5 p% ^  O        data.splice( index, 1 );# G0 p: U7 V+ k1 T; s1 A
            SaveData( data );
    8 ^& c5 V7 X6 ?7 }! Y6 n      }5 K  ^# `& {% p  r6 v: H$ @
        }
    4 e' @% B& e& h9 c4 q  }
    ( }, i) g2 w# [; l' v4 |0 ?}
    1 B! Z' O# c1 R  {. tfunction DropBookmark() ...{3 Q6 k# u1 R9 \6 C; v
      // modelled after ShowBookmarks()
    ' H7 P! _- M4 G7 B! ], I  R4 @  var data= GetData();
    . P1 H% B, y3 a! ]8 S% J  var items= '';
    # p; C1 c$ X4 I# g) {8 R  C$ t  for( ii= 0; ii< data.length; ++ii ) ...{
    8 m/ Z" x4 {6 m' c/ \3 S- I    if( ii!= 0 )5 I; X7 y' |  }' i5 v+ i$ C
          items+= ', ';: w* E! [( H) O( H
        items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
    3 M* i# ^7 r3 X3 F  }& K5 S, u8 h" \, p
      var command= 'app.popUpMenu( '+ items+ ' );';) J0 i+ G% W/ [* ]$ Q5 }/ K
      var selection= eval( command );: g+ O$ S5 B8 U1 O! a% M; G0 Y0 c6 T
      if( selection== null ) ...{
    7 p* o. y) t+ ^/ I! {    return; // exit
    ( q" R7 ]& y5 i% v( _- ]% M  }
    6 c3 P/ W* D* B  var index= 0;5 R& _8 o8 a3 g# w4 S6 t
      index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );
    ! C: N9 X$ [+ N! k0 w) K. _  k3 q  if( index< data.length ) ...{
    : d" R, @7 i9 l& D7 \  k, w; R    data.splice( index, 1 );/ z7 t+ K2 }- x- F" x2 H( F
        SaveData( data );0 b. L2 g; @: y' g
      }- I  ]1 I# `0 D$ @6 f" d& ?7 p
    }
      z& ^6 M2 g3 m$ K) ]6 B, a. I4 i8 ~function ClearBookmarks() ...{* p  s/ h( g' Z7 f
      if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) ...{, a# v0 ~- `& G' Z3 i5 N# I' D  S+ C# Q
        SaveData( new Array(0) );1 w% m8 l7 H- g" U4 q
      }" |7 l0 A8 Z0 h! s. U
    }
    % m9 ?+ x( _! A+ L1 `app.addMenuItem( ...{
    ( B% Q/ X& E' Y  v2 R" G% o- pcName: "-",              // menu divider2 @# J: D. p4 c4 \3 c
    cParent: "View",         // append to the View menu$ a6 a- Q1 Y- F2 r
    cExec: "void(0);" } );# s0 v9 W5 i' v' Q
    app.addMenuItem( ...{/ M, D# n! k, s5 |  M: C
    cName: "设置本页为书签(&B)",- l" K+ p! O' V" w
    cParent: "View",
    / V' i/ n$ ~+ P. CcExec: "AddBookmark();",
    , F) p9 y8 Y) qcEnable: "event.rc= (event.target != null);" } );9 h3 I+ u% s$ m# a
    app.addMenuItem( ...{7 Y3 O$ M+ [5 }7 u' x9 ]/ W5 I0 D
    cName: "转到指定书签(&T)",; A& e0 b( }& l6 W# n) k
    cParent: "View",! B5 _/ W4 I) E4 q
    cExec: "ShowBookmarks();",, t, W, c* }/ b, ]; x
    cEnable: "event.rc= (event.target != null);" } );
    5 D; A- z$ _# l2 |3 s//cEnable: "event.rc= true;" } );6 {" M0 z5 j, M( l5 X) b# q8 j$ i
    app.addMenuItem( ...{
      ~7 M: Z% z7 n) kcName: "删除一个书签(&D)",
    0 J) k8 l5 f3 {) w2 t5 ZcParent: "View",
    - _5 L- j, _* }; ?cExec: "DropBookmark();",' ^7 u8 D( l! u( k2 @& [$ Q1 j
    cEnable: "event.rc= (event.target != null);" } );
    ! V4 |) q9 ?3 Dapp.addMenuItem( ...{
    $ {6 z# ?3 N) U. DcName: "清除所有书签(&C)",
      |" m' W1 M) O2 e  DcParent: "View",9 ~, ~8 R# i2 C9 |6 L' w
    cExec: "ClearBookmarks();",+ d& w2 J" M* S( ^$ L* ]( r
    cEnable: "event.rc= true;" } );
    ( v7 |- L8 i. U4 将文件拷贝到C:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下
    3 r$ g) l* r0 k/ T' _5 重新打开Adobe Reader,看看下面的图形,相信不用说任何东西,大家都会用了
    # d# ?# m7 L- z, v1 ]$ N4 e" _. ]4 y- L- V/ E- ^5 ]

    2 v/ M( C. o# A: p& j0 X; w本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aohan/archive/2008/02/20/2108051.aspx
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩 转发到微博

    本版积分规则

    关闭

    下沙大学生网推荐上一条 /1 下一条

    快速回复 返回顶部 返回列表