TA的每日心情 | 奋斗 昨天 15:16 |
---|
签到天数: 2341 天 [LV.Master]伴坛终老
|
最近经常看一些PDF的电子文档,痛苦的是Adobe Reader竟然没有提供书签的功能,每次看完之后再回到上次看的地方都很麻,到网上一找,还真有人就做了PDF的书签,下载一试效果不错,于是参看了一下Adobe Reader的SDK,修改了一点地方,以更方便的使用,下面是程序的使用方法
$ U8 u+ l" ]6 U( Z1、打开编辑的首选项项1 f E) A" n. ?4 C6 j) d& @
: X3 Y8 ?. Q) }* C6 e! A9 _
2、确保下面的选项都被选中
: b: r/ d* j! g1 A% e1 t- k; H/ X8 R6 c9 X4 @+ B/ }) q4 V
3 把下面的代码保存为一个bookmark_page.js文件% b l0 ^; R8 M0 j- m
// bookmark_page.js, ver. 1.0
u/ e/ }- d2 v/ v* x+ ~, r// visit: www.pdfhacks.com/bookmark_page/& F( y: n9 D4 ? ^& n
// edit:cjs 2008-02-17
& D+ B2 V# x: G7 K// 1 修改为中文标签/ V$ v8 t" V5 @" _8 h/ g- ]+ O0 x
// 2 设置书签时可以自动获取当前的书名
9 U- \! Q% c8 W: M3 M- b// 3 自动获取当前所在的页码与总页数,方便查阅& |/ E Z# s o
// 4 实现更多功能可以参看Adobe Reader的SDK3 @! N/ \9 ?$ s) S% U
3 t# _, H h$ k// use this delimiter for serializing our array
( V! j# x: k9 P% `! r; ivar bp_delim= '%#%#';& g- s. z/ N. E1 A5 a
function SaveData( data ) ...{
5 O9 n3 W; P. O6 }' \& q // data is an array of arrays that needs- e/ O/ s/ q* x, E/ c
// to be serialized and stored into a persistent
6 ~) C7 B7 G" D, }! b& b/ k // global string/ ?* x! E% g& v$ R* p$ a
var ds= '';
9 B N; k, m3 b7 X. \" `( y for( ii= 0; ii< data.length; ++ii ) ...{
- p0 J' M9 O4 k. F- z t9 @ for( jj= 0; jj< 3; ++jj ) ...{
2 f8 z6 |6 H! o9 F0 R8 S if( ii!= 0 || jj!= 0 )
" @( h6 G. w# Z4 Y ds+= bp_delim;5 u0 B4 l1 f( D! y# P
ds+= data[ii][jj];
( m3 S9 m' ]& [# R3 ~ }
& J5 Z2 f+ H2 w- H }# v7 }. e5 A+ _* O
global.pdf_hacks_js_bookmarks= ds;
% N. u4 N, o; Q% d global.setPersistent( "pdf_hacks_js_bookmarks", true );- M8 C, E. J; R6 m- j; J
}
9 V8 V8 r. x6 a6 i7 @5 dfunction GetData() ...{! q, ^8 y" z$ H `4 a9 t5 i
// reverse of SaveData; return an array of arrays1 w, h/ `5 t2 b8 ]% j% G
if( global.pdf_hacks_js_bookmarks== null ) ...{# l; k$ Q" ^4 r+ M0 ^
return new Array(0);
" ?! j) l s# i5 U3 x. L |, z }: z6 e! S. p: S1 ]0 ]$ F N
var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );/ B( c5 C1 a2 F1 }- _7 v5 R
var data= new Array();
" O" a0 e: y' _1 K for( ii= 0; ii< flat.length; ) ...{; s: n6 y0 H1 q& ~/ b
var record= new Array();
% r) K: w* y' x+ @: U/ q for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) ...{
' B% A* w1 S4 F record.push( flat[ii] );
# k2 a7 J% h' l1 z }
$ `9 ?- t6 D2 q4 i% J' Y; \ if( record.length== 3 ) ...{3 x6 c& W& e. {% E
data.push( record );7 N G( n, P9 a. k& F0 |
}
7 N2 O" h. X( h; P7 q( B( H }5 h( |' E; @# B' u4 ~
return data;" w5 T5 l, j3 V" L% C
}
9 `. g7 ~2 |* l1 Z; }//Get Current Date
! C( j# P J. ~- V Rfunction DateNow()...{; G' U/ R4 H: U: S1 L' w2 |
var d, s ;# u; v; V4 A4 o. y9 ^( N
d = new Date();8 B7 n7 X. g: _/ F& l
s = d.getFullYear()+"/";" T' Q w* C5 m: ^* p
s += (d.getMonth() + 1) + "/";
- G- A* O! s) B0 r s += d.getDate() ;$ _4 n5 o0 B' z; `: R9 \
/**//*
+ v: }- A b, y' E7 } s += d.getHours() + ":";, H* E" D' `. @
s += d.getMinutes() + ":";, D4 o! d4 ~0 s; |5 J/ f
s += d.getSeconds() ;% p" N7 i' D6 e
*/7 ]: ]. I, T& E& X( _/ q C' L! y
return(s);
) ^. I2 I# P7 w( `: A% t3 P}. m0 W- e: W) ]: B) \' d. K
b( L8 |( s! e2 a( a7 b
function AddBookmark() ...{
9 a$ }( f0 F+ l8 H1 E" d // query the user for a name, and then combine it with% |; ]- ?3 t; v
// the current PDF page to create a record; store this record/ J4 D! u/ A7 T
var thisfilename=this.documentFileName;
/ E! z! w2 b, ? thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));
; C# G: ]) [# c- }' | var numPlugInss=this.pageNum+1;0 F: H6 F* u9 X( K8 K
var currentdate=DateNow();
2 M j. r% u' ?. Q# v$ e1 ` var label=
S0 N0 F1 E- H! {& j/ { app.response( "书签名称,可以修改以便于记忆:",/ Z+ M) t2 Z3 Q) g1 |* L
"书签名称",
# N( N! |9 a' g0 L# o "《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页 "+currentdate,% c) h% K$ o9 s' I
false );
; P s8 E' E7 S) b* p$ |- b if( label!= null ) ...{, v: g* x; i2 ~" Q
var record= new Array(3);5 _8 V7 W4 E& _; B% \6 s
record[0]= label;
( q2 f3 k7 _* Y record[1]= this.path;
- z. O# A5 N+ Q# x* ~3 Q, J record[2]= this.pageNum;# m6 R2 J( A4 C
data= GetData();
! q+ ^+ |- J$ d) U9 ^6 o) g data.push( record );1 R2 [' k1 D4 {# R$ L8 w
SaveData( data );
* V- `5 V1 D2 x6 w, m, c2 u }
9 u) e! N) L1 i6 ?+ `}& [. Y& Z. p6 q+ _. {
function ShowBookmarks() ...{
2 E: [3 X/ f. f& w& x // show a pop-up menu; this seems to only work when5 \8 L+ h' Q! T0 G D
// a PDF is alreay in the viewer;( S# d; P2 i: Y5 {5 K
var data= GetData();; }8 u8 F: y5 T2 z
var items= '';
" h2 {- M* j: f Z+ i$ e6 r. \ for( ii= 0; ii< data.length; ++ii ) ...{% U/ X3 a8 E/ @) y
if( ii!= 0 )
+ e# ?1 n9 ]( B. _- h items+= ', ';% U8 e' A1 D4 G2 C2 x! m
items+= '"'+ ii+ ': '+ data[ii][0]+ '"';! y( P6 p8 k4 f
}( z9 V# \. T' B/ p; N* o
// assemble the command and the execute it with eval()
3 E$ d: }- z/ i: P var command= 'app.popUpMenu( '+ items+ ' );'; ]2 [" l4 E: G3 P6 D$ h
var selection= eval( command );
% ^' L. N3 x) T if( selection== null ) ...{
1 ^- C+ B4 k$ L) k8 V return; // exit
; Q: _- ^; n5 l( T" m$ f' ?/ B8 p }
, }* Q; X/ p" s* t; W* W // the user made a selection; parse out its index and use it- h8 ?; |* u9 J
// to access the bookmark record
# d1 A2 f/ X6 ]9 s* E0 Z var index= 0;
, O! Z6 z O2 ]- ` // toString() converts the String object to a string literal/ G3 U1 C7 B9 |1 X5 |0 z
// eval() converts the string literal to a number& ^; K9 u- e J" O: |+ ~
index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );( G. l% y# v. X# ~& z
if( index< data.length ) ...{) u5 Q4 o/ R6 `8 u( `7 o, a" D
try ...{0 ?0 b) S5 @4 Q7 t1 i
// the document must be 'disclosed' for us to have any access
6 B1 Z( e+ K6 r& C# w% r // to its properties, so we use these FirstPage NextPage calls
1 g- g4 H" F* f( l$ v& ? //
1 s1 _- c- L! ^ app.openDoc( data[index][1] );
; A& N Q% ?1 ] app.execMenuItem( "FirstPage" );/ [& Y/ A( \/ G( a1 p$ F2 ^
for( ii= 0; ii< data[index][2]; ++ii ) ...{7 T& W7 X& {9 ?
app.execMenuItem( "NextPage" );3 C, t# \' ]; e! ?! L
}+ V. w# j z7 W9 f: T: I7 X
}
Q9 @6 b3 D3 l4 w, N. `3 @ catch( ee ) ...{
5 j0 X# p/ c1 O# d8 z# k* y var response=
' k I/ }) l/ V P. d/ r% v" U B app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");/ u1 ?: O/ ] N- ?/ _8 G. U
if( response== 4 && index< data.length ) ...{$ J: ]% B# H, O- X' n0 y5 o
data.splice( index, 1 );
" n! q1 N. h9 M E, p SaveData( data );) f( ]" B3 k4 I3 [9 h6 T( P
}# c9 d+ m8 ^$ \; h
}* a& Q9 |: M3 j1 w: R1 C2 K1 ?- |
} C( q( k" H$ `7 {- P- @+ x7 _% [ w
}
/ s& Y0 |; X$ L% u. p$ Afunction DropBookmark() ...{2 W8 f# h. h/ E' E7 v; r# J
// modelled after ShowBookmarks()6 G" @$ n- [% s' ` r" F
var data= GetData();* B1 o% n9 V U+ d1 a& W3 D: _! d
var items= '';+ L5 u/ f* B* v/ j
for( ii= 0; ii< data.length; ++ii ) ...{* d# l* |: K- ~1 b2 ?1 ?) W
if( ii!= 0 )
, Z" E! j* m% x* W4 s items+= ', ';; }; w( H3 [ b% Z% }9 q$ E; N
items+= '"'+ ii+ ': '+ data[ii][0]+ '"';; o7 Q* i/ E- q! ]
}3 `- p# I! m, |# ]) K3 h) G
var command= 'app.popUpMenu( '+ items+ ' );';5 J5 v6 k2 b4 u
var selection= eval( command );
' P3 A6 j! K' k9 q if( selection== null ) ...{" `, Z& b- A8 X$ q; Q0 ~0 v
return; // exit
, A( \$ z7 f+ N/ J- Y }0 S+ p7 ^8 y% o$ X6 k5 F
var index= 0;
, \. D0 `* A7 F8 ^5 { index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );4 Y8 {. S' C G; U! n
if( index< data.length ) ...{
# K' o( _5 V0 z, z/ C data.splice( index, 1 );- }. }3 C& w6 V* V! c+ ]
SaveData( data );
, V9 ^; ~; x' U. A1 l. ? }6 S+ L9 }$ w5 Q; k! w0 R7 F
}5 m0 d4 j5 s. u3 `/ \
function ClearBookmarks() ...{! v7 O3 y0 x9 n/ K# E% G- H
if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) ...{& l0 W- v9 l) E6 Y2 s3 v5 X
SaveData( new Array(0) );
2 x8 \- w* a" Y ]; l9 P" h* w }& C8 b7 E+ O7 q3 V) K7 m/ D/ K$ `6 }
}* [) m% T; }( K* n
app.addMenuItem( ...{/ N9 s9 w% j' k2 `& i
cName: "-", // menu divider( ~0 ]/ y; q% }$ f4 Q
cParent: "View", // append to the View menu
" q. t* V {( rcExec: "void(0);" } );% W! ?) Q8 U$ ?, C+ l' f
app.addMenuItem( ...{9 ~: f# D( S8 @3 j( m% d
cName: "设置本页为书签(&B)",
# F! R! R, h& BcParent: "View",
* ~! s: U$ s* Y. ocExec: "AddBookmark();",
8 o h& e1 E6 Q' tcEnable: "event.rc= (event.target != null);" } );
$ H G, a9 S3 \! `6 n! uapp.addMenuItem( ...{
7 k& E# k1 {# ~cName: "转到指定书签(&T)",# l3 ]0 S& @! b
cParent: "View",
2 ~' t. G- _0 ~) Z8 \8 _( a6 BcExec: "ShowBookmarks();",
: B, j% K$ t: u+ L7 G1 a/ ]cEnable: "event.rc= (event.target != null);" } );
: S, m/ t, Z& i* e2 M; J r//cEnable: "event.rc= true;" } );
' q( l- U" t" X2 tapp.addMenuItem( ...{) m: a$ @) {( K, b' d% r
cName: "删除一个书签(&D)",2 m# a4 M/ M) r' F8 _
cParent: "View",/ H* e. Q% t; |% y/ m2 G8 Y' L! H
cExec: "DropBookmark();",3 ^5 x6 Y! c B8 m: ?
cEnable: "event.rc= (event.target != null);" } );
8 f) |% H5 D$ E- oapp.addMenuItem( ...{8 d' o$ L4 L- B
cName: "清除所有书签(&C)",
! z6 C/ k# X, @0 c- TcParent: "View",
% P) D9 v0 j* T3 g+ OcExec: "ClearBookmarks();",
" v6 k( D% G, v: Q& s( l, ]7 D" GcEnable: "event.rc= true;" } );
* U, f4 g. h& Z7 X5 Z8 v9 C9 h4 将文件拷贝到C:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下
6 i4 W U% K9 q. Z# |) s5 重新打开Adobe Reader,看看下面的图形,相信不用说任何东西,大家都会用了2 I0 A1 r( W$ X# |# m
+ c. a& Q/ B- m1 _
5 j" |5 r4 K0 Z: s1 F+ O
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aohan/archive/2008/02/20/2108051.aspx |
|