下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

让PDF文件也支持书签功能

[复制链接]
  • TA的每日心情

    昨天 09:48
  • 签到天数: 2262 天

    [LV.Master]伴坛终老

    跳转到指定楼层
    1
    发表于 2011-5-20 10:18:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近经常看一些PDF的电子文档,痛苦的是Adobe Reader竟然没有提供书签的功能,每次看完之后再回到上次看的地方都很麻,到网上一找,还真有人就做了PDF的书签,下载一试效果不错,于是参看了一下Adobe Reader的SDK,修改了一点地方,以更方便的使用,下面是程序的使用方法: p. R4 F. \* J8 |! v% a: o
    1、打开编辑的首选项项
    7 k- r+ T1 a3 ?  U6 R) @6 M
    4 f) F: Y  w& Y# W2、确保下面的选项都被选中; v% b) B/ x6 \  ^% C

    4 A( i5 d  E, I$ Q# j4 E7 G3 把下面的代码保存为一个bookmark_page.js文件& E8 q7 T2 H& U- l. y
    // bookmark_page.js, ver. 1.0
    & m: l+ `* L& p( s$ e& i! w// visit: www.pdfhacks.com/bookmark_page/
    ) I9 s2 Z8 e) k// edit:cjs 2008-02-17
    6 J- }3 N; J2 ~" p! n: O% P// 1 修改为中文标签
    ) l4 S5 a0 h. l, q1 C// 2 设置书签时可以自动获取当前的书名
      v0 f. u) o  j// 3 自动获取当前所在的页码与总页数,方便查阅+ d; Z# c8 J' X1 |1 X; q* y
    // 4 实现更多功能可以参看Adobe Reader的SDK
    5 W6 [0 y) I4 w+ e
    0 |- w9 w' f2 q% ~' ^7 A$ d( \// use this delimiter for serializing our array
    . M4 L7 `0 i$ ^3 Y- ?  ^/ r7 Tvar bp_delim= '%#%#';
    5 A! B1 q3 J# Ufunction SaveData( data ) ...{; M5 Q4 a2 j  E# ~, R0 }* S
      // data is an array of arrays that needs
    ( Z* b8 P9 a3 D8 Y. b: a+ p+ Y3 m  // to be serialized and stored into a persistent
    ) J9 s: I( W" C  m5 c: a; f  // global string; K' C8 B- E- i2 e
      var ds= '';4 X. f8 k. c% t4 T& _
      for( ii= 0; ii< data.length; ++ii ) ...{3 c# k" I( E( }" P$ I8 l: @
        for( jj= 0; jj< 3; ++jj ) ...{8 U5 G6 Y( W) w
          if( ii!= 0 || jj!= 0 )) E: F  z4 O% N, `" g% k3 w
            ds+= bp_delim;
    - |5 y8 A0 A7 W' w' y8 U      ds+= data[ii][jj];
    * s2 r! q  X  |! v4 [; N    }
    * o6 c0 K# C4 W% J  T  }8 f: R) [6 p8 \6 ]; _5 M
      global.pdf_hacks_js_bookmarks= ds;
    ! t$ X% r) [- t$ h3 b. X  global.setPersistent( "pdf_hacks_js_bookmarks", true );  i/ j( \1 X& B4 F
    }. t5 M0 G$ M; C* U# X: ^5 `
    function GetData() ...{6 y  a+ F1 ]! Z0 [% u$ i  k! R6 t
      // reverse of SaveData; return an array of arrays1 `# X6 p( j* h  }" |) n9 |
      if( global.pdf_hacks_js_bookmarks== null ) ...{
    7 [, u9 K. c* t! M* }    return new Array(0);% v& u; x2 n  d, q
      }
    : a& K1 Q9 t( Q! ~' z6 O( \  var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );0 Y$ c. p$ f9 q+ a; g! P
      var data= new Array();
    6 w  t" c: ~' |/ s/ S- c  for( ii= 0; ii< flat.length; ) ...{2 A" ^5 Z0 K" V5 s
        var record= new Array();+ ~% x! `) e1 p/ `# s
        for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) ...{
    4 v0 q+ a- L1 q      record.push( flat[ii] );! |! {6 O6 L; w9 A. a
        }& v5 h5 ^/ Y3 T  p, ?
        if( record.length== 3 ) ...{8 ~6 O: H5 Z2 r; e- d
          data.push( record );
    ( p# c) r0 Z9 i) x  z( t. \    }
    & P0 x; h2 P+ }- p; |  }
    ) ]8 p8 X5 n# L* v' O  return data;
    ) Y, l' G9 r' A. t- o}3 U# X/ V9 ~/ z4 O" s! z- v
    //Get Current Date
    # a# r! ]  e! {) Ffunction DateNow()...{
    6 M- A: ^* X( f- b   var d, s ;
    4 F- s$ @7 w7 A   d = new Date();8 L+ C+ p$ |) E- d6 m" G
       s = d.getFullYear()+"/";
    * O! o6 R" f2 y' M. c( W- y   s += (d.getMonth() + 1) + "/";  p* N* t. D4 X1 U. n
       s += d.getDate() ;. Z& }) l! ^/ P* f- p
       /**//*# J- C; D: ?" [: q5 D! C  b
       s += d.getHours() + ":";
    $ Z0 `( V7 a! K! v# o2 i, s( B5 \   s += d.getMinutes() + ":";
    7 L2 B" h1 e+ [; s& |9 i6 _   s += d.getSeconds() ;% a" T, Y, p' r! D8 ~
       */* N; E0 g0 q" f8 @# x
       return(s);
    3 z2 W% o' F; V5 x& l- z}
    ( u; ?2 `/ F  x, b  m8 B, ^3 N. C2 Y( E! }
    function AddBookmark() ...{- d6 d8 m9 l$ x3 s% {
      // query the user for a name, and then combine it with
    1 L6 i! O  a, Y0 W  // the current PDF page to create a record; store this record
    9 D% t' Y' \; K  var thisfilename=this.documentFileName;# Y1 L& v7 Q, t& R9 ], K
      thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));1 V2 [( G6 s. Q3 v9 d
      var numPlugInss=this.pageNum+1;
    4 b; z+ s' q. ]/ [% B0 N2 T  var currentdate=DateNow();
    : z1 c$ t1 [9 }- t1 N( x8 h  var label=
    ; O4 ~: W4 T( V. C: ~+ Y5 z    app.response( "书签名称,可以修改以便于记忆:",
    % x# U4 @1 G$ @6 S                  "书签名称",
    3 n* m, m- ?; z/ i+ d                  "《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页  "+currentdate,
    . T5 h+ {- w2 }# Q8 O8 E( |  ^' e                  false );
    4 U$ j4 K3 Y: P' N% C  if( label!= null ) ...{0 a$ F2 B4 o& `9 r4 f5 z- o  E0 C/ a
        var record= new Array(3);
    7 r5 h8 }3 h; K2 [    record[0]= label;; O" M" R, h% Z* }; d
        record[1]= this.path;3 k9 i; }! ?7 \/ n; T
        record[2]= this.pageNum;
    ! ~) S1 Q& o3 H# R- U6 A6 s5 Q    data= GetData();
    4 M6 M6 t! r( M/ f' c5 f# x    data.push( record );
      s% a; ^* o2 c& E+ `+ D7 k    SaveData( data );* i+ _0 X1 K6 Z/ p1 Z
      }; s5 o; s- `4 @- B, l4 N# n( M
    }
    9 o( S$ `$ v2 R/ b. Efunction ShowBookmarks() ...{" ]% B/ A! n5 u3 Q
      // show a pop-up menu; this seems to only work when% o- n3 }" {; z% U, Z/ D
      // a PDF is alreay in the viewer;0 h" Z" N# p2 [% b- Q  |0 c
      var data= GetData();0 L2 ?' u% g6 z! f
      var items= '';( q5 {3 {8 X3 O; t8 X! ?
      for( ii= 0; ii< data.length; ++ii ) ...{
    2 ~+ [  _' \6 V    if( ii!= 0 )" L, h: i! c7 w4 v( ^
          items+= ', ';
    % y6 }) y2 n: p( E9 S7 P1 T  Y( s    items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
    * J/ y3 {3 C$ Y- _1 I4 B. G, u  }0 p+ O( [9 \! d0 g) u6 u% \; v
      // assemble the command and the execute it with eval()
    ! d, L) ]+ f9 }& q& E7 T) Q. {* m  var command= 'app.popUpMenu( '+ items+ ' );';. z* t- R6 _9 s4 {  `  v
      var selection= eval( command );1 U  w) Z/ i  ?9 u. r$ B% i5 q* U
      if( selection== null ) ...{
    , L! I  ]8 W+ ]- [; l; X( V    return; // exit9 Z& M% p8 \) D  @
      }
    # A8 q. f2 M4 {! f% Z  // the user made a selection; parse out its index and use it7 N/ B9 `% S# }- k+ E; m
      // to access the bookmark record
    4 V) w( r( q( L( A% ]. L/ r, o! R  var index= 0;: v( N6 z. o- t! @- }/ E
      // toString() converts the String object to a string literal5 M' r2 ]7 V( }4 Z; u
      // eval() converts the string literal to a number
    * B; c0 v9 a1 I+ {4 V  index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );& F, _) N& q6 g& }8 {
      if( index< data.length ) ...{
    5 w6 x* `5 {' }" g( y! X4 n- H7 r    try ...{3 N& V1 b$ f) \( {$ z% I' ]
          // the document must be 'disclosed' for us to have any access0 j2 A9 o1 E6 O# A& w
          // to its properties, so we use these FirstPage NextPage calls9 ^& H6 k. F+ C7 ^% m# L
          //; [# ^1 R% L/ ]& A" |
          app.openDoc( data[index][1] );( e% n: W4 S8 ~' H$ u
          app.execMenuItem( "FirstPage" );
    , B& s5 S. D* X$ t9 d      for( ii= 0; ii< data[index][2]; ++ii ) ...{9 y4 B+ @/ P: N" T, b
            app.execMenuItem( "NextPage" );) i+ ^1 K# |( I( O
          }# C. O* R4 N$ n5 k2 J
        }9 e7 s: c; v5 j
        catch( ee ) ...{
    , Y! N# ^0 @( i/ J; u9 C      var response= 5 P9 ]% `7 i1 j. H: z# Y
            app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");8 y9 m: j/ \4 U
          if( response== 4 && index< data.length ) ...{
    $ C8 J: D1 ^  f        data.splice( index, 1 );- g1 g; {( w" r  P: @- ]# O% m
            SaveData( data );
    ( z' r5 w+ r2 X# u$ i      }# u5 F7 x% K3 t1 y" }
        }4 C9 K6 \+ N' n* P, \
      }
    # y2 i. `/ |7 J: ~) O& M6 C}. E; K0 {# u( L: E" w& ?
    function DropBookmark() ...{6 T* j. R. V( @" n+ Q8 Y# j6 F
      // modelled after ShowBookmarks()- p; `# T1 X! h0 u# W/ O3 U
      var data= GetData();
    & W% Q% N$ h- r. L( m  var items= '';2 [& C* T0 r; z  W! A
      for( ii= 0; ii< data.length; ++ii ) ...{- q% G8 ^, S! a, D
        if( ii!= 0 ): m& T# N; f' t% g7 p4 B
          items+= ', ';
    ! e* Q% V( V% \# v% [9 R. o- j8 ^    items+= '"'+ ii+ ': '+ data[ii][0]+ '"';: f; n+ h( o5 N2 R* D
      }
    0 q* [! Y& q% P7 P* \! n  var command= 'app.popUpMenu( '+ items+ ' );';
    + K7 [% b) N+ d: [& g8 |2 }  var selection= eval( command );2 r4 `5 O% `8 b
      if( selection== null ) ...{
      \1 L! r9 r& G' w    return; // exit
    / M0 ?8 A2 x2 O( D$ D3 _  b  }' j0 C4 E( j% \& f% `& U7 H
      var index= 0;
    " ~1 v8 T! G% h2 \8 A  index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );8 ?9 {1 j; R7 R6 U- D
      if( index< data.length ) ...{
    : m4 G  G, F- x# U9 v2 B' i# ?6 ]# N    data.splice( index, 1 );) R8 c$ O- Q) q. ]" V" j8 p
        SaveData( data );  B- i5 R1 R) n) O) S
      }( s9 O0 E% N# `: A+ o8 X7 R- M
    }9 s; L7 R2 c: v- W# D
    function ClearBookmarks() ...{
    ! g8 D) d, s3 `" X) g8 p  if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) ...{7 s: N5 I) L( Z3 n+ ]1 F
        SaveData( new Array(0) );
    - g. t8 V5 T6 G: T  }
    / Y& B9 E* Z) Y( s0 R+ Z}5 b8 b4 _8 n! r" V* G; p
    app.addMenuItem( ...{
    / G1 ]& a" H" ^$ }; AcName: "-",              // menu divider
    9 ~1 ^3 B) d6 [3 B/ ?+ B$ OcParent: "View",         // append to the View menu
    , D! ?, b' v. |2 R3 KcExec: "void(0);" } );
    / M" D- H' i8 @% yapp.addMenuItem( ...{( I! P: ~6 M( j9 [' S- w
    cName: "设置本页为书签(&B)",
    " q. n! e+ W# ?3 z- UcParent: "View",
    % k2 y: P: Z! scExec: "AddBookmark();",+ Q! Z' I7 @" V$ L
    cEnable: "event.rc= (event.target != null);" } );
    4 ^4 z  c" _% C% a  K: kapp.addMenuItem( ...{' F2 ]6 B( E. R$ D7 Z$ z% o) ~& I+ P
    cName: "转到指定书签(&T)",0 t8 i$ R( v2 s! W) S. o" v
    cParent: "View",
    * t  j) ]- I) f' V+ @  u4 U, lcExec: "ShowBookmarks();",
    . a, V/ U) B( S: FcEnable: "event.rc= (event.target != null);" } );
    # S% R3 V& y' {: o7 f% K8 o  B% N//cEnable: "event.rc= true;" } );
    * k. V# ~9 U/ gapp.addMenuItem( ...{! Y. h( B; T. X. ^* K# i- L% U
    cName: "删除一个书签(&D)",' c/ ~7 H6 A9 d9 m) O- p
    cParent: "View",( o; y) Y+ \! d( i+ g% N1 l
    cExec: "DropBookmark();",; |5 f: d$ p5 p2 d7 b
    cEnable: "event.rc= (event.target != null);" } );( b( T. ~! \% G% D
    app.addMenuItem( ...{# H! Y& y3 e, l' }+ N0 d. r9 }
    cName: "清除所有书签(&C)",2 W5 f7 T2 a! @+ d/ }1 U
    cParent: "View",8 I+ m. u! n1 \* T
    cExec: "ClearBookmarks();",; a; ^! x) k5 n; g0 b; R- e9 x
    cEnable: "event.rc= true;" } );- Z2 o9 ~9 S" z$ ^
    4 将文件拷贝到C:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下
    ; F, M* W6 K" E" h$ U; w5 重新打开Adobe Reader,看看下面的图形,相信不用说任何东西,大家都会用了1 f# U6 M' S& c& I% m6 s$ X7 P6 B7 Z

    ! ~$ g! \; m: O* ^4 R+ ^  d, a% {0 }1 N( M; k
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aohan/archive/2008/02/20/2108051.aspx
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩 转发到微博

    本版积分规则

    关闭

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

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