下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

让PDF文件也支持书签功能

[复制链接]
  • TA的每日心情
    奋斗
    昨天 10:18
  • 签到天数: 2266 天

    [LV.Master]伴坛终老

    跳转到指定楼层
    1
    发表于 2011-5-20 10:18:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近经常看一些PDF的电子文档,痛苦的是Adobe Reader竟然没有提供书签的功能,每次看完之后再回到上次看的地方都很麻,到网上一找,还真有人就做了PDF的书签,下载一试效果不错,于是参看了一下Adobe Reader的SDK,修改了一点地方,以更方便的使用,下面是程序的使用方法
    % A# @! A+ K- \1、打开编辑的首选项项
    & W8 e: f- _1 f+ T
    & U1 D$ a+ L+ m' O1 ]1 W) w  B2、确保下面的选项都被选中3 J# j( ~' y  j, \

    ( b# {* I2 ?! h+ ]9 m# o3 把下面的代码保存为一个bookmark_page.js文件3 g1 H( |9 n. f; r2 x
    // bookmark_page.js, ver. 1.0
    ) ^+ Q! K, X% a  o% y% R: D5 s, r( Z* e// visit: www.pdfhacks.com/bookmark_page/  N& a0 ~' w5 l3 G& n6 T) ^
    // edit:cjs 2008-02-17 9 n* E) `  N$ B8 u
    // 1 修改为中文标签/ [4 |* h2 K, Q& @  T4 L& ~" c
    // 2 设置书签时可以自动获取当前的书名; t" g  V; b/ {7 r: l' w6 r
    // 3 自动获取当前所在的页码与总页数,方便查阅5 b4 ?/ V8 l& @0 j
    // 4 实现更多功能可以参看Adobe Reader的SDK
    5 ]! q! o: Y4 T* |* G4 T. I8 z
    5 u8 N* D' d( g3 \/ I9 {// use this delimiter for serializing our array! R' N( h9 p1 {
    var bp_delim= '%#%#';" N6 w3 a4 `' n( A& `% c- b# F
    function SaveData( data ) ...{" ^) @* Q  R- J1 T
      // data is an array of arrays that needs
    ! j0 B2 {$ {6 H  // to be serialized and stored into a persistent# p  D: v; m6 ^
      // global string
    # o. c2 @  S, o! i  var ds= '';
    ) `9 O/ v* q6 k7 n- S/ A4 ^  for( ii= 0; ii< data.length; ++ii ) ...{; x: x3 w4 b+ d& O' m# B, [6 t; F
        for( jj= 0; jj< 3; ++jj ) ...{
    - ?/ X7 K( W6 L( a9 w      if( ii!= 0 || jj!= 0 )2 {4 w5 m" s/ I, w  z8 d
            ds+= bp_delim;
    / Q9 I' x( u8 @& m      ds+= data[ii][jj];, [. g1 a- {  N$ `  u, n  Q
        }
    ; r4 z  g) R5 T. Q) q' H  }
    / P- x) z3 C+ v6 j  global.pdf_hacks_js_bookmarks= ds;
    ( x+ B3 m% B' g8 V% U; }  f2 z  global.setPersistent( "pdf_hacks_js_bookmarks", true );1 w: W9 B3 N- F
    }
    5 G! l9 v/ ~  w  ~9 hfunction GetData() ...{
    " [2 y0 |, c1 i  // reverse of SaveData; return an array of arrays( X1 j5 P; h6 [7 @
      if( global.pdf_hacks_js_bookmarks== null ) ...{
    5 g3 i, d9 ^& V6 V' O# @9 p2 X    return new Array(0);) d. D' s" O& F1 u; U& t
      }
    5 D2 U% ~( o2 }0 u2 u7 A) x) a( M  var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );& J+ I+ M: k) u7 W
      var data= new Array();8 ?( B  V$ g4 h8 y( h
      for( ii= 0; ii< flat.length; ) ...{# T9 |" o1 ^, r
        var record= new Array();
    3 Q: J3 p2 q6 d9 T) r9 Q    for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) ...{( l) F  A# d4 ?0 w
          record.push( flat[ii] );& K, n$ W. W- K. ?' ~9 i7 @  L
        }1 ^$ W2 F: R& ^5 T
        if( record.length== 3 ) ...{
    6 Y! F! B, ?9 m: {      data.push( record );: M, S% o1 ^9 y3 H) ?, A
        }
    5 h  p" m) W4 e, X  }
    2 T. X8 J6 {0 n. Y3 c  return data;/ j: l# B7 X+ K1 X/ O, f6 n, N
    }
    0 h& Z, E4 m+ W- n//Get Current Date, f: k& Z# `; z: {
    function DateNow()...{
    + W% p  Z: ~7 }+ Q- W   var d, s ;
    % z- b( j% w0 p- L; ^6 t   d = new Date();0 o( b0 b- T/ L3 m/ t
       s = d.getFullYear()+"/";
    0 a9 X( o: {. t5 `2 y( a! p+ q   s += (d.getMonth() + 1) + "/";
    2 `- P0 K. {* A4 m7 Q   s += d.getDate() ;5 ]: `+ [3 V* L$ ^4 h- k- i  k7 k
       /**//*
      _; S  {6 V. O0 h# _- V5 C0 G- D   s += d.getHours() + ":";
    + L6 F+ E/ d( v# R: b( I( o; `8 ^/ B   s += d.getMinutes() + ":";6 E* ~: N* ~2 ~; L; V' _
       s += d.getSeconds() ;
    / M$ u+ F3 t  S# P   */' l$ o- h1 D8 X2 }3 \) l; h
       return(s);- D6 l5 I1 {9 P- l* a  B5 T) n
    }$ C+ A% {6 m4 ]( g( z
    ( p: ?0 o+ N0 h% Z8 \/ _
    function AddBookmark() ...{
    9 O$ z) U0 @- P* k+ o  // query the user for a name, and then combine it with6 r3 N0 N3 p% `" D  z
      // the current PDF page to create a record; store this record
    5 R: o, k# u8 R0 X1 Y, o% B' R; g  var thisfilename=this.documentFileName;
      m; N/ a% f8 {) ?% }8 t  thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));
    5 P5 T0 [0 W0 N+ S! i0 f  var numPlugInss=this.pageNum+1;9 `  ~9 J% _. g  E1 {) k6 w
      var currentdate=DateNow();
    6 ?9 i7 @, V4 B1 r" }# f* V5 G  var label=
    & `0 O9 C6 @& U7 E7 X2 j8 H  {2 m2 |    app.response( "书签名称,可以修改以便于记忆:",
    & A( m& p) R* h) h4 Q9 z                  "书签名称",
    8 v  D, S' f0 Y6 U/ g3 [8 y7 \                  "《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页  "+currentdate,
    8 O  v, S$ ?6 d7 J& B0 Y4 [                  false );
    $ o' r' D1 A4 M7 ^9 }  if( label!= null ) ...{! ]1 n4 F$ k" V3 b
        var record= new Array(3);  T; ]6 h$ N  ~: B
        record[0]= label;# w% b- I) {2 X; i
        record[1]= this.path;% }& k# R+ T2 a0 o2 Z
        record[2]= this.pageNum;
    , y" }$ t, u# F    data= GetData();6 @  P5 Q* d; `; {% P' Y" v, N
        data.push( record );. N# F. W4 A) {+ y( Z+ a# p0 H) @7 X
        SaveData( data );- u' Z. T- v* n" N
      }6 F$ ^* x  L; x$ g
    }; e' R: ^5 J' s( v' O# {& V
    function ShowBookmarks() ...{" \4 Q" H" H2 k# n. C. `2 W9 u
      // show a pop-up menu; this seems to only work when+ Z% t% W3 `, Q" x1 y1 R/ i
      // a PDF is alreay in the viewer;7 F7 b" {. X& E3 Z
      var data= GetData();! Y  t8 V2 Y# G8 Z  Z+ Y
      var items= '';
    4 c2 G- `3 T- z3 H2 p  for( ii= 0; ii< data.length; ++ii ) ...{
    ) \& u4 F+ k( P2 s1 h    if( ii!= 0 )
    ) d/ U3 B0 {) S, E) P- U      items+= ', ';
    8 d4 O- ~& S5 E4 U2 {2 u    items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
      N+ V* Q" r: O# o2 z2 y( i  }% |/ t2 A" Y9 r+ |0 B  I. ~
      // assemble the command and the execute it with eval()
    $ e, V: t$ ^# B  ?# w  var command= 'app.popUpMenu( '+ items+ ' );';
    ( G; |  {+ p5 G' g, b  var selection= eval( command );
    : o; f. h' \* \  if( selection== null ) ...{+ k( q8 Z" R$ e4 v
        return; // exit
    1 q9 H. y& O4 W. i  }! S$ ~' ~1 M8 N
      // the user made a selection; parse out its index and use it
    ' a: S2 h) r. T% t6 Q% o6 S  // to access the bookmark record
    - d: x- x5 r! _& \6 C; R  var index= 0;  M. z: U1 s! F; y" R5 d& L! b) _; [
      // toString() converts the String object to a string literal9 K; S$ y. G( r/ @; C
      // eval() converts the string literal to a number) r# Z  b$ X8 u' S% F5 o' z
      index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );
    2 l7 M2 ?# ]/ s5 p+ @: j9 B  if( index< data.length ) ...{* T$ s2 y4 E2 b6 ]8 }' z
        try ...{
    & p& r( O8 F7 ~# Y6 U      // the document must be 'disclosed' for us to have any access! C  @4 h& m! {$ }- q+ x* Q
          // to its properties, so we use these FirstPage NextPage calls5 d0 y4 M' n( W" T& T  Q7 H8 v
          //
    0 a3 r4 ~" b0 Z      app.openDoc( data[index][1] );
    " M7 e; V! P# Q" K( @9 T      app.execMenuItem( "FirstPage" );
    , Z: G: h5 Q: }3 e4 M& r      for( ii= 0; ii< data[index][2]; ++ii ) ...{
    4 {1 a! E1 _* K' k        app.execMenuItem( "NextPage" );+ |+ D: w3 \6 I* d& P5 }
          }
    & d9 D1 `/ R1 B0 ^4 u- E; _% d    }) I+ W/ X- E& d8 y$ V" P% b. a. V
        catch( ee ) ...{% i( o) J5 ?5 \# s! Z/ q/ _
          var response= 2 z* O* [6 b& l. ~
            app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");! O7 K& Z7 l3 o! `  i) ^
          if( response== 4 && index< data.length ) ...{
    9 }: S$ G1 q5 R- ]/ J        data.splice( index, 1 );+ x8 h0 d3 U+ F: S6 t8 H" p2 z
            SaveData( data );
    8 m3 s3 B( ^, r7 D      }
    0 T: z) `0 A- F0 v    }5 v# t: z7 \, O# E4 c. A
      }' x8 P0 n* A1 B2 T2 W; `  L" A
    }
    ' s4 t/ g3 t) U1 Q  Gfunction DropBookmark() ...{
    : l; j: T$ \# M7 J! G( S9 Y) c  // modelled after ShowBookmarks()
    $ `# P5 m0 X. e+ D  var data= GetData();6 c$ b" B9 C* P3 l3 t
      var items= '';+ ]. Z: w$ f  P6 \+ z) I
      for( ii= 0; ii< data.length; ++ii ) ...{- T8 f4 h, Y0 [+ X0 l( q; M4 L
        if( ii!= 0 )
      u2 S! B9 y, M+ _$ j      items+= ', ';
    3 J* R  x) J  d    items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
    + f# Q; n. P  O( ?8 V3 M& W  }* x# J% J0 g8 }' ~3 u" S$ x6 @
      var command= 'app.popUpMenu( '+ items+ ' );';$ k$ [4 x" @2 }. H
      var selection= eval( command );6 v$ Q4 M/ o( K
      if( selection== null ) ...{
    6 b+ y5 x$ Z' A$ L* U    return; // exit
    $ h2 P0 k- c( S! `( F  }
    # B' w- d: q5 r6 K; |: M0 B  var index= 0;
    ( T+ u3 L8 B) F/ e0 l  index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );
    ! B7 E( C* V! `0 P: Q  if( index< data.length ) ...{
    0 r  F$ L. x! J  T    data.splice( index, 1 );% P) ~" @# ~! v9 q1 k. o$ z
        SaveData( data );1 \! w. ]. A. K7 k" V, c8 O
      }
    ( i  Y" x* m! ^}' F7 ^, G) B9 t' Z/ K
    function ClearBookmarks() ...{# p/ G' K8 @) t# r* T/ `
      if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) ...{
    6 @6 Z4 k0 B6 q, B+ |    SaveData( new Array(0) );
    % P" }; }3 X/ K* H4 n5 D  }. [0 o# M6 U2 k) N/ M8 g% ~
    }
    $ n4 Y6 Z0 _5 z/ p+ rapp.addMenuItem( ...{. Z: t. q: M/ N& w
    cName: "-",              // menu divider
      d  m3 g3 X: ?' m0 VcParent: "View",         // append to the View menu5 ^- a7 I. r$ c- \3 L2 ], b
    cExec: "void(0);" } );1 L. X( q5 i  d8 N6 K' L2 p
    app.addMenuItem( ...{+ D1 x+ C. A, p, ]( K4 ^2 ?
    cName: "设置本页为书签(&B)",
    ! y  D# O* n6 qcParent: "View",
    1 ]3 p3 ~8 ^* b% g1 _cExec: "AddBookmark();",
    0 o& V5 A9 t5 ?: `cEnable: "event.rc= (event.target != null);" } );# _: J  f$ I( v2 Q" G/ E
    app.addMenuItem( ...{
    1 R6 B& b( U6 q! H" hcName: "转到指定书签(&T)",
    ( i  ?+ v' I  fcParent: "View",2 g* O8 l$ |& p
    cExec: "ShowBookmarks();",  L6 P& `$ ?; O5 X; S) k- n
    cEnable: "event.rc= (event.target != null);" } );/ v$ ]# X  a, U$ J
    //cEnable: "event.rc= true;" } );
    7 Z0 i' ?3 {) k8 L% Kapp.addMenuItem( ...{7 n9 [- t: J% F! w1 U. ]8 `
    cName: "删除一个书签(&D)",: U8 C+ B6 @' `: C6 g( }$ ~; T
    cParent: "View",
    8 g& n# ?" L6 wcExec: "DropBookmark();",
    ! i: R, ^( }. f4 @; L- M) ~2 DcEnable: "event.rc= (event.target != null);" } );
    . A3 G4 ]# F) L. t. Zapp.addMenuItem( ...{8 D: _# \; _6 u
    cName: "清除所有书签(&C)",3 V( ^+ \  x7 @. C" Z( N
    cParent: "View",
    + E) I& Q/ M6 F  f( P4 mcExec: "ClearBookmarks();",9 C' a" k5 z: N9 u5 g& ^; l# K) \
    cEnable: "event.rc= true;" } );  B& [) D& t- _) }7 f& g
    4 将文件拷贝到C:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下
    + l0 @/ s, x8 ^5 重新打开Adobe Reader,看看下面的图形,相信不用说任何东西,大家都会用了) c; ?3 v/ |0 B/ R9 n
    , T% b# x& l) B6 `$ I9 T. _# M
    : P/ i+ ^: E$ |$ w2 c7 s
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aohan/archive/2008/02/20/2108051.aspx
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩 转发到微博

    本版积分规则

    关闭

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

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