下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

让PDF文件也支持书签功能

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

    [LV.Master]伴坛终老

    跳转到指定楼层
    1
    发表于 2011-5-20 10:18:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近经常看一些PDF的电子文档,痛苦的是Adobe Reader竟然没有提供书签的功能,每次看完之后再回到上次看的地方都很麻,到网上一找,还真有人就做了PDF的书签,下载一试效果不错,于是参看了一下Adobe Reader的SDK,修改了一点地方,以更方便的使用,下面是程序的使用方法
    $ U8 u+ l" ]6 U( Z1、打开编辑的首选项项1 f  E) A" n. ?4 C6 j) d& @
    : X3 Y8 ?. Q) }* C6 e! A9 _
    2、确保下面的选项都被选中
    : b: r/ d* j! g1 A% e1 t- k; H/ X8 R6 c9 X4 @+ B/ }) q4 V
    3 把下面的代码保存为一个bookmark_page.js文件% b  l0 ^; R8 M0 j- m
    // bookmark_page.js, ver. 1.0
      u/ e/ }- d2 v/ v* x+ ~, r// visit: www.pdfhacks.com/bookmark_page/& F( y: n9 D4 ?  ^& n
    // edit:cjs 2008-02-17
    & D+ B2 V# x: G7 K// 1 修改为中文标签/ V$ v8 t" V5 @" _8 h/ g- ]+ O0 x
    // 2 设置书签时可以自动获取当前的书名
    9 U- \! Q% c8 W: M3 M- b// 3 自动获取当前所在的页码与总页数,方便查阅& |/ E  Z# s  o
    // 4 实现更多功能可以参看Adobe Reader的SDK3 @! N/ \9 ?$ s) S% U

    3 t# _, H  h$ k// use this delimiter for serializing our array
    ( V! j# x: k9 P% `! r; ivar bp_delim= '%#%#';& g- s. z/ N. E1 A5 a
    function SaveData( data ) ...{
    5 O9 n3 W; P. O6 }' \& q  // data is an array of arrays that needs- e/ O/ s/ q* x, E/ c
      // to be serialized and stored into a persistent
    6 ~) C7 B7 G" D, }! b& b/ k  // global string/ ?* x! E% g& v$ R* p$ a
      var ds= '';
    9 B  N; k, m3 b7 X. \" `( y  for( ii= 0; ii< data.length; ++ii ) ...{
    - p0 J' M9 O4 k. F- z  t9 @    for( jj= 0; jj< 3; ++jj ) ...{
    2 f8 z6 |6 H! o9 F0 R8 S      if( ii!= 0 || jj!= 0 )
    " @( h6 G. w# Z4 Y        ds+= bp_delim;5 u0 B4 l1 f( D! y# P
          ds+= data[ii][jj];
    ( m3 S9 m' ]& [# R3 ~    }
    & J5 Z2 f+ H2 w- H  }# v7 }. e5 A+ _* O
      global.pdf_hacks_js_bookmarks= ds;
    % N. u4 N, o; Q% d  global.setPersistent( "pdf_hacks_js_bookmarks", true );- M8 C, E. J; R6 m- j; J
    }
    9 V8 V8 r. x6 a6 i7 @5 dfunction GetData() ...{! q, ^8 y" z$ H  `4 a9 t5 i
      // reverse of SaveData; return an array of arrays1 w, h/ `5 t2 b8 ]% j% G
      if( global.pdf_hacks_js_bookmarks== null ) ...{# l; k$ Q" ^4 r+ M0 ^
        return new Array(0);
    " ?! j) l  s# i5 U3 x. L  |, z  }: z6 e! S. p: S1 ]0 ]$ F  N
      var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );/ B( c5 C1 a2 F1 }- _7 v5 R
      var data= new Array();
    " O" a0 e: y' _1 K  for( ii= 0; ii< flat.length; ) ...{; s: n6 y0 H1 q& ~/ b
        var record= new Array();
    % r) K: w* y' x+ @: U/ q    for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) ...{
    ' B% A* w1 S4 F      record.push( flat[ii] );
    # k2 a7 J% h' l1 z    }
    $ `9 ?- t6 D2 q4 i% J' Y; \    if( record.length== 3 ) ...{3 x6 c& W& e. {% E
          data.push( record );7 N  G( n, P9 a. k& F0 |
        }
    7 N2 O" h. X( h; P7 q( B( H  }5 h( |' E; @# B' u4 ~
      return data;" w5 T5 l, j3 V" L% C
    }
    9 `. g7 ~2 |* l1 Z; }//Get Current Date
    ! C( j# P  J. ~- V  Rfunction DateNow()...{; G' U/ R4 H: U: S1 L' w2 |
       var d, s ;# u; v; V4 A4 o. y9 ^( N
       d = new Date();8 B7 n7 X. g: _/ F& l
       s = d.getFullYear()+"/";" T' Q  w* C5 m: ^* p
       s += (d.getMonth() + 1) + "/";
    - G- A* O! s) B0 r   s += d.getDate() ;$ _4 n5 o0 B' z; `: R9 \
       /**//*
    + v: }- A  b, y' E7 }   s += d.getHours() + ":";, H* E" D' `. @
       s += d.getMinutes() + ":";, D4 o! d4 ~0 s; |5 J/ f
       s += d.getSeconds() ;% p" N7 i' D6 e
       */7 ]: ]. I, T& E& X( _/ q  C' L! y
       return(s);
    ) ^. I2 I# P7 w( `: A% t3 P}. m0 W- e: W) ]: B) \' d. K
      b( L8 |( s! e2 a( a7 b
    function AddBookmark() ...{
    9 a$ }( f0 F+ l8 H1 E" d  // query the user for a name, and then combine it with% |; ]- ?3 t; v
      // the current PDF page to create a record; store this record/ J4 D! u/ A7 T
      var thisfilename=this.documentFileName;
    / E! z! w2 b, ?  thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));
    ; C# G: ]) [# c- }' |  var numPlugInss=this.pageNum+1;0 F: H6 F* u9 X( K8 K
      var currentdate=DateNow();
    2 M  j. r% u' ?. Q# v$ e1 `  var label=
      S0 N0 F1 E- H! {& j/ {    app.response( "书签名称,可以修改以便于记忆:",/ Z+ M) t2 Z3 Q) g1 |* L
                      "书签名称",
    # N( N! |9 a' g0 L# o                  "《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页  "+currentdate,% c) h% K$ o9 s' I
                      false );
    ; P  s8 E' E7 S) b* p$ |- b  if( label!= null ) ...{, v: g* x; i2 ~" Q
        var record= new Array(3);5 _8 V7 W4 E& _; B% \6 s
        record[0]= label;
    ( q2 f3 k7 _* Y    record[1]= this.path;
    - z. O# A5 N+ Q# x* ~3 Q, J    record[2]= this.pageNum;# m6 R2 J( A4 C
        data= GetData();
    ! q+ ^+ |- J$ d) U9 ^6 o) g    data.push( record );1 R2 [' k1 D4 {# R$ L8 w
        SaveData( data );
    * V- `5 V1 D2 x6 w, m, c2 u  }
    9 u) e! N) L1 i6 ?+ `}& [. Y& Z. p6 q+ _. {
    function ShowBookmarks() ...{
    2 E: [3 X/ f. f& w& x  // show a pop-up menu; this seems to only work when5 \8 L+ h' Q! T0 G  D
      // a PDF is alreay in the viewer;( S# d; P2 i: Y5 {5 K
      var data= GetData();; }8 u8 F: y5 T2 z
      var items= '';
    " h2 {- M* j: f  Z+ i$ e6 r. \  for( ii= 0; ii< data.length; ++ii ) ...{% U/ X3 a8 E/ @) y
        if( ii!= 0 )
    + e# ?1 n9 ]( B. _- h      items+= ', ';% U8 e' A1 D4 G2 C2 x! m
        items+= '"'+ ii+ ': '+ data[ii][0]+ '"';! y( P6 p8 k4 f
      }( z9 V# \. T' B/ p; N* o
      // assemble the command and the execute it with eval()
    3 E$ d: }- z/ i: P  var command= 'app.popUpMenu( '+ items+ ' );';  ]2 [" l4 E: G3 P6 D$ h
      var selection= eval( command );
    % ^' L. N3 x) T  if( selection== null ) ...{
    1 ^- C+ B4 k$ L) k8 V    return; // exit
    ; Q: _- ^; n5 l( T" m$ f' ?/ B8 p  }
    , }* Q; X/ p" s* t; W* W  // the user made a selection; parse out its index and use it- h8 ?; |* u9 J
      // to access the bookmark record
    # d1 A2 f/ X6 ]9 s* E0 Z  var index= 0;
    , O! Z6 z  O2 ]- `  // toString() converts the String object to a string literal/ G3 U1 C7 B9 |1 X5 |0 z
      // eval() converts the string literal to a number& ^; K9 u- e  J" O: |+ ~
      index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );( G. l% y# v. X# ~& z
      if( index< data.length ) ...{) u5 Q4 o/ R6 `8 u( `7 o, a" D
        try ...{0 ?0 b) S5 @4 Q7 t1 i
          // the document must be 'disclosed' for us to have any access
    6 B1 Z( e+ K6 r& C# w% r      // to its properties, so we use these FirstPage NextPage calls
    1 g- g4 H" F* f( l$ v& ?      //
    1 s1 _- c- L! ^      app.openDoc( data[index][1] );
    ; A& N  Q% ?1 ]      app.execMenuItem( "FirstPage" );/ [& Y/ A( \/ G( a1 p$ F2 ^
          for( ii= 0; ii< data[index][2]; ++ii ) ...{7 T& W7 X& {9 ?
            app.execMenuItem( "NextPage" );3 C, t# \' ]; e! ?! L
          }+ V. w# j  z7 W9 f: T: I7 X
        }
      Q9 @6 b3 D3 l4 w, N. `3 @    catch( ee ) ...{
    5 j0 X# p/ c1 O# d8 z# k* y      var response=
    ' k  I/ }) l/ V  P. d/ r% v" U  B        app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");/ u1 ?: O/ ]  N- ?/ _8 G. U
          if( response== 4 && index< data.length ) ...{$ J: ]% B# H, O- X' n0 y5 o
            data.splice( index, 1 );
    " n! q1 N. h9 M  E, p        SaveData( data );) f( ]" B3 k4 I3 [9 h6 T( P
          }# c9 d+ m8 ^$ \; h
        }* a& Q9 |: M3 j1 w: R1 C2 K1 ?- |
      }  C( q( k" H$ `7 {- P- @+ x7 _% [  w
    }
    / s& Y0 |; X$ L% u. p$ Afunction DropBookmark() ...{2 W8 f# h. h/ E' E7 v; r# J
      // modelled after ShowBookmarks()6 G" @$ n- [% s' `  r" F
      var data= GetData();* B1 o% n9 V  U+ d1 a& W3 D: _! d
      var items= '';+ L5 u/ f* B* v/ j
      for( ii= 0; ii< data.length; ++ii ) ...{* d# l* |: K- ~1 b2 ?1 ?) W
        if( ii!= 0 )
    , Z" E! j* m% x* W4 s      items+= ', ';; }; w( H3 [  b% Z% }9 q$ E; N
        items+= '"'+ ii+ ': '+ data[ii][0]+ '"';; o7 Q* i/ E- q! ]
      }3 `- p# I! m, |# ]) K3 h) G
      var command= 'app.popUpMenu( '+ items+ ' );';5 J5 v6 k2 b4 u
      var selection= eval( command );
    ' P3 A6 j! K' k9 q  if( selection== null ) ...{" `, Z& b- A8 X$ q; Q0 ~0 v
        return; // exit
    , A( \$ z7 f+ N/ J- Y  }0 S+ p7 ^8 y% o$ X6 k5 F
      var index= 0;
    , \. D0 `* A7 F8 ^5 {  index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );4 Y8 {. S' C  G; U! n
      if( index< data.length ) ...{
    # K' o( _5 V0 z, z/ C    data.splice( index, 1 );- }. }3 C& w6 V* V! c+ ]
        SaveData( data );
    , V9 ^; ~; x' U. A1 l. ?  }6 S+ L9 }$ w5 Q; k! w0 R7 F
    }5 m0 d4 j5 s. u3 `/ \
    function ClearBookmarks() ...{! v7 O3 y0 x9 n/ K# E% G- H
      if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) ...{& l0 W- v9 l) E6 Y2 s3 v5 X
        SaveData( new Array(0) );
    2 x8 \- w* a" Y  ]; l9 P" h* w  }& C8 b7 E+ O7 q3 V) K7 m/ D/ K$ `6 }
    }* [) m% T; }( K* n
    app.addMenuItem( ...{/ N9 s9 w% j' k2 `& i
    cName: "-",              // menu divider( ~0 ]/ y; q% }$ f4 Q
    cParent: "View",         // append to the View menu
    " q. t* V  {( rcExec: "void(0);" } );% W! ?) Q8 U$ ?, C+ l' f
    app.addMenuItem( ...{9 ~: f# D( S8 @3 j( m% d
    cName: "设置本页为书签(&B)",
    # F! R! R, h& BcParent: "View",
    * ~! s: U$ s* Y. ocExec: "AddBookmark();",
    8 o  h& e1 E6 Q' tcEnable: "event.rc= (event.target != null);" } );
    $ H  G, a9 S3 \! `6 n! uapp.addMenuItem( ...{
    7 k& E# k1 {# ~cName: "转到指定书签(&T)",# l3 ]0 S& @! b
    cParent: "View",
    2 ~' t. G- _0 ~) Z8 \8 _( a6 BcExec: "ShowBookmarks();",
    : B, j% K$ t: u+ L7 G1 a/ ]cEnable: "event.rc= (event.target != null);" } );
    : S, m/ t, Z& i* e2 M; J  r//cEnable: "event.rc= true;" } );
    ' q( l- U" t" X2 tapp.addMenuItem( ...{) m: a$ @) {( K, b' d% r
    cName: "删除一个书签(&D)",2 m# a4 M/ M) r' F8 _
    cParent: "View",/ H* e. Q% t; |% y/ m2 G8 Y' L! H
    cExec: "DropBookmark();",3 ^5 x6 Y! c  B8 m: ?
    cEnable: "event.rc= (event.target != null);" } );
    8 f) |% H5 D$ E- oapp.addMenuItem( ...{8 d' o$ L4 L- B
    cName: "清除所有书签(&C)",
    ! z6 C/ k# X, @0 c- TcParent: "View",
    % P) D9 v0 j* T3 g+ OcExec: "ClearBookmarks();",
    " v6 k( D% G, v: Q& s( l, ]7 D" GcEnable: "event.rc= true;" } );
    * U, f4 g. h& Z7 X5 Z8 v9 C9 h4 将文件拷贝到C:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下
    6 i4 W  U% K9 q. Z# |) s5 重新打开Adobe Reader,看看下面的图形,相信不用说任何东西,大家都会用了2 I0 A1 r( W$ X# |# m
    + c. a& Q/ B- m1 _
    5 j" |5 r4 K0 Z: s1 F+ O
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aohan/archive/2008/02/20/2108051.aspx
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩 转发到微博

    本版积分规则

    关闭

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

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