下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

让PDF文件也支持书签功能

[复制链接]
  • TA的每日心情
    擦汗
    昨天 10:03
  • 签到天数: 2274 天

    [LV.Master]伴坛终老

    跳转到指定楼层
    1
    发表于 2011-5-20 10:18:49 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
    最近经常看一些PDF的电子文档,痛苦的是Adobe Reader竟然没有提供书签的功能,每次看完之后再回到上次看的地方都很麻,到网上一找,还真有人就做了PDF的书签,下载一试效果不错,于是参看了一下Adobe Reader的SDK,修改了一点地方,以更方便的使用,下面是程序的使用方法: g  [+ q  L! `0 a- Q
    1、打开编辑的首选项项
    ( [( ~6 S, ^$ E1 r6 y: z" ]7 Y  h6 k1 t- M/ G! ^' ^
    2、确保下面的选项都被选中$ l, @4 S# l0 D# k* d
    & ~& N' J. J: r! T# m
    3 把下面的代码保存为一个bookmark_page.js文件
    8 K  A) T! x0 L4 `// bookmark_page.js, ver. 1.0
    / P7 r# q. @3 N+ j( H7 a/ [7 x// visit: www.pdfhacks.com/bookmark_page/
    6 x7 I& x+ f4 l2 V% b// edit:cjs 2008-02-17 9 X" C! y+ V9 ?+ u8 n
    // 1 修改为中文标签
    ( w/ B0 h3 ?# Y& r& s4 j// 2 设置书签时可以自动获取当前的书名  }6 K; L2 F, y, x8 `7 w0 f
    // 3 自动获取当前所在的页码与总页数,方便查阅5 X) w6 k* l7 K  _$ E$ ~6 @
    // 4 实现更多功能可以参看Adobe Reader的SDK
    / z! i7 a& s! r- M1 S9 c/ I' ^5 A  T) H
    // use this delimiter for serializing our array
    / I/ X! a) @  [/ v  m8 w7 R! ]var bp_delim= '%#%#';* w1 B6 V) _* f9 N  \2 e& O
    function SaveData( data ) ...{/ O7 l/ r5 a) a: K
      // data is an array of arrays that needs
    / M  F3 n# e$ F( S  // to be serialized and stored into a persistent* {3 G1 i6 \5 V3 y; i
      // global string' Q7 h6 g) U: U! O" \
      var ds= '';+ h  E% \( B6 R, }. ~
      for( ii= 0; ii< data.length; ++ii ) ...{
    - A8 J1 x3 |/ v1 J  F( s    for( jj= 0; jj< 3; ++jj ) ...{/ u2 R/ ]/ d( ]4 W# r
          if( ii!= 0 || jj!= 0 )
    3 K/ D. e7 O. X        ds+= bp_delim;
    + j; ^6 L4 o3 a# ^! S, K      ds+= data[ii][jj];
    : q& L  K: B7 b9 g' D1 {    }
    2 L( ~- F3 p( O( y5 [7 y6 V  }
    2 {# f# U9 O; ]2 l. G" W+ w  global.pdf_hacks_js_bookmarks= ds;* Z% J- r, W, c
      global.setPersistent( "pdf_hacks_js_bookmarks", true );
    ; \& L  L. g( d1 w3 q: D1 I/ }}
    : v: p& ~. f* `4 Qfunction GetData() ...{1 A- I) u9 e  r7 ^
      // reverse of SaveData; return an array of arrays, n5 g' e  V9 m4 q; [3 z# O
      if( global.pdf_hacks_js_bookmarks== null ) ...{0 j1 y9 E8 \+ _) h" ]0 }# h! v4 C
        return new Array(0);
    2 c$ {* k. P3 B/ z  m, _+ v0 d  }3 H' L& q% b$ ]/ L" u( N
      var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );% M) ?7 v0 E+ N, k
      var data= new Array();# O0 k* [' Z# v' D, n# w
      for( ii= 0; ii< flat.length; ) ...{
    : W# r) c! M9 Z, ^    var record= new Array();7 T5 _+ x0 @1 N0 d& j
        for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) ...{' K. \, d$ w; q4 X; q% z, G3 m
          record.push( flat[ii] );5 }- s! E% Z9 L8 @8 a5 ^- b4 N
        }
    . W8 l5 [2 f5 g' \( |, }    if( record.length== 3 ) ...{4 M# H, `  b" d+ x7 l* D
          data.push( record );
    - I! `1 Q# p* e+ z- ]    }
    0 G2 l+ w) `2 ^/ N  }3 b8 M" Q. @6 H8 h+ M
      return data;  r: W# E" z9 H" m8 C. V
    }- ^) {0 S4 K, ]+ e: d- F, a
    //Get Current Date( _( _& t, |& Z
    function DateNow()...{
    0 p) _! C: H. o3 {$ C% J* m& e   var d, s ;
    - b9 r% D8 ?6 N% H4 E$ x   d = new Date();
    5 M# ]$ W7 e% X% [2 J9 U   s = d.getFullYear()+"/";
    8 E$ Y6 P6 |. C9 j8 a   s += (d.getMonth() + 1) + "/";
    0 R) J& y- n1 N0 {) X   s += d.getDate() ;
    ' {  o- [) W2 }; X' U& h   /**//*3 n) ^& Q, r2 l. O4 x' s
       s += d.getHours() + ":";3 T' a; b* C" L$ v. H
       s += d.getMinutes() + ":";! k' T9 l, d6 h& k
       s += d.getSeconds() ;) e4 n1 c. |7 G5 a# [6 p7 J0 V
       */
    . p& Q- [+ w4 x/ @0 G* E0 P   return(s);% ^% }  r1 m2 G" K5 {* I. K# c
    }+ U' G: W/ m4 N- M: _

    3 b8 D# F/ s- v% D) Vfunction AddBookmark() ...{5 A" H, I3 L! I  u0 d6 t
      // query the user for a name, and then combine it with5 ]( l+ E4 y9 Z
      // the current PDF page to create a record; store this record
    * c! G6 r- o- X7 \( `# z  var thisfilename=this.documentFileName;
    ; M6 c) q8 ~+ [: p' L2 w" k: t  thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));
    ) [( m* T: W' c4 ]  var numPlugInss=this.pageNum+1;
    . z7 {4 R4 w1 N- M% p6 y. @  var currentdate=DateNow();0 J5 W% i3 e6 m6 |* Q! m* L
      var label= : Z; T9 Y: U$ N8 T& I3 ?7 i
        app.response( "书签名称,可以修改以便于记忆:",0 O- ~6 Q4 P7 o% Q3 I- j, U4 L" r
                      "书签名称",  x& l* E2 _% C& P4 p4 A, Q, M' @
                      "《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页  "+currentdate,
    $ M" q3 }. f+ W                  false );
    . ?" g" k# y( o: q: \9 y3 I+ i) \  if( label!= null ) ...{( w! X4 [$ @: N1 N
        var record= new Array(3);
      [2 L" B' @; x1 t, O2 l/ ?1 q' w$ B    record[0]= label;) |* l7 t5 |4 M( I4 t/ S
        record[1]= this.path;( @5 D" w/ i' O; H. l
        record[2]= this.pageNum;
    - @, n0 M. o: e9 w: L3 d    data= GetData();
    8 _( p' }: S, D7 ^/ e6 y    data.push( record );! z1 n. P1 I) p, X
        SaveData( data );
    % w" T1 J- E7 C0 ?- j  }
    : Z! G* ]1 f: i8 ^}4 b0 o: `; N8 d3 F
    function ShowBookmarks() ...{
    1 T5 K: Q5 r6 O$ J0 S3 C  // show a pop-up menu; this seems to only work when
    , g# v; _: R4 X2 ]  O0 e6 D) g* G6 m  // a PDF is alreay in the viewer;  |3 ]3 [  l' ]+ n% x7 H  \; I7 O
      var data= GetData();
    2 D# O1 B2 L8 \! q. b( ~  var items= '';8 M3 k/ t% g. [* l* _4 i8 }1 O
      for( ii= 0; ii< data.length; ++ii ) ...{
    % ^2 z- X9 r$ t2 U: s    if( ii!= 0 )
    7 U% W8 v) K/ v5 x      items+= ', ';3 I) z4 D3 K7 x
        items+= '"'+ ii+ ': '+ data[ii][0]+ '"';3 s3 X! X* B, `- p, b7 q+ H
      }, E4 z& b1 D" ^: _+ w6 X$ U
      // assemble the command and the execute it with eval()5 V, T& }" c9 `; j
      var command= 'app.popUpMenu( '+ items+ ' );';
    ) N7 |2 O5 l/ Z% M* k  var selection= eval( command );& x4 h( a  X: w/ p
      if( selection== null ) ...{
    . n3 L& o. R6 \7 I" m$ B    return; // exit0 ^! h6 T8 @2 S
      }
    5 X) D& |$ c/ p4 m' e6 v4 P  // the user made a selection; parse out its index and use it6 K0 g+ X0 p) a# j; N( `2 G
      // to access the bookmark record
    7 O9 t0 E5 [4 b  var index= 0;
    # p6 i6 p( Z0 d; K# h% \) z  // toString() converts the String object to a string literal
    2 p3 M1 p2 o  r, @0 [% {9 C  // eval() converts the string literal to a number
    # f/ S" w4 l& w4 `( Y) w  index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );, ~7 \: q" r6 k* M5 ]  W
      if( index< data.length ) ...{0 q5 t' K: f7 q8 D6 K. R( O
        try ...{6 H+ m+ I0 o5 [$ \
          // the document must be 'disclosed' for us to have any access6 Q- B/ x+ {3 o* o7 E$ i& ?
          // to its properties, so we use these FirstPage NextPage calls
    ! o( t/ ]7 e# G% {' Q      /// Z2 R3 f1 T1 E# q" T9 M
          app.openDoc( data[index][1] );
    2 j# T; l8 A; j% E8 T3 V) c; A6 O1 x      app.execMenuItem( "FirstPage" );
    6 q4 ]4 Z( {2 F7 {/ J6 Z$ F! ~      for( ii= 0; ii< data[index][2]; ++ii ) ...{* x2 x- i% s" ?& i( w- t
            app.execMenuItem( "NextPage" );
    , p8 ]: T  }7 e) {, m9 n9 s% {0 T; y      }- _5 @4 }5 ^! r. F
        }
    " L( ]: o/ Y7 q5 F6 a0 a7 o    catch( ee ) ...{
    + g: P. X) }$ |) c4 ]      var response= $ @# h, ?; \+ C7 ~. k  g  j
            app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");
    & |' j$ e5 k$ _: p, [8 w+ [. g      if( response== 4 && index< data.length ) ...{
    ; \* a8 x3 ~- S% U        data.splice( index, 1 );$ k& u  ~: G9 Q5 b# p6 G+ i8 i+ n
            SaveData( data );
    0 h2 m+ x, O) W- d$ f6 j% G8 K  V      }
    ; t# f9 u9 b, B/ D$ H) L, S    }6 f) M/ ^, a: c1 U5 q
      }6 r/ g  }. }) Y9 }! @% e2 W* _
    }
    0 E1 M" }1 Y" y$ R. Z# vfunction DropBookmark() ...{
    / W( R+ U/ i. `8 x. R  // modelled after ShowBookmarks()/ {+ H9 P2 Q0 Q* ^4 T* y
      var data= GetData();6 F4 ^) V) T. _
      var items= '';& I" h# c3 z# W4 q) |2 c, _
      for( ii= 0; ii< data.length; ++ii ) ...{
    : I- @7 ]' N, P7 w$ d+ ]7 p    if( ii!= 0 )
    . `) a+ X1 n/ P0 @* f$ B0 j# ^      items+= ', ';
      o) D2 l& D, i0 A5 K4 s: q7 {- ^    items+= '"'+ ii+ ': '+ data[ii][0]+ '"';& l# s. f" t- A) J$ k3 L
      }' V0 b9 s# n; e) P7 [
      var command= 'app.popUpMenu( '+ items+ ' );';
    % r$ h, T, c. ^3 s  \  _7 B7 ^  var selection= eval( command );
    5 }4 \: N& }" ~9 y9 O( \( ]  if( selection== null ) ...{
    / ^. B+ ?3 T; k5 Q2 A    return; // exit
    7 X& z& h6 z" m! b6 Z  }
    1 x! e9 |. n8 @' C. I/ r, `  var index= 0;7 \% j! l+ a( u7 o0 n
      index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );% f4 q( M, v( v+ c
      if( index< data.length ) ...{# P5 n! _7 d' I0 V2 {
        data.splice( index, 1 );
    ' J! f9 `. `* S7 l! `    SaveData( data );! S/ ?. {  y! g1 p% [1 t
      }
    / O% u, B/ _/ j  e; [}( `. M+ j6 b/ _/ c7 `1 `0 [
    function ClearBookmarks() ...{
    , B2 b- b, y6 p$ g% B  if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) ...{% J: O' b5 y) ~; ^0 `
        SaveData( new Array(0) );- V3 p& B8 p2 J, @
      }4 L1 W% X) x9 [. ]( d
    }+ u/ G2 ]2 I( |/ R/ v7 B
    app.addMenuItem( ...{
    % @% K  p* x. Q% N" J9 CcName: "-",              // menu divider
    & y9 k+ n, O$ m% {cParent: "View",         // append to the View menu
    9 y. T; A9 r) C4 h; k) N8 ecExec: "void(0);" } );: I+ ?/ x: F, [  M" w& |# H6 u
    app.addMenuItem( ...{: j) L' ~& M( ^5 S
    cName: "设置本页为书签(&B)",
    " C3 N9 X% k3 U, b6 G4 o" T0 lcParent: "View",
    8 e# P. X! ^( N  c: @& U( vcExec: "AddBookmark();",9 S! @) K0 P- Y' I
    cEnable: "event.rc= (event.target != null);" } );6 b9 D. V* n* v) }
    app.addMenuItem( ...{0 v' j- z! u: V4 E/ Y3 l
    cName: "转到指定书签(&T)",- B3 o( v! o! V8 G/ }& {2 _1 @
    cParent: "View",8 L* q3 N% |9 g
    cExec: "ShowBookmarks();",; X8 Y% i- K6 k) k
    cEnable: "event.rc= (event.target != null);" } );! {' u" V4 J6 D! p7 V6 q: x6 ?% y
    //cEnable: "event.rc= true;" } );
    % h2 Q9 I5 N( z6 Vapp.addMenuItem( ...{& m2 Q) [. _4 |, J
    cName: "删除一个书签(&D)",- ^, x' B' ]5 t7 i$ t
    cParent: "View",
    9 J$ j/ O$ q! k& E; E: L$ F! T9 NcExec: "DropBookmark();",% u( o! i3 c; t# f" w8 m6 q
    cEnable: "event.rc= (event.target != null);" } );. l& O1 g2 Q* O- u. A
    app.addMenuItem( ...{
    * X% G1 v2 M& ~: ]/ L. y5 AcName: "清除所有书签(&C)",0 F2 W: S+ m" j. J. g0 u2 y
    cParent: "View",0 Y3 C7 r, Y% t$ s8 C
    cExec: "ClearBookmarks();",. S  ?( ~& |5 r  o; B9 x' _& r$ o5 Y
    cEnable: "event.rc= true;" } );9 \+ M6 b% ^7 b- Z+ C- H
    4 将文件拷贝到C:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下
    " R9 b8 T( D. j# V5 重新打开Adobe Reader,看看下面的图形,相信不用说任何东西,大家都会用了
    ; Z" V5 j$ z, ?
    7 ^  v& O. T" E2 @
    " w/ Y' L5 b- b& f% U本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aohan/archive/2008/02/20/2108051.aspx
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩 转发到微博
    关闭

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

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