下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

让PDF文件也支持书签功能

[复制链接]
  • TA的每日心情
    奋斗
    13 小时前
  • 签到天数: 2255 天

    [LV.Master]伴坛终老

    跳转到指定楼层
    1
    发表于 2011-5-20 10:18:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近经常看一些PDF的电子文档,痛苦的是Adobe Reader竟然没有提供书签的功能,每次看完之后再回到上次看的地方都很麻,到网上一找,还真有人就做了PDF的书签,下载一试效果不错,于是参看了一下Adobe Reader的SDK,修改了一点地方,以更方便的使用,下面是程序的使用方法
    + |+ Z% z: g, t8 c1、打开编辑的首选项项
    1 }! m4 h5 L  e# X7 e& v2 a: V
    . |2 J( T' o& p! Y, u% E/ _2、确保下面的选项都被选中* M7 O, d/ T: k1 x0 p9 Y
    - d: x+ s, O0 V+ J
    3 把下面的代码保存为一个bookmark_page.js文件
    ( R9 j5 T, d6 t// bookmark_page.js, ver. 1.0
    - u( \+ \9 \5 U) g" }// visit: www.pdfhacks.com/bookmark_page/
    - a% v7 Y7 }4 a* o( ?// edit:cjs 2008-02-17
    0 Y! Y+ g2 B5 i1 [// 1 修改为中文标签; V; L3 Z) q$ Y3 u0 A! W
    // 2 设置书签时可以自动获取当前的书名1 d- I/ g0 p' H
    // 3 自动获取当前所在的页码与总页数,方便查阅  O- ?$ B( c  F
    // 4 实现更多功能可以参看Adobe Reader的SDK
    & G; u$ P! r3 k2 }; l. P" ], h+ B$ ], I! z
    // use this delimiter for serializing our array
    " ~" d+ E. L% x" H4 s; y# E+ Qvar bp_delim= '%#%#';& p8 V, i  y) ^+ B6 Q: d) s
    function SaveData( data ) ...{
    % D; V1 w9 c+ H2 n8 y- m  // data is an array of arrays that needs. a! y4 o- M9 C/ L+ g
      // to be serialized and stored into a persistent4 L; A3 v% R" E
      // global string
    ' m2 e. r) I) u- ~+ Q7 L& `' B  var ds= '';
    4 r$ y; s+ \* n0 M% S- q  for( ii= 0; ii< data.length; ++ii ) ...{
    7 i+ C. |2 K1 h% _6 {% l0 V    for( jj= 0; jj< 3; ++jj ) ...{1 F/ E" ?% |: m
          if( ii!= 0 || jj!= 0 )6 Q- g* c" ?/ c1 H+ H' e
            ds+= bp_delim;4 d. Q  F2 k4 v' C4 R
          ds+= data[ii][jj];& K& G2 |4 {6 r
        }
    - m, H, l! g2 U- u& }3 o  }
    . O% ]( j: u  a+ \: W. Y8 `2 ~3 k  e3 L- a  global.pdf_hacks_js_bookmarks= ds;: U) J4 i2 ~6 n+ A! I9 n  }
      global.setPersistent( "pdf_hacks_js_bookmarks", true );
    8 v2 \* q9 x: L- I}/ f( O* w. z# I
    function GetData() ...{. J1 D* N; L" X9 ~+ s( G
      // reverse of SaveData; return an array of arrays4 a4 D$ k' o# M% x( x* p% M
      if( global.pdf_hacks_js_bookmarks== null ) ...{$ J% y0 Y( S- g8 h" ~
        return new Array(0);0 Q  c' T6 I; T
      }
    ! B# ]# M- }" H  var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );
    ( g" q6 q- S- P# `3 V- c. P  var data= new Array();( \0 P3 H1 C2 Y
      for( ii= 0; ii< flat.length; ) ...{
    4 n( u# T" T* U5 h' y9 y    var record= new Array();
    2 t% w9 A+ z3 o* Z5 |& o( S    for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) ...{' ]# ]- n" B  H
          record.push( flat[ii] );* ]9 _( h, _/ B( }$ |2 Y  h
        }2 o" O2 A0 z+ y* L  A7 v- {
        if( record.length== 3 ) ...{
    2 z1 Z1 c4 r# f' s: N: b8 y      data.push( record );0 S4 {" L6 q. D1 [3 O
        }
    # e/ C8 ?( n! z0 a# }  H' P6 w& \+ D  }
    ( j1 v! K' r9 A4 z' ?  return data;
    7 I9 N2 C7 y7 D3 a( M2 G* d}9 O& F# M4 A" A% A! l
    //Get Current Date( w5 [4 F8 \2 G% @/ G* z  T- M
    function DateNow()...{
    / j) {2 ~) H- C6 G2 G   var d, s ;* H; H5 `3 Q8 U! U  c& a% s2 S
       d = new Date();
    0 R) o3 i3 F# i7 L( k" a   s = d.getFullYear()+"/";
    5 S9 H; K# }1 F" v, M2 n" w   s += (d.getMonth() + 1) + "/";0 W4 f' L: U! t+ n& W1 a
       s += d.getDate() ;
    ; T  V" \& `* r- U& H; Z; d+ m   /**//*1 y3 ~3 [1 |# c3 ~2 x- }' d: M
       s += d.getHours() + ":";
    $ n  a, p5 B; K+ h7 g/ N   s += d.getMinutes() + ":";/ [  F$ `$ W$ g
       s += d.getSeconds() ;  m; H" R# i) \. z
       */) C6 `! c7 k% [# U- W
       return(s);
    % T6 a/ I  y( o. X# r4 y}
    / S* D0 Z7 r' H* x
    . V* c0 x& ]  B2 @; Y: Lfunction AddBookmark() ...{
    ! g3 Z; p) u5 j5 `0 ?5 k* b; ^1 K4 B5 ~  // query the user for a name, and then combine it with# p5 s6 W0 G2 o4 o6 D3 e
      // the current PDF page to create a record; store this record
    5 f$ b8 M% V; Q% ?  var thisfilename=this.documentFileName;. s0 h, u: P- {" `, w
      thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));: b: d+ b$ Y1 k) h
      var numPlugInss=this.pageNum+1;9 y3 ]3 P6 E; U; Y3 H0 g
      var currentdate=DateNow();: ]/ ]5 \9 S* M- L  X# J* S- a
      var label=
    * X0 y+ a+ @7 o/ w5 L( y    app.response( "书签名称,可以修改以便于记忆:",
    2 D& J8 V/ \& L# K  X                  "书签名称",$ I) D9 m1 D1 V: a0 W) r. U" n
                      "《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页  "+currentdate,
    ; k/ p) e3 l' u4 z) g                  false );/ n2 t3 `( P, `) c( H1 Z5 J7 e
      if( label!= null ) ...{
    5 M' u% O4 M+ y; h) ]" q2 e/ y( f    var record= new Array(3);* }- [- E. A% s5 M
        record[0]= label;
    2 j; ?$ P) b! K2 w" ~5 `  E0 y; C/ t    record[1]= this.path;/ l# F, k4 M  X& k- O9 s
        record[2]= this.pageNum;
    5 d& x/ [# H$ l5 N    data= GetData();- H( e5 _2 H9 W
        data.push( record );; S2 T8 H- w1 C+ {* D  y3 @' M/ q
        SaveData( data );, T* O4 A' C9 F8 i, l
      }
    6 e6 ^. _3 s9 p0 o/ f5 e  ?}
    6 s1 j( Z: @) T& |3 o2 Q! K0 [. O' hfunction ShowBookmarks() ...{
    % n  Q# a4 N6 g6 v0 m7 l& |. e  // show a pop-up menu; this seems to only work when
    7 X! F( ^) E  p& |$ A0 Z& F  // a PDF is alreay in the viewer;5 x5 N. h1 y  @
      var data= GetData();  D* m! E# P1 ~' W% S. e
      var items= '';
    ( D9 {) L- D! S9 M$ g) F2 c  for( ii= 0; ii< data.length; ++ii ) ...{% M. @/ t$ @: f2 a/ d- R# o
        if( ii!= 0 )8 w: d; H9 }! B7 t  e
          items+= ', ';
    1 I: K0 d) h, v8 d1 t5 Y" o% e2 L* n3 m) n    items+= '"'+ ii+ ': '+ data[ii][0]+ '"';' Q2 ^" O9 R; t1 E
      }0 i5 U8 {5 O0 r7 P, r' Z# B2 l. T
      // assemble the command and the execute it with eval()
    % @8 T' V0 |1 d( V! L  var command= 'app.popUpMenu( '+ items+ ' );';* J$ c- ^" ]: Y' P# M% S! F  }& q
      var selection= eval( command );
    1 b# N" u' c/ i) ^0 `$ I  if( selection== null ) ...{" |; H  J: J6 l5 a+ y  K
        return; // exit" X9 F4 y& s, \# e5 s
      }( S& t8 Y  D3 W; |- f
      // the user made a selection; parse out its index and use it
    0 ]5 x" n# |7 ^8 N  // to access the bookmark record
    7 r/ L( r6 i; \, U  var index= 0;
    / {; b6 A  G1 K% Y6 S* u  // toString() converts the String object to a string literal/ G3 T  W, |; s8 S/ V
      // eval() converts the string literal to a number; `0 a, f% ]# O  \$ d
      index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );
    6 ^6 m0 f3 H& T5 l; L0 o  if( index< data.length ) ...{2 m1 L( G6 M' o; R9 Q
        try ...{
    " x+ A/ H- J8 q) F7 V      // the document must be 'disclosed' for us to have any access& [* S, Q  N5 f- i  R* J
          // to its properties, so we use these FirstPage NextPage calls
    , h) {( c& J& G. t& @' x3 b      //: V' b" _; F& [9 m+ i2 E7 U
          app.openDoc( data[index][1] );9 x' ]$ ?6 J  a
          app.execMenuItem( "FirstPage" );# e) _, l/ k2 }# C: r" X' L" _* z
          for( ii= 0; ii< data[index][2]; ++ii ) ...{. N; V/ S% X5 ?- Q2 m3 }
            app.execMenuItem( "NextPage" );' o1 l5 q5 E, v+ ~" P# T1 N
          }
    + ~2 H1 S* `# h# J1 G; m1 X  a    }* W2 D1 g& r- [2 r9 @; p
        catch( ee ) ...{. d7 u1 M/ W2 F6 z7 L) X
          var response= 1 R* s' D2 m) f6 V) ]2 p: I
            app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");
    ; I; _+ N# b1 u      if( response== 4 && index< data.length ) ...{/ E) t5 p% r5 {: q, B3 s- ^  n
            data.splice( index, 1 );
    6 F: t3 C8 D  k+ }% G+ J& U/ Z/ F        SaveData( data );
    6 @+ R3 A! |! M6 s4 [( s4 C      }
    ; G( p) s$ c6 F  U: s/ ?    }
    $ R- W6 f2 X# M! x8 ?& @% P  }' ~( A2 Q1 n4 s5 L- @
    }
    , O, a; v5 W9 n! W2 I9 bfunction DropBookmark() ...{
    $ E8 F; \( G- G) m; n+ U  // modelled after ShowBookmarks()
    * M& d7 K1 `# c" N5 F  var data= GetData();
    $ {+ H  S5 p& _4 @9 t) X0 Q! ^$ v  var items= '';0 W5 w! a0 F# U) k- N$ X( d/ \/ X3 J' _
      for( ii= 0; ii< data.length; ++ii ) ...{0 V/ |1 a0 n: y* V6 v- h
        if( ii!= 0 )
    , v4 r- B% X3 [, K      items+= ', ';
    ' R: y  G" j5 w- L4 K1 G    items+= '"'+ ii+ ': '+ data[ii][0]+ '"';4 b* i( z2 G# K
      }6 ]) v. p- {& |! Z
      var command= 'app.popUpMenu( '+ items+ ' );';2 z' j9 i% W8 {* {7 U  y! [
      var selection= eval( command );0 i: _1 K: v" v; n  e
      if( selection== null ) ...{  }1 m! g: n( E3 j& r
        return; // exit3 w0 A9 S, w. q' m8 S8 N, f" @$ D
      }
    0 n0 [  }1 g% e% {$ h  var index= 0;
    + Q' J7 k; O7 p: k0 s  index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );  b/ W+ R0 L2 q/ S, r' A
      if( index< data.length ) ...{
    ' v) W+ j9 w/ e  {4 P    data.splice( index, 1 );
    * v4 p2 Z& W* d# K& U7 A    SaveData( data );) ~& B& B+ x; {$ e  w+ R/ U& r% b! C
      }
    * H/ i; p- ?: @5 w( R% |# X}2 L& V6 K7 S0 i6 g2 i$ }: p
    function ClearBookmarks() ...{
    $ _. M; d- ^2 ]* @4 j$ H  if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) ...{
    0 x8 ~) a2 L8 ]' ?- K' E% r3 @3 w    SaveData( new Array(0) );  w/ w% h# N+ c5 B9 F3 z/ p7 x) D
      }* D$ K$ e- e# Z7 v, k/ D" N
    }2 ^1 d2 J- g: j, J  j
    app.addMenuItem( ...{" V( M( P) c8 T4 i1 e6 w% G
    cName: "-",              // menu divider
    0 a1 b# b, Z' H1 I! G0 ecParent: "View",         // append to the View menu9 e. [& J  N1 n& P+ J
    cExec: "void(0);" } );
    $ T) E' R  j2 D& ~8 dapp.addMenuItem( ...{: {! ]1 [& i" ]  B1 b' w
    cName: "设置本页为书签(&B)",
    ; m2 I6 D1 ?( c, u8 T9 o$ GcParent: "View",6 r' {9 t" F# r. }. w2 r  S
    cExec: "AddBookmark();",
    9 _7 b  J: m# }1 p/ O; ^; v: ZcEnable: "event.rc= (event.target != null);" } );8 c! q5 y4 C8 f: C
    app.addMenuItem( ...{( C' S2 q* j+ S, p& }/ L( e$ _" M
    cName: "转到指定书签(&T)",* f& K9 r6 e  f7 Z- g
    cParent: "View",3 Z: A( |0 j2 U! s7 g
    cExec: "ShowBookmarks();",
    & t* e( N! ]* }; ?. W: J. u% VcEnable: "event.rc= (event.target != null);" } );5 E& F4 `2 c/ Q5 R
    //cEnable: "event.rc= true;" } );% b% T1 S  Z, Q0 b% E/ ?
    app.addMenuItem( ...{2 P9 E- Z8 k' [7 j4 H, o: K
    cName: "删除一个书签(&D)",
    0 r/ }" Z  j7 a7 _# s, O& l" I7 GcParent: "View",$ x# N1 M& ~/ ~+ I  i- g
    cExec: "DropBookmark();",+ M# _1 Z: E0 U6 @1 g1 |" u
    cEnable: "event.rc= (event.target != null);" } );
    : b# Y, t& ?7 B) }app.addMenuItem( ...{
    0 y- L% B; J( A1 B: }cName: "清除所有书签(&C)",4 V0 T, N8 c* d& f/ Y  ^5 |9 r  Z. {
    cParent: "View",: m1 W9 k( `) ?
    cExec: "ClearBookmarks();",8 O# J2 E  t2 v) {- t8 a& i, P3 U
    cEnable: "event.rc= true;" } );
    ) L. k# U) h! m/ C3 D9 U1 t4 将文件拷贝到C:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下8 @/ l" o5 y8 f. S% g% o
    5 重新打开Adobe Reader,看看下面的图形,相信不用说任何东西,大家都会用了
    8 r! I* ~! e5 V$ X4 l3 X' [/ Y
    . J/ X$ a. i* c* d
    ( ]5 ?# Q  Q9 S( P  d; A  }本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aohan/archive/2008/02/20/2108051.aspx
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩 转发到微博

    本版积分规则

    关闭

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

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