TA的每日心情 | 奋斗 昨天 15:16 |
---|
签到天数: 2341 天 [LV.Master]伴坛终老
|
最近经常看一些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 |
|