下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

让PDF文件也支持书签功能

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

    [LV.Master]伴坛终老

    跳转到指定楼层
    1
    发表于 2011-5-20 10:18:49 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
    最近经常看一些PDF的电子文档,痛苦的是Adobe Reader竟然没有提供书签的功能,每次看完之后再回到上次看的地方都很麻,到网上一找,还真有人就做了PDF的书签,下载一试效果不错,于是参看了一下Adobe Reader的SDK,修改了一点地方,以更方便的使用,下面是程序的使用方法7 _3 {* N9 w4 D9 y* Y" S8 k0 [
    1、打开编辑的首选项项
    7 a5 u" k" |0 ?$ z* ~: G! L
    # V2 N  {4 E, r4 k2、确保下面的选项都被选中
    & z& E1 u4 K* K+ K' U- {8 r
    4 v) A8 W+ r1 Z7 K# _, q' Z1 m3 把下面的代码保存为一个bookmark_page.js文件
    ; o- @6 N1 O/ w/ b+ m( t1 S// bookmark_page.js, ver. 1.0; u. @. S' Q* c, A% I/ l, T
    // visit: www.pdfhacks.com/bookmark_page/
    1 L( j/ p* a5 N5 W! K// edit:cjs 2008-02-17
    ! B2 I5 ]4 A  T// 1 修改为中文标签4 `; r8 }0 t! g/ y
    // 2 设置书签时可以自动获取当前的书名
    , ?: G+ d& s+ K1 u  _( r9 p// 3 自动获取当前所在的页码与总页数,方便查阅' K* D. M7 X0 P( w9 U9 c
    // 4 实现更多功能可以参看Adobe Reader的SDK( r/ ]& s0 ~" U" f/ F7 R/ J2 e
    9 m" G& c# C* A2 k5 D
    // use this delimiter for serializing our array
    " X: y: r% C8 Pvar bp_delim= '%#%#';
    3 S* K) Z, ^( G. bfunction SaveData( data ) ...{
    " U6 G5 ?' q" p0 G' r( n8 G  // data is an array of arrays that needs6 C& I1 j3 h3 \* w! v' \
      // to be serialized and stored into a persistent: r0 o5 T5 t3 `8 l
      // global string# o. W8 g% [6 \( m) E
      var ds= '';
    $ Y( M" B/ E- w8 p5 c  for( ii= 0; ii< data.length; ++ii ) ...{
    4 u" G1 c/ u/ p    for( jj= 0; jj< 3; ++jj ) ...{; w- a: I$ {1 \- V+ B5 {' N+ ?, h
          if( ii!= 0 || jj!= 0 )  e/ A, a& p" `  E8 m; u4 R+ h# G/ g
            ds+= bp_delim;
    # Z: ]1 C% G  a5 \      ds+= data[ii][jj];
    4 {" X% x4 i- g/ J    }
    ) C6 [$ I4 X5 A; A  A( X  }+ t6 G5 y& K' F2 i* \: ^" g
      global.pdf_hacks_js_bookmarks= ds;
    ! G. o+ N7 g; F0 [4 G" i$ R- Z/ E  global.setPersistent( "pdf_hacks_js_bookmarks", true );! ~) H# |/ f4 B0 U2 P$ U$ Z/ ]
    }( S6 O( v- I7 m6 _+ ^% c2 g1 ^* m+ h" c
    function GetData() ...{6 b. U) D# o, ?* v6 F$ l
      // reverse of SaveData; return an array of arrays
    * M! ?* N( |3 w  if( global.pdf_hacks_js_bookmarks== null ) ...{
    ) y0 c* {/ T6 j! m    return new Array(0);+ {0 `$ T. f. P% s$ J8 P) @: F8 n" I
      }- P1 K( O6 [# ~0 _/ O- N4 V5 _* g. D. V7 ]
      var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );$ _! Y% q; P: D' \7 z
      var data= new Array();
    2 x) f1 O+ T3 v1 r9 L0 H  for( ii= 0; ii< flat.length; ) ...{
    7 b' j( h5 R8 d6 p    var record= new Array();
    7 e3 `$ S& F" S3 I    for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) ...{
    7 A/ z. E. Q( E      record.push( flat[ii] );
    2 n( m) Z- _( N    }
    ! p0 r: u0 H9 z    if( record.length== 3 ) ...{
    : H( E" |* H8 y5 J  S/ k! }& @      data.push( record );' y6 B2 B. a1 p
        }
    - S( N3 W4 D; U9 a4 u* ?  }
    ' D9 r8 D. }2 |, R. P9 D  return data;
    ( g+ G  w! V% U2 ]2 X- M; ]}
    : i0 {/ p5 r" i$ D' C' L//Get Current Date
    . T4 W2 }* j3 @0 j( b7 B+ hfunction DateNow()...{; P, c) V, }" w6 D3 C$ Q
       var d, s ;* m4 U  h6 w  }- o3 {3 F) j
       d = new Date();
    8 O) J3 u9 t' M7 X; _* C. O   s = d.getFullYear()+"/";; l4 B2 G7 R4 F, }& b
       s += (d.getMonth() + 1) + "/";. h& d. w, }. f% u
       s += d.getDate() ;
    5 I  c8 W( b" h1 Y   /**//*
    " V( g6 [* B3 J" z, C* w   s += d.getHours() + ":";
    , ^* ^; k2 X1 H. Y   s += d.getMinutes() + ":";8 W+ g( e# p7 X% Y* s; O6 n! w. k' b3 n: T
       s += d.getSeconds() ;" o( j, X: g! N9 s3 R
       */3 d7 H  H% Y% \! p
       return(s);
    : M7 s' `( Z+ {8 I! r1 W0 D% `}4 {( ~" U9 v4 E* \) t1 K6 {

    ! ^- D. X4 q; ]# C  C) r  ~function AddBookmark() ...{
    & g/ v; w) m. l: s& _6 X& q  // query the user for a name, and then combine it with) F- M+ [: }6 i, l. D
      // the current PDF page to create a record; store this record6 o4 w6 E, w3 L3 S$ j
      var thisfilename=this.documentFileName;5 |1 R9 [/ _  y+ S  S1 F. N( k5 B: b
      thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));/ W0 A) L2 J, d6 ~( p
      var numPlugInss=this.pageNum+1;
    + ?9 }- r; x0 {  var currentdate=DateNow();
    ) }0 t5 Y2 s% C8 I: d  var label= # g/ K$ s. T/ J9 i1 j
        app.response( "书签名称,可以修改以便于记忆:",
    ; ~4 Y2 Z' ?9 ]3 V5 C& n, h+ t# G                  "书签名称",
    " J( c, `2 K  N7 D                  "《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页  "+currentdate,
    ; c/ o! f: Y9 p$ [/ M& u4 Y6 j                  false );4 ~# n" F; b0 w  G+ N# {
      if( label!= null ) ...{; c- q. Y6 X% }
        var record= new Array(3);
    - A  l3 ]% D5 N    record[0]= label;
    3 A# t6 T. W# j6 k1 }/ w4 U    record[1]= this.path;, g0 Y2 B. N$ Y6 P8 R
        record[2]= this.pageNum;
    2 d6 g5 j  n& _- R- j/ p1 O    data= GetData();
    8 F( Q- f* e4 G( o: W7 Z1 Y, v( c4 e    data.push( record );
    7 Y( b- _' q) l# @2 l    SaveData( data );2 W* O$ F; k; C8 B
      }4 J% b2 @6 L6 N1 ]4 t9 K. [
    }4 W6 y0 u7 ^% ~  S
    function ShowBookmarks() ...{
    ; G- k. t" _& ]: X3 X' V  // show a pop-up menu; this seems to only work when0 G7 {" F5 c- ]5 x, a
      // a PDF is alreay in the viewer;! @" J. v: Z7 `
      var data= GetData();
    : Q/ ]# ?& F- z% D  var items= '';- y8 I& U# d- J" S$ t9 f6 B
      for( ii= 0; ii< data.length; ++ii ) ...{9 S" J! V) A" }- r
        if( ii!= 0 )
    0 M8 c- l5 E  x      items+= ', ';  v) C4 x# e8 L
        items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
    + v. N6 i& t9 ?  }" `) F  e2 y: V# k- N9 W1 L
      // assemble the command and the execute it with eval()0 @4 i* {& \2 c
      var command= 'app.popUpMenu( '+ items+ ' );';
    / n, j! E4 y  d& k5 H  y2 J  v  var selection= eval( command );
    ( L9 V: @' {6 e( z3 ~9 g* U, p  if( selection== null ) ...{! ?4 N4 v+ i9 u, f
        return; // exit
    . f7 K8 h; G! I; D9 H" J- Q  }  i. T7 U5 f% P& N+ ~$ a# e
      // the user made a selection; parse out its index and use it
    3 S; U7 K" E: b$ b! Y  // to access the bookmark record
    % u5 @4 e% @3 h: I+ g/ ^5 i' _  var index= 0;
    # `- }1 D6 I$ B; h6 O7 T6 d- X  // toString() converts the String object to a string literal
    7 ?/ j  Q( I. F8 f  // eval() converts the string literal to a number
    3 L  x, O* l7 c& S  index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );% E2 L  Z5 x& E  v* ^( k
      if( index< data.length ) ...{# s8 k. e( ~3 L3 ~5 a7 F
        try ...{
    ( F2 ?% ?# S% h      // the document must be 'disclosed' for us to have any access8 R" o4 m5 f4 W' [; p' R: u
          // to its properties, so we use these FirstPage NextPage calls
    ! ?: G8 \; r; q" E! X# o3 L6 n* X      //
    + O* G7 B/ d- t5 q0 X      app.openDoc( data[index][1] );
    ' Z& |8 i: t1 g# A& M# c1 [: `+ c9 z      app.execMenuItem( "FirstPage" );; K' y( a" l- \7 t
          for( ii= 0; ii< data[index][2]; ++ii ) ...{
    1 X1 M: K- L7 S3 [        app.execMenuItem( "NextPage" );
    7 ?' E: k1 p! c6 @# S      }2 o! s" o: T, T: T. @) E
        }
    8 r+ X; ]' w3 D, ~$ x    catch( ee ) ...{
    + C$ j! X! K+ X$ L/ i; s8 p      var response= 1 I4 @- {2 g6 X! Y5 `
            app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");
    6 c- D6 o( ?+ j& G3 g1 q7 l      if( response== 4 && index< data.length ) ...{+ ~' x& l/ V3 Q& r7 c
            data.splice( index, 1 );  l, G% o0 G" E% o/ ]
            SaveData( data );
    3 @/ w" @5 r8 f" H" X8 ^$ G* G      }; z9 c+ W# i' H# Y: I- z
        }
    ' X7 `& I% E6 e0 y  U" t  }! d+ q* `4 v; }% u; o8 M# Z" i" Q
    }6 d" b; n/ d6 W& w$ L1 `* O
    function DropBookmark() ...{% k9 O. z1 p, p6 {2 u% {; w3 z
      // modelled after ShowBookmarks()
    + Y/ [! v$ c% C, Z  var data= GetData();) {% m) ^5 t4 d
      var items= '';+ Z; f: o! }4 Y. {4 B, E
      for( ii= 0; ii< data.length; ++ii ) ...{
    # F: J3 N! Z0 H' g    if( ii!= 0 )9 }1 j6 o! X: S! v1 ^
          items+= ', ';
    , \/ k+ p" u. ]4 V/ ~  V    items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
    : z' ]1 E  {4 Y" L  }
    * P3 c! O7 H- c8 d6 b# a  var command= 'app.popUpMenu( '+ items+ ' );';7 f) m) g9 Q% H# Z" P
      var selection= eval( command );
    ' N. h' H7 F# ^9 q# o6 Q7 L$ M* ]! ^  if( selection== null ) ...{
    1 S& G. d' k  J3 M) Y+ q6 I1 R    return; // exit
    ( D; e: m) m0 {; Z5 `- _  }
    # D1 b0 J$ K8 o3 m  var index= 0;
    ; X+ v/ c$ r+ ^( h) k- ^+ R  index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );2 M/ |3 s, ?, f# {% X" r
      if( index< data.length ) ...{0 S: G$ w- ^8 y7 x( [0 b
        data.splice( index, 1 );; g6 j# N" ~! }$ t6 Q' M2 p
        SaveData( data );4 B, B% U2 c3 x' Y# K
      }' s4 F( y& s  y4 T1 M+ o5 O
    }
    ) B/ V' S7 T- [# zfunction ClearBookmarks() ...{
    8 r; _4 w+ I! X  if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) ...{2 T# j( u& @/ Q4 ~, y0 H, b# J, B* G
        SaveData( new Array(0) );
    $ _( X) J" J* s; p  }' K; \  }. }( h  Z" T4 X1 ?3 n
    }
    ( W9 m$ D- h6 U$ p% R1 gapp.addMenuItem( ...{
    0 M. Q7 F7 D8 [3 p: L7 }cName: "-",              // menu divider# A5 Q4 J$ O1 [: Q$ D: \" m
    cParent: "View",         // append to the View menu
    . ^3 y7 X, F  QcExec: "void(0);" } );5 L2 o9 u9 y! b
    app.addMenuItem( ...{
    % M& V6 p, O7 x8 L, `, {2 ncName: "设置本页为书签(&B)",* @# T2 P6 l* u0 c
    cParent: "View",
    9 }6 I1 d$ V/ \: w+ o- p" ZcExec: "AddBookmark();",
    : t1 h3 ^; y$ kcEnable: "event.rc= (event.target != null);" } );  g" _' Z; A. r% Q& I( l
    app.addMenuItem( ...{
    , n1 [1 u( K" i6 r& ?! z  ^& \cName: "转到指定书签(&T)",, h% ?* i+ `, A+ v" _( m
    cParent: "View",
    & D2 a9 {7 e3 v) R* d- b, ~cExec: "ShowBookmarks();",, b; r& G" X* E! @! q, w; W
    cEnable: "event.rc= (event.target != null);" } );
    4 C9 _$ n* |. W# k9 R//cEnable: "event.rc= true;" } );; c  q, [8 Q+ d8 j) K
    app.addMenuItem( ...{
    , }* V4 e- k5 i- d& scName: "删除一个书签(&D)",
    ( g! f7 a5 X7 i0 d. o0 g# GcParent: "View",
    9 S% H' H/ g& C! Z, Z: tcExec: "DropBookmark();",/ J5 ]' |; M( ~, R+ U' k  N
    cEnable: "event.rc= (event.target != null);" } );5 O" @/ X1 |8 k- @2 K: z( ^
    app.addMenuItem( ...{: g: w) k7 z% P
    cName: "清除所有书签(&C)",
    3 y- x# B7 k- J. l" E) }cParent: "View",) A$ P* m9 M0 @4 T
    cExec: "ClearBookmarks();",1 w3 V* v& I7 h7 Z% ]) J
    cEnable: "event.rc= true;" } );
    1 c2 I7 o# R/ s2 O) l4 将文件拷贝到C:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下0 A4 x1 B! R8 \
    5 重新打开Adobe Reader,看看下面的图形,相信不用说任何东西,大家都会用了
    & S! d2 R/ }* B4 k0 ]+ k. a; I+ L, I) `8 a, B5 _! b

    0 G1 U: {+ t5 t! O9 c0 v本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aohan/archive/2008/02/20/2108051.aspx
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩 转发到微博

    本版积分规则

    关闭

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

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