下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

让PDF文件也支持书签功能

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

    [LV.Master]伴坛终老

    跳转到指定楼层
    1
    发表于 2011-5-20 10:18:49 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
    最近经常看一些PDF的电子文档,痛苦的是Adobe Reader竟然没有提供书签的功能,每次看完之后再回到上次看的地方都很麻,到网上一找,还真有人就做了PDF的书签,下载一试效果不错,于是参看了一下Adobe Reader的SDK,修改了一点地方,以更方便的使用,下面是程序的使用方法4 c2 @# d/ ^) v  F# r2 t
    1、打开编辑的首选项项
    * [7 e: ~- Y- N/ J% X( {, A: \  ?" \5 ]8 ~% ~* M6 _
    2、确保下面的选项都被选中3 f9 L3 B* l6 X0 i, \

    4 O. V1 b" E; d; t3 把下面的代码保存为一个bookmark_page.js文件
    ! R7 F$ N0 N2 k4 S/ m' t// bookmark_page.js, ver. 1.0
    ; _& M$ p$ r8 y% `9 n/ s// visit: www.pdfhacks.com/bookmark_page/* i- `4 J1 X1 w$ \1 B
    // edit:cjs 2008-02-17 7 q& m( q: e0 S/ R4 O3 A# Y
    // 1 修改为中文标签/ g8 Z; {1 ^" x7 f- X! @
    // 2 设置书签时可以自动获取当前的书名# g1 ?3 ~$ I$ s
    // 3 自动获取当前所在的页码与总页数,方便查阅$ X3 |/ F9 J$ z6 l
    // 4 实现更多功能可以参看Adobe Reader的SDK; a' n; O7 Z$ k( f2 @

    * L5 Q0 L  x3 b/ q: d// use this delimiter for serializing our array& ]/ B' b) r  m& I7 O! }
    var bp_delim= '%#%#';
    & k, u+ }) q* ~; ]6 ]- ]3 cfunction SaveData( data ) ...{+ P' Y4 t  Z6 @. l& h
      // data is an array of arrays that needs
    " Z5 [: ~6 p) r( [( X  // to be serialized and stored into a persistent6 h$ [' c" \9 F
      // global string- G- ~, f1 ]0 P4 H' |
      var ds= '';4 o+ T' n. _9 T  c( ~. g
      for( ii= 0; ii< data.length; ++ii ) ...{6 j6 }) L$ j- N5 z
        for( jj= 0; jj< 3; ++jj ) ...{. T2 r( t! j6 v. D0 }, s+ c5 U; |( E; u
          if( ii!= 0 || jj!= 0 )" ^  N  `& n+ ]) s
            ds+= bp_delim;
    . \" ?' L: a( s. w; C, ~0 R      ds+= data[ii][jj];
    ) \# x( m1 L3 K9 d    }! p/ X  Y: x1 D
      }
    + w0 Q. Z; d* g) d7 o' r; a' j  global.pdf_hacks_js_bookmarks= ds;
    % C3 P! v5 X/ O; F  global.setPersistent( "pdf_hacks_js_bookmarks", true );, M& i9 L" {7 b* U; {6 s
    }
    " `  z+ z, [3 Z9 X2 @; nfunction GetData() ...{
    5 c  n4 f& ]) S' f  // reverse of SaveData; return an array of arrays& V. i. ]" ]9 r; N8 m
      if( global.pdf_hacks_js_bookmarks== null ) ...{
    8 m; \  P9 F# [    return new Array(0);
    & P5 L$ X( a$ h& g  }
    & R. P0 P8 f9 E/ u  var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );! x! [8 K3 X2 F1 [
      var data= new Array();
    5 ?3 ?/ l4 x/ F; m& D  for( ii= 0; ii< flat.length; ) ...{
    6 |, Z6 J- j1 I    var record= new Array();6 B0 V/ U: P; \; Q. v
        for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) ...{
    & B& S8 C. n: @      record.push( flat[ii] );7 P4 D  K6 w7 W/ K9 u* U6 P
        }
    ' Q  ?% h6 v3 x; [) O: g) I    if( record.length== 3 ) ...{
    - k* P& o4 I  [5 c8 B      data.push( record );
      u& J+ ?/ @" c6 P' o    }
    " s" `2 h7 y& o) U8 N3 ~  }# I0 I  F# ?% f8 B6 H5 P
      return data;
    . H' l5 i- g: b* k7 T8 e3 h}
    % W2 ]0 i2 Y  L/ g//Get Current Date
    2 X$ S9 c/ D# k, _+ kfunction DateNow()...{. l1 ^- E6 c, e* _' Q5 Z- V
       var d, s ;
    $ E' x  p& O0 Y' D3 q( \   d = new Date();1 y) }% g' F* L: d' H
       s = d.getFullYear()+"/";' A6 E$ m" s4 Y- p: S, `) r
       s += (d.getMonth() + 1) + "/";
    ( x# F6 I( y3 ~( s   s += d.getDate() ;
    + X4 y) O5 I6 q5 c1 d8 x   /**//*
    % W& x3 B3 x2 u; z, \" \* H  Y   s += d.getHours() + ":";
    1 @' {+ u8 z6 J7 T3 v   s += d.getMinutes() + ":";( \$ K  ^- |/ _# k5 u: k3 N; }3 }
       s += d.getSeconds() ;% h  K" r+ q2 i- V4 u0 `* _8 l
       */* k: c$ Y5 U1 Y+ j% B/ C
       return(s);
    , R5 m% J1 `+ ?+ L4 E7 p) Y4 U}& X5 A7 a5 O7 t9 v: d
    7 I9 m) v; I3 b, n1 X/ Z
    function AddBookmark() ...{
    % I* E, k2 b1 k9 G5 R4 H) D  // query the user for a name, and then combine it with5 m& Y! Q% Y) L/ k
      // the current PDF page to create a record; store this record
    4 _& e* c0 A/ G5 k; T  var thisfilename=this.documentFileName;
    - a. e) z; ^, C$ R4 n5 z  thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));
    6 [0 b$ T: ~& p7 U/ J  var numPlugInss=this.pageNum+1;6 B- p; Y: k* q1 n) Z+ M
      var currentdate=DateNow();
    3 d5 g2 y( }/ k, Y# d5 L  var label= 2 u+ F2 B# Y" K/ T3 o$ p
        app.response( "书签名称,可以修改以便于记忆:",) }& I- q  R. k( i
                      "书签名称",) u( X  Y1 d% [5 s* v: x5 Q
                      "《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页  "+currentdate,
    $ B* Z  p7 N/ V# m' Z                  false );
    ) c+ F8 @+ u0 ?: t/ A  if( label!= null ) ...{
    9 R( Y8 S, P6 |6 S) g2 Y+ o8 P# D. K    var record= new Array(3);
    % e7 Q. H+ ~" W4 L  C    record[0]= label;( Q: y  t" D! b+ Q6 c' k8 \
        record[1]= this.path;
    3 F$ v' T2 h/ X7 N2 r! w. K    record[2]= this.pageNum;2 f* Z/ b) d1 v- }$ |5 s8 ?
        data= GetData();) n5 A# t4 y) d" }" _0 U
        data.push( record );( e2 s2 i7 ]2 w# q8 m$ V3 g
        SaveData( data );! L2 {* d3 {+ [$ n' J$ _) s
      }1 S; y6 \* C9 u) w# a% ~
    }
    , F( {, ^( r6 Y/ }4 Rfunction ShowBookmarks() ...{7 `+ O6 X$ G, A1 ?- Z
      // show a pop-up menu; this seems to only work when
    " \7 @& j# N% c! g$ W; B  // a PDF is alreay in the viewer;
    * H" B% M2 X/ r1 ]  var data= GetData();+ e- \: l+ P) T+ o
      var items= '';
    + h7 M1 L8 q; W4 d, w0 @. _% ^  for( ii= 0; ii< data.length; ++ii ) ...{1 C  F5 Y4 u2 S$ {- a5 I, N
        if( ii!= 0 )
    - S: [% f; |7 z      items+= ', ';
    , ?6 J4 e4 j3 m0 [* ?    items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
    4 s0 b1 D/ n2 ~& O  }, C  |5 p. C3 s7 S
      // assemble the command and the execute it with eval()& H3 c6 |; H  `( z+ V( N- A7 ^; x
      var command= 'app.popUpMenu( '+ items+ ' );';
    ( b" M% E, e* x* _! m  var selection= eval( command );
    + h/ `8 d2 U- Z' l3 D4 F  if( selection== null ) ...{$ h9 Z4 W* W" o: T
        return; // exit
    0 a: r1 c0 ?/ Q  }
    8 Z& s* x5 d9 I! ?$ j) N  // the user made a selection; parse out its index and use it* H4 u3 F0 Q' w0 U' l" Z
      // to access the bookmark record  O" v9 Y+ f' a" c
      var index= 0;% K  D! e% p4 t  Z7 U
      // toString() converts the String object to a string literal# B! L1 l' D- p. }$ t0 L, Z: R
      // eval() converts the string literal to a number
    : T, Z: d3 U' F' U5 v8 O  index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );. x( h) M4 s. L% [
      if( index< data.length ) ...{
    $ u9 m4 b, U$ N: g$ h, ~2 r    try ...{1 I( T4 h! k7 U# ~* s+ ~; G
          // the document must be 'disclosed' for us to have any access9 H4 z6 }6 Z+ f  p. ~' o9 Y
          // to its properties, so we use these FirstPage NextPage calls& u/ A* f/ r* e# E) P
          //
    - F# c9 W, y* Z' W3 ]: T* x      app.openDoc( data[index][1] );
    " D1 P2 D7 Q0 o' }8 \      app.execMenuItem( "FirstPage" );" {) P! o8 O- K: T- i# j/ d
          for( ii= 0; ii< data[index][2]; ++ii ) ...{6 X# ^9 H% i' F7 K* n" ?9 j
            app.execMenuItem( "NextPage" );
    . z. J' _# C6 B0 M+ e2 V      }& Z2 z7 Y# @- t" L
        }  y6 P4 r0 j+ p) c; v9 b( Y7 {3 y
        catch( ee ) ...{
    0 N2 Z' X6 a1 O      var response=
    0 M* P: I; \9 f6 K. ~1 S        app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");
    + M, q$ X' R. A2 a- G      if( response== 4 && index< data.length ) ...{0 o+ J* f' y# R
            data.splice( index, 1 );
      r& ^5 d9 n* N/ K. i        SaveData( data );5 J- e; n* i; O+ l" d+ u1 [
          }2 l1 s4 D4 Z5 w( s6 T# Q( E
        }0 l4 I- L2 b/ C: ^
      }
    " h1 v; `( U3 ?0 w- t! Z}
    % v" f: ?3 j6 L: ~( b* Z) h% F2 `  u# Yfunction DropBookmark() ...{
    . N- |, h7 K. t0 N( l* A. t: j  // modelled after ShowBookmarks()
    : C9 E% P) S3 L$ d$ a# o  var data= GetData();1 {9 b' O: ~2 Z& y( _1 s& \
      var items= '';
    3 r7 _' F# E4 F  for( ii= 0; ii< data.length; ++ii ) ...{
    + W; ~0 a  u; n/ l    if( ii!= 0 )8 ]+ a# u; d9 j8 f$ [' r: M3 w! d
          items+= ', ';3 H1 Z+ D2 ?" Q; T1 \
        items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
    " ?8 Z0 @( w3 w  }
    . [2 f+ Y% m) q, H7 P  var command= 'app.popUpMenu( '+ items+ ' );';
    $ G  _0 A' s- D! W  var selection= eval( command );; [1 A  h6 j+ R
      if( selection== null ) ...{
    1 n6 A& n0 }9 c& ]    return; // exit
      l0 Y7 [  V2 K2 k( S& }: V  }
    5 i( e  O0 X2 G8 B4 \  var index= 0;
    5 L$ q4 F( ~+ h9 B- t  index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );
    % R$ c& j! l! a/ T/ F) R" v  if( index< data.length ) ...{
    7 J) l1 y4 X) [9 j7 D/ A    data.splice( index, 1 );3 m' V5 @& Z/ g+ E. k" A. K
        SaveData( data );
    1 j6 C. Q: e- ^1 A3 {- M" S. o  }
    8 N# T. _+ ?5 L; T% ]6 e}" d8 i' ]0 a" b# |& s
    function ClearBookmarks() ...{
    . T2 M0 [1 L) ]* ^/ g8 B; d3 O  if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) ...{
    " w) F2 S8 a) I3 \, b; K    SaveData( new Array(0) );
    ( m6 @/ G" L# b  O- _* m/ j  }, N0 D" c- H! w+ u* M  f! L
    }
    & d. }/ g4 g* m$ S0 \$ I& L# s* yapp.addMenuItem( ...{% c4 R# C1 Q; _4 w2 n# L  o
    cName: "-",              // menu divider( C& R" S) Q4 g) s
    cParent: "View",         // append to the View menu
    + x( X; S4 W  Y4 n# EcExec: "void(0);" } );
    " F/ w0 Z  y: W1 R; M& _app.addMenuItem( ...{- g  i+ j0 S, C8 b; s
    cName: "设置本页为书签(&B)",6 u0 K* a0 X( g' M( {; d
    cParent: "View",  A3 g& K+ `0 I( @# Q5 K" G
    cExec: "AddBookmark();",
    ( x: R& t& \* j* KcEnable: "event.rc= (event.target != null);" } );
    7 O/ d$ l& M+ G, R+ capp.addMenuItem( ...{
    ' H. V/ `& H, F; A* B( B6 qcName: "转到指定书签(&T)",6 E5 C) ~/ G% U" r: o) v
    cParent: "View",  s& ?3 e6 z1 c
    cExec: "ShowBookmarks();",: i1 a7 d$ r, S' X7 G% i: j' K
    cEnable: "event.rc= (event.target != null);" } );% L: |: ?( s* I. S8 `# _
    //cEnable: "event.rc= true;" } );
    , {9 o. \# @& @- C9 s7 }app.addMenuItem( ...{! J( I5 y4 H1 r0 ~
    cName: "删除一个书签(&D)",( Q# i8 q$ Y0 L! A( C
    cParent: "View",
    ) |4 L9 H' |9 ycExec: "DropBookmark();",2 v' f% I1 o- f& E5 q
    cEnable: "event.rc= (event.target != null);" } );' r/ _5 S; j5 N
    app.addMenuItem( ...{
    9 ^2 B% E1 D0 n* G2 \. C3 d& mcName: "清除所有书签(&C)",
    , m- Q: z8 y! B' `8 J! a5 `cParent: "View",- F! _! b( K# Y- [3 y. T
    cExec: "ClearBookmarks();",$ c$ r; @6 ?7 R5 Z. U
    cEnable: "event.rc= true;" } );
      Z; }4 c. y% ]% X! N1 e  Y; y4 将文件拷贝到C:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下
    0 H" _- R' c, l6 i$ }: p5 重新打开Adobe Reader,看看下面的图形,相信不用说任何东西,大家都会用了+ D1 r: M% E) S1 p' ~

    % \- O$ r5 j! {  z& ]8 Z3 u) W. }: r" ^  d1 i% u
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aohan/archive/2008/02/20/2108051.aspx
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩 转发到微博
    关闭

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

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