下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

让PDF文件也支持书签功能

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

    [LV.Master]伴坛终老

    跳转到指定楼层
    1
    发表于 2011-5-20 10:18:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近经常看一些PDF的电子文档,痛苦的是Adobe Reader竟然没有提供书签的功能,每次看完之后再回到上次看的地方都很麻,到网上一找,还真有人就做了PDF的书签,下载一试效果不错,于是参看了一下Adobe Reader的SDK,修改了一点地方,以更方便的使用,下面是程序的使用方法% l- E* l3 R& W! Q
    1、打开编辑的首选项项" n: [+ W# N6 G4 s

    / l3 F+ [* f& r& f+ V! W2、确保下面的选项都被选中( L2 g/ \! }5 t

    ' N: v5 h* K7 l# Z0 e6 Y3 把下面的代码保存为一个bookmark_page.js文件8 ?$ v7 Q( @$ `8 z* ?' Q8 O; m
    // bookmark_page.js, ver. 1.0
    3 |, W# d& P5 U& G" @1 N4 r// visit: www.pdfhacks.com/bookmark_page/* K0 t+ Z: ]# k' M
    // edit:cjs 2008-02-17
    ' N- m. X+ P3 c% S: L% ^// 1 修改为中文标签  d. ~: G: j. q' |. }0 Y
    // 2 设置书签时可以自动获取当前的书名
    1 J2 i! b# V9 a4 S3 V2 N3 D// 3 自动获取当前所在的页码与总页数,方便查阅/ o+ g7 d$ E1 d
    // 4 实现更多功能可以参看Adobe Reader的SDK
    " Z# H  }2 i& M) y7 o8 x
    . @/ N3 ]% |( ]0 j, Z+ @// use this delimiter for serializing our array3 Q+ y- l2 T7 Z" P
    var bp_delim= '%#%#';2 Q( k( l7 L* V+ F# |
    function SaveData( data ) ...{
    , u1 P$ v0 \, s" ~% B  // data is an array of arrays that needs
    # D4 [* x1 ^* D9 y8 G. G7 |; J3 ]  // to be serialized and stored into a persistent% f# x0 ^4 k- x" d# [
      // global string3 |! q1 q5 E: m# a% M# ~
      var ds= '';6 T/ Q5 L8 d( w/ q
      for( ii= 0; ii< data.length; ++ii ) ...{
    7 H5 x4 O0 M/ g0 s" d$ R    for( jj= 0; jj< 3; ++jj ) ...{6 G4 e$ H" P2 I% k/ k# r: t
          if( ii!= 0 || jj!= 0 )
    ) ~& g1 O! ?+ Y5 p5 M5 E        ds+= bp_delim;: C/ P/ _# G8 {* {. v
          ds+= data[ii][jj];
      n2 U1 q& r# X. k8 N) ]* x# o: i    }1 d+ T3 z" `) V( Z; T
      }" {1 o8 y8 v8 S; j5 H0 U
      global.pdf_hacks_js_bookmarks= ds;
    # |, A2 u+ L- W# ~, e  global.setPersistent( "pdf_hacks_js_bookmarks", true );$ D) H# q8 ]9 u, @, t% S
    }
    / ?$ Y) P5 N& P/ A9 b- k5 Ofunction GetData() ...{
    7 H$ P# b+ w9 p: ]8 h  // reverse of SaveData; return an array of arrays
    # R- h! l; ?  `2 |& G9 K9 K8 _  if( global.pdf_hacks_js_bookmarks== null ) ...{: u! |! x0 p! \/ C
        return new Array(0);
    ) s. z! \, J5 B1 i* w. R  }6 n. {8 s( g  \' k! `
      var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );
    # g6 K5 h/ P/ I0 p( n  var data= new Array();
    ; l* |0 x5 L3 V5 i/ Y; E  for( ii= 0; ii< flat.length; ) ...{$ r6 S0 \+ A# d# r
        var record= new Array();0 s4 ^8 s/ |! h* l" p: f6 l0 Q" a
        for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) ...{) c( B4 e/ N/ Y6 v/ H5 E
          record.push( flat[ii] );; d6 K; }- g5 M+ {: R3 o& s! |; r
        }
    . Q/ {  ^% R# _7 B1 @( c    if( record.length== 3 ) ...{  X, b9 w( I  |$ `$ L; U
          data.push( record );
    7 F- @; o1 [9 b    }
    1 C5 O% `1 f+ {* o! T' i  }" n# N" `+ o4 d( u+ u7 L& m
      return data;7 G3 E" x7 G! S. T. H, K
    }1 l* c/ D" B. }1 b  \" {4 G: X5 p
    //Get Current Date
    & I" }( i) d! k1 jfunction DateNow()...{
    + g. o% O- z, c- s; K* P   var d, s ;; R4 W$ b" B/ f+ a
       d = new Date();
    8 g  L' U$ t( L$ u5 E$ J   s = d.getFullYear()+"/";
    # P- I+ M, [7 {8 z   s += (d.getMonth() + 1) + "/";( E7 B" r  e, L2 Q
       s += d.getDate() ;: R. a7 c0 F& Z& c7 }
       /**//*% \0 L, [  P$ i) D* f2 k) t* g
       s += d.getHours() + ":";. Z$ I+ o& a% ]6 E
       s += d.getMinutes() + ":";
    * z- P4 F$ n5 P( ]) {3 b   s += d.getSeconds() ;
    6 U5 U& ?9 _* B* o/ ]6 G+ c   */
    " O# \9 B7 Q' B! O9 `   return(s);2 |9 e* R6 D4 E* h2 V
    }
    0 p2 k' J7 V5 d. B9 `' Y6 B, L; ^& h/ t3 W# ~
    function AddBookmark() ...{
    - m  A* T$ k2 f/ g: v' i. _  // query the user for a name, and then combine it with  s: v- a5 j! \4 M4 \/ _$ G- P
      // the current PDF page to create a record; store this record
    * j. y" U3 H4 [/ k7 @  var thisfilename=this.documentFileName;9 M  B, T5 f. B' W1 e8 K3 e
      thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));
    0 f$ U4 u+ B6 y9 G  var numPlugInss=this.pageNum+1;1 Z3 k7 y" N9 E8 q  o. ^
      var currentdate=DateNow();  Y% i/ f6 p$ `  \% V% k
      var label=
    4 [& ?- q- j/ w    app.response( "书签名称,可以修改以便于记忆:",1 G3 j* }+ ]+ g+ ?1 Z; B
                      "书签名称",4 K* o- Q5 H  i! F5 j+ ^" t7 `
                      "《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页  "+currentdate,* w# F# m8 D8 i& {- k' D8 D; d! I
                      false );
    ( j6 k0 t/ N1 d$ p5 \( Q  if( label!= null ) ...{* c) u* N8 m4 M5 F# ?
        var record= new Array(3);
    * h  x1 G; z8 r: p, t    record[0]= label;3 g4 w# s# }' c# ^
        record[1]= this.path;
    / _3 e' m6 n' Q. {3 u' h    record[2]= this.pageNum;) h) L. U: x, z  A' y" E: X  s
        data= GetData();
    % O, P9 o) w6 d    data.push( record );
    ) t4 Z' A/ W8 Y- R1 d6 Q    SaveData( data );
    4 d2 z3 S: Z% n% f  }+ k" N/ V' a2 N, N% G
    }" _3 d* y0 r) b' ]( e
    function ShowBookmarks() ...{2 K+ ?+ y) j1 f' R0 H: l
      // show a pop-up menu; this seems to only work when( |. p, B/ S! x$ P$ A2 {6 H- n7 g
      // a PDF is alreay in the viewer;
    ; r9 ^8 }: |) C8 i6 x* z  var data= GetData();% ~8 R6 K/ i9 f5 U$ A6 C9 m+ |
      var items= '';% i! \3 a- E) X
      for( ii= 0; ii< data.length; ++ii ) ...{3 U) k; q0 ~" ^6 y
        if( ii!= 0 )
    / k# W" r+ \* |' d) k$ O: T* z      items+= ', ';5 w: t1 L, p1 Y* G8 \" R4 s/ f- n1 M
        items+= '"'+ ii+ ': '+ data[ii][0]+ '"';, Q" I$ V  A! k# A6 l
      }- s' f. {: }- X2 k( Q
      // assemble the command and the execute it with eval()7 R! M1 {5 q& p. d
      var command= 'app.popUpMenu( '+ items+ ' );';! ?) F1 o3 [+ j' R8 K; t! d
      var selection= eval( command );
    2 R8 N( \9 N* r  if( selection== null ) ...{
    1 d* x6 |( C( Y% v- k* g7 w; b    return; // exit/ p/ b6 i9 }8 L2 u/ Y$ p. y% z6 j
      }
    + a: l& q, [9 g9 j' ^" m  // the user made a selection; parse out its index and use it# n( s) j# R, j3 v9 Y$ s5 V
      // to access the bookmark record3 c0 ?) ~9 f/ o" w8 b
      var index= 0;3 r& T% p, g/ F
      // toString() converts the String object to a string literal
    : i3 `. _) \8 [, X' L  // eval() converts the string literal to a number
    ) F5 @( I: V& G& U  index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );/ k2 g1 O7 u1 _8 G
      if( index< data.length ) ...{9 v2 d: ~, s" H- j" e3 u8 i9 E- _0 `$ y
        try ...{: o& `, a5 W, w- X$ j+ \  m) w
          // the document must be 'disclosed' for us to have any access" B0 h9 j  ?  z& h7 f5 L6 E) ^* J
          // to its properties, so we use these FirstPage NextPage calls
    2 d9 M; ?3 a4 v8 ?8 b      //
    ' }, O: R5 L- W* N1 Z0 M, Q; S2 e      app.openDoc( data[index][1] );
    4 f- O- @" C9 _* k. p) H% t      app.execMenuItem( "FirstPage" );
    # y" s; \2 l  |, t- M. a% w+ R( L      for( ii= 0; ii< data[index][2]; ++ii ) ...{
    8 x: @' i2 W: h8 L* M  C' [8 N6 b        app.execMenuItem( "NextPage" );7 t4 p: j; k8 `+ v8 V, ]) u% H: p9 d
          }
    ) G5 `. O2 v1 b7 W+ K/ F: g    }
    $ W$ K7 P& k( }1 U0 c$ |    catch( ee ) ...{
    ; q) t9 R5 d% I" m2 O( I6 y      var response=
    ( |- V5 x. B) L4 o7 z        app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");
    2 O! W6 N# g2 J      if( response== 4 && index< data.length ) ...{
    0 T% [/ b/ ]0 n! x$ Y: H        data.splice( index, 1 );
    : s4 e" H% j5 [1 I! l6 E        SaveData( data );9 J. {; O/ N# r- c* U) U
          }2 P3 j4 Y8 }0 ^* m: J0 L2 b' Z8 L
        }
    ( z- t! @' ^+ ^4 X. V# d! t  }
    ) B, Y( I, [# q3 [# a( l7 Y& k}2 v' [" ~4 c+ j7 L# j2 d+ ?
    function DropBookmark() ...{4 b& K# I! S( ~- r3 X2 H1 o% C
      // modelled after ShowBookmarks()9 q- S+ K( n* [: y7 Z
      var data= GetData();$ j% i# q% u: W
      var items= '';
    & B9 p- s6 R7 J  for( ii= 0; ii< data.length; ++ii ) ...{" W5 y4 j1 y# O8 y& I+ t
        if( ii!= 0 )
    " g& h/ m" F" \8 I      items+= ', ';
    3 ^% D0 X4 j. w; b5 j" V2 U2 S7 z6 U9 l    items+= '"'+ ii+ ': '+ data[ii][0]+ '"';7 z8 T' d$ Z  v6 h
      }
    5 h% j3 }$ E6 J( L  var command= 'app.popUpMenu( '+ items+ ' );';
    / u8 \5 w: \5 S/ k! b  var selection= eval( command );
    # Q7 Z% o2 Q# x5 J! i  if( selection== null ) ...{
    - X; _! a5 n6 x2 ~" N    return; // exit
    - p3 k  [6 u9 x" F  }
    % B6 t$ ?- t# Q: t$ s% g; N  var index= 0;9 r* L' w4 r! M7 g" L2 a) `0 p2 Y
      index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );8 |/ k/ r% j- i, s- A& }
      if( index< data.length ) ...{4 G6 e0 H# Q- g+ p+ s' W, q$ s
        data.splice( index, 1 );
    - ]$ }3 G8 |/ Q    SaveData( data );" p* q3 x" c6 `
      }
    ! l9 V2 x( S$ e, T, R- m}/ v; k2 l0 m: x  K/ ]. W
    function ClearBookmarks() ...{
    . k$ p3 b8 X& Y. g  if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) ...{
    - @# P4 n- K% m2 S& `8 \    SaveData( new Array(0) );5 [0 a3 J7 C7 N# ?8 z# m$ X
      }
    $ G8 ]" b3 r  x- |% h( v}! c4 ~9 U8 b$ [' K% G0 S
    app.addMenuItem( ...{" p4 r, D0 J& ?$ z& P
    cName: "-",              // menu divider6 ^' N7 J" z' f- M5 z$ S
    cParent: "View",         // append to the View menu1 n9 D/ d0 R- f& P* ?+ O: l  W6 v
    cExec: "void(0);" } );5 n2 ^0 u7 o  N5 m/ [) L
    app.addMenuItem( ...{
    * S- r: l6 {* h* _  B: m: n1 ecName: "设置本页为书签(&B)"," u# S% F  g; g9 ^% h# D4 `' k
    cParent: "View",
    & P1 N& c5 B: m4 KcExec: "AddBookmark();",
    3 @2 }: b5 ]" j( K* acEnable: "event.rc= (event.target != null);" } );
    - c0 W; L, \  `$ Aapp.addMenuItem( ...{
    9 J0 ^8 _; s% K$ b2 {% [. G4 QcName: "转到指定书签(&T)",
    3 E& z3 y  [, X7 q( b1 RcParent: "View",
    ) g" Q5 h8 z) p( p! w) F) \cExec: "ShowBookmarks();",
      a$ `' L# q5 S' {' E" bcEnable: "event.rc= (event.target != null);" } );
    & C7 ?8 I: N/ t//cEnable: "event.rc= true;" } );; @3 t3 P! s1 F0 j
    app.addMenuItem( ...{: k3 H4 f/ b- S" V, m' y( i, v
    cName: "删除一个书签(&D)",
    1 {3 t. j, n  y! PcParent: "View",! c; u  E# ^- P
    cExec: "DropBookmark();",
    5 \. D; j' _1 G/ EcEnable: "event.rc= (event.target != null);" } );0 k/ T8 Z1 v! m% E+ I8 X+ s* U! ~7 M
    app.addMenuItem( ...{. ~$ O4 j% x; t! l  V# D4 B' \
    cName: "清除所有书签(&C)",& s8 s  Z$ p' \( v
    cParent: "View",9 T: {& X% _. I- u7 w0 X
    cExec: "ClearBookmarks();",
    3 N1 O/ K. V( t1 Q+ ccEnable: "event.rc= true;" } );+ X) J3 J. J4 p- g6 O0 m2 V# o" |
    4 将文件拷贝到C:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下. k- K/ H+ e/ f, w& r+ f, J/ l+ E, }
    5 重新打开Adobe Reader,看看下面的图形,相信不用说任何东西,大家都会用了
    " L% ~" n) n3 O* C' R$ |2 `# W: o8 F* A+ z6 V9 B
    2 l! ?6 ~7 n1 E; j
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aohan/archive/2008/02/20/2108051.aspx
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩 转发到微博

    本版积分规则

    关闭

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

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