下沙论坛

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

QQ登录

QQ登录

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

让PDF文件也支持书签功能

[复制链接]
  • TA的每日心情
    奋斗
    昨天 08:43
  • 签到天数: 2391 天

    [LV.Master]伴坛终老

    跳转到指定楼层
    1
    发表于 2011-5-20 10:18:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近经常看一些PDF的电子文档,痛苦的是Adobe Reader竟然没有提供书签的功能,每次看完之后再回到上次看的地方都很麻,到网上一找,还真有人就做了PDF的书签,下载一试效果不错,于是参看了一下Adobe Reader的SDK,修改了一点地方,以更方便的使用,下面是程序的使用方法3 e4 c+ _& f3 z1 U, A6 l) M
    1、打开编辑的首选项项
    : I2 c, [9 `3 M3 J: R6 g% q/ l" w3 i1 K1 [
    2、确保下面的选项都被选中& @: }) {- B8 G( [: W
    ) _% g6 P+ \6 D( E4 r' Q4 d
    3 把下面的代码保存为一个bookmark_page.js文件
    . D# i. a9 V# i5 `, [  N, k// bookmark_page.js, ver. 1.0
    . w7 z1 D$ |1 A9 O9 [// visit: www.pdfhacks.com/bookmark_page/
    ! {- Q8 ]3 p; ^9 f- z) e: }* j// edit:cjs 2008-02-17
    / y9 ]% A) b: i# A// 1 修改为中文标签, ~% o3 k1 P8 ]
    // 2 设置书签时可以自动获取当前的书名
    & F: d& b" J+ m' h5 v* e9 B// 3 自动获取当前所在的页码与总页数,方便查阅: @, n) U0 |3 y! b$ p
    // 4 实现更多功能可以参看Adobe Reader的SDK1 r* F6 g3 v. P# P8 f9 v
    : G) s5 n; V9 I; _
    // use this delimiter for serializing our array
    2 Y1 r, S2 G1 r& z( evar bp_delim= '%#%#';
    + r7 @( d$ o8 C4 y$ c# V. I6 _! pfunction SaveData( data ) ...{. `; L; ]: N1 l8 j$ y5 N7 Q) a
      // data is an array of arrays that needs1 A2 |2 ?: {& k) C1 [4 b5 A
      // to be serialized and stored into a persistent
    ) q6 W# w( k. V: R2 V: ^  // global string. M" l% w/ \" `1 c7 s0 C4 |
      var ds= '';
    : [5 J1 B) z, U; g  for( ii= 0; ii< data.length; ++ii ) ...{
    ' O' U$ a: r' d. D( X! Y    for( jj= 0; jj< 3; ++jj ) ...{1 @/ q" ?! q+ ~* L  j) d- f
          if( ii!= 0 || jj!= 0 )  ^8 K! I0 F, w  ~, j" d5 N
            ds+= bp_delim;
    / E- D* j. f3 l      ds+= data[ii][jj];
    9 N5 }' \! I% w' E% C    }+ ]; `1 M! S' S  P( K" N- k0 o; K
      }5 y( U* m# ^- L' W% ^5 ]
      global.pdf_hacks_js_bookmarks= ds;
    , Q& Q2 _4 \- U  global.setPersistent( "pdf_hacks_js_bookmarks", true );
    1 w; z% v* ?( D9 _0 @}4 T' ]  k; j# y* b2 A
    function GetData() ...{; ~  r! b# B( k4 ]; u* o  r& h$ u
      // reverse of SaveData; return an array of arrays+ [$ _4 O. ~& U. Q" P* F
      if( global.pdf_hacks_js_bookmarks== null ) ...{! B* P2 }. A( y) b% B
        return new Array(0);
    4 O2 J+ _/ V& G7 O1 C  }. g3 C5 c- v. j& e3 k+ y# k6 }
      var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );/ n/ e: x$ Z% t7 g
      var data= new Array();
    5 l  G4 l+ x% N* w  for( ii= 0; ii< flat.length; ) ...{( w4 E# Z9 v- Y5 Q8 `+ p" ^8 x
        var record= new Array();, E$ H( W2 j1 @, J* ^: u  ^
        for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) ...{
    1 Z; Y. \0 O) F* S9 a9 \, C: S      record.push( flat[ii] );
    ) V6 j& T& B5 s+ H4 d    }
    * M5 j* c  v$ W. [& L, s    if( record.length== 3 ) ...{3 P- q; b% h2 H$ V4 _4 f4 `
          data.push( record );. z$ b. e% _  [( A( m8 u/ Z
        }
    / H9 w0 k$ Y3 K+ m& D4 V  }1 J, Z* w8 n1 \" Q# N. E
      return data;- m4 ?1 B* ~$ R9 k% R& D
    }
    8 F+ `( U% W' J7 r//Get Current Date8 K1 L4 N; S5 m2 }3 N# J& M
    function DateNow()...{
    7 ~- {# `9 W  n/ v2 w   var d, s ;
    8 n* o. C* G  x: C" B" r   d = new Date();
    ! ~. R* S, x- w3 T$ `   s = d.getFullYear()+"/";
    ) A+ b6 a& g$ g   s += (d.getMonth() + 1) + "/";
    7 T3 J0 `# z. S' _  ~6 z+ ]# N6 w   s += d.getDate() ;
    # X) j5 e7 ~/ D% |4 ~, v, k7 y4 |   /**//*/ H4 u" V6 S* Z7 a5 q
       s += d.getHours() + ":";8 V5 a" ^5 {" z9 Q- E$ v! b$ G% Q
       s += d.getMinutes() + ":";) [- L! O% M. s
       s += d.getSeconds() ;
    % W8 c- |& a1 \% L( P( l/ |   */
    " j1 m3 U- m" @$ E' x   return(s);
    # R" g% t9 C" R/ ^* `. m}) B' |/ w' F' E1 n
    ' S0 h. R2 T3 ~. u# t2 U1 K
    function AddBookmark() ...{7 f4 ]( Z  F+ C
      // query the user for a name, and then combine it with( z9 a7 O, L8 @5 q( u4 ^) K
      // the current PDF page to create a record; store this record
    0 c3 `9 C+ u' Y  var thisfilename=this.documentFileName;, x- O4 b" y. z7 J8 e6 n& ^3 a
      thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));
    - G. ?4 p' T4 c. Y+ G- l0 D  var numPlugInss=this.pageNum+1;
    $ ^, r) c0 t+ W  var currentdate=DateNow();* |& f! h& O5 q7 R% L/ r* g
      var label= 5 o" U, S+ m" {1 v; |+ L' D
        app.response( "书签名称,可以修改以便于记忆:",
    ! _+ O# N( ~4 `- p+ L- q                  "书签名称",+ N$ w8 p+ O; T
                      "《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页  "+currentdate,  S0 E* m& d% W3 p, i) }
                      false );
    0 c: H$ P, Q: T  if( label!= null ) ...{9 H# P9 {( L2 Z. S! |
        var record= new Array(3);# j) H! T9 L3 c' j) h9 }8 y
        record[0]= label;. o2 e! z7 I# P1 B
        record[1]= this.path;* E* n6 |+ q( _6 C! }/ f2 y
        record[2]= this.pageNum;
    ) C# g7 ~0 L1 Z3 B( ]    data= GetData();
    . m3 l( G" T! |3 [    data.push( record );4 M2 p: @- l" @: F* d) V
        SaveData( data );) V/ ^. }  j3 h& e% T
      }
    ; S9 E; ]9 Q7 R  v& U& y& B8 b}
    - m) C" s4 X3 }6 A' n; Efunction ShowBookmarks() ...{. T" T, z  g) F3 v1 f! z
      // show a pop-up menu; this seems to only work when
    9 _8 x9 z! q7 x$ P* z$ F( S1 D8 [9 o% i  // a PDF is alreay in the viewer;1 g  P) D; g& q/ Q% d
      var data= GetData();# J+ T/ O  a8 x3 P: n
      var items= '';
    3 b2 X+ I9 ^* Q& b; p  for( ii= 0; ii< data.length; ++ii ) ...{0 b% r& a/ I6 R7 R" S
        if( ii!= 0 )
    , g1 O; B2 t) }! \+ x! \      items+= ', ';/ [& l* S4 e# Q6 p! a6 r& D
        items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
    : `$ {3 `- O8 l7 o( ?7 V  }; n% g: z+ ~4 o! t  X; i! C
      // assemble the command and the execute it with eval()
    ) G, k- D6 _/ g/ P1 Q, E4 O' m  var command= 'app.popUpMenu( '+ items+ ' );';
      I% G+ i2 D9 N: f1 t0 k  var selection= eval( command );3 O& f1 \' t9 {- S+ Q3 _) W
      if( selection== null ) ...{
    # U$ s8 N% y; U/ A6 O: @7 g    return; // exit
    ) x, w1 l! Q: L( y% u  }
    4 y% }$ \9 O  @6 f  // the user made a selection; parse out its index and use it! e$ Z2 p) q2 k0 w3 E
      // to access the bookmark record9 Q' ?. Z- d! g1 M5 Z" @6 M# n' x, e9 h
      var index= 0;+ S( l# g; _! b
      // toString() converts the String object to a string literal# i7 ~+ c: w7 j3 D
      // eval() converts the string literal to a number
    ' |/ b/ E; D7 Q! S  index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );
    1 m3 v) ?+ E9 w7 Z$ G1 `" x/ B8 G) i  if( index< data.length ) ...{
    4 [8 [& b+ C( y$ Z" ^( P" \- Y" {    try ...{- N+ ]4 ]$ X1 l
          // the document must be 'disclosed' for us to have any access
    * M( ?! l1 z* i* T( ~- A5 V      // to its properties, so we use these FirstPage NextPage calls) N. m  f- G8 h" X. q! o2 `- ^
          //1 o$ x8 x0 ^, f, V- }: o; H" k
          app.openDoc( data[index][1] );. @+ U) T: v7 O+ h3 p( f
          app.execMenuItem( "FirstPage" );6 E5 ?! k1 I, ^' w. \6 \6 G; i( o
          for( ii= 0; ii< data[index][2]; ++ii ) ...{
    ; O  ]) |3 B& d2 o* m        app.execMenuItem( "NextPage" );4 R$ D" v' ~% `3 P
          }* x' B4 w# q# E5 a$ m7 H2 x
        }7 ?( A, J4 a5 H
        catch( ee ) ...{
      v( r, f7 f" W5 z5 Y      var response= ' q3 M. T. `5 c4 E* U' p0 T
            app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");
    - w% m/ [. J; J; S      if( response== 4 && index< data.length ) ...{( i, W$ i3 X* h$ [8 M
            data.splice( index, 1 );. ]# A/ o3 V0 i& F
            SaveData( data );3 u% ], T# w. N8 y& ]! k
          }0 W# }9 F. V2 U& t3 K
        }
    % m6 Q# b0 q  j3 E: E- E+ |! L  }5 O  y* R2 R) ]- Z" {
    }
    , u8 G/ [; B0 pfunction DropBookmark() ...{
    + k" \, z. ^; _1 ], K  // modelled after ShowBookmarks()
      v, w# u- [9 {. h5 [  var data= GetData();$ M/ P* Y, ?# }# Z; N% \6 S1 o0 z
      var items= '';+ S& B# A$ Q7 g+ C
      for( ii= 0; ii< data.length; ++ii ) ...{
    ( l7 i# R& J0 I4 P% e$ v" ?$ C    if( ii!= 0 )
    - X8 ], s9 v* g) A9 k8 k      items+= ', ';
    ! e& a9 c, s. {- L    items+= '"'+ ii+ ': '+ data[ii][0]+ '"';; C, }  R' p$ ~3 k5 M! L# F
      }( `: y4 a% x$ O# R6 `$ R
      var command= 'app.popUpMenu( '+ items+ ' );';/ `) }% q! i4 V8 Z; h
      var selection= eval( command );
    ; {' Y5 _8 l& T7 i' {: {) I  if( selection== null ) ...{
    : t1 R: o$ h# q    return; // exit* F$ T+ }( A* {* Q: G5 H) f! e
      }
    - y+ @4 _7 ]7 l+ D. o7 M  var index= 0;; t: [% Q0 S  L% p' H2 y7 k
      index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );
    " v  `2 V# W7 {) Q9 W9 S  if( index< data.length ) ...{4 ~/ {4 m% H) R
        data.splice( index, 1 );
    ! ^' p: d( `( F    SaveData( data );5 ~) w7 n2 Q: h* N
      }
      n- u3 R1 P' M* H( j}
    1 k; p8 \6 a4 F/ Ffunction ClearBookmarks() ...{6 ~2 d  ^6 ?/ Q' C9 I
      if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) ...{. v: w1 Y& w/ s! w  P2 z
        SaveData( new Array(0) );
    + x/ o. o2 G4 v$ B: u" n  }
    ( P3 d/ X' l% f& f}  X0 x3 x- X6 R# k: m9 v
    app.addMenuItem( ...{
    1 e: ^1 G! g/ }1 o4 scName: "-",              // menu divider
    5 a* V2 J/ z' @; pcParent: "View",         // append to the View menu
    ; d# m8 `: A/ s2 W# ocExec: "void(0);" } );
    - a- _& D3 Y* \, Dapp.addMenuItem( ...{& Q' Y  l0 O6 Q# t4 B
    cName: "设置本页为书签(&B)",
    - y  }& p8 {4 ~1 C+ T/ ZcParent: "View",
    9 W, X9 S) U- `9 M+ EcExec: "AddBookmark();",
    ) U& }! i. `! [" D6 O" ?- ScEnable: "event.rc= (event.target != null);" } );8 I6 s3 X+ a) \! [8 q
    app.addMenuItem( ...{4 `/ N" K- u* U* A4 d( f1 G" U5 G
    cName: "转到指定书签(&T)",
      I& C+ ~. ~) B. m% k9 W2 u; PcParent: "View",. G; m, o0 E+ X5 B& i+ c" k
    cExec: "ShowBookmarks();",
    3 a" {2 T# y: Y$ n( ^7 xcEnable: "event.rc= (event.target != null);" } );0 a2 f. X5 ]- ]
    //cEnable: "event.rc= true;" } );
    9 g, b! }# G; X  b$ u+ happ.addMenuItem( ...{% n3 s: }0 Y3 ?( H! N
    cName: "删除一个书签(&D)",
    ; \! Y! t7 n7 V9 Y5 X2 [1 O: McParent: "View",6 u8 E# b9 o( B" j* H
    cExec: "DropBookmark();",
    . }  V0 D* K2 t0 N& p1 e2 E( ~cEnable: "event.rc= (event.target != null);" } );
    * z% m  w8 M- p. @app.addMenuItem( ...{- A2 [2 B5 L2 a' {1 W
    cName: "清除所有书签(&C)",
    ) {: n/ n; s$ O0 TcParent: "View",
    # H! S, V8 h9 M$ s1 S$ k* C0 Y: k. `cExec: "ClearBookmarks();",
    4 P6 Q8 @  n8 z4 J$ l/ I3 \7 U0 l2 Z- I) dcEnable: "event.rc= true;" } );
    - o, q- e; H6 t) m4 G4 将文件拷贝到C:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下
    6 L$ ^" R- S0 g; Y% ?5 重新打开Adobe Reader,看看下面的图形,相信不用说任何东西,大家都会用了
    ! f9 r# Y; u- p5 y# z! Q" C
    + \% b3 ?: T8 R
    " R' P8 X9 O9 }$ g2 P' L本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aohan/archive/2008/02/20/2108051.aspx
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩

    本版积分规则

    关闭

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

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