TA的每日心情 | 怒 昨天 09:48 |
---|
签到天数: 2262 天 [LV.Master]伴坛终老
|
最近经常看一些PDF的电子文档,痛苦的是Adobe Reader竟然没有提供书签的功能,每次看完之后再回到上次看的地方都很麻,到网上一找,还真有人就做了PDF的书签,下载一试效果不错,于是参看了一下Adobe Reader的SDK,修改了一点地方,以更方便的使用,下面是程序的使用方法: p. R4 F. \* J8 |! v% a: o
1、打开编辑的首选项项
7 k- r+ T1 a3 ? U6 R) @6 M
4 f) F: Y w& Y# W2、确保下面的选项都被选中; v% b) B/ x6 \ ^% C
4 A( i5 d E, I$ Q# j4 E7 G3 把下面的代码保存为一个bookmark_page.js文件& E8 q7 T2 H& U- l. y
// bookmark_page.js, ver. 1.0
& m: l+ `* L& p( s$ e& i! w// visit: www.pdfhacks.com/bookmark_page/
) I9 s2 Z8 e) k// edit:cjs 2008-02-17
6 J- }3 N; J2 ~" p! n: O% P// 1 修改为中文标签
) l4 S5 a0 h. l, q1 C// 2 设置书签时可以自动获取当前的书名
v0 f. u) o j// 3 自动获取当前所在的页码与总页数,方便查阅+ d; Z# c8 J' X1 |1 X; q* y
// 4 实现更多功能可以参看Adobe Reader的SDK
5 W6 [0 y) I4 w+ e
0 |- w9 w' f2 q% ~' ^7 A$ d( \// use this delimiter for serializing our array
. M4 L7 `0 i$ ^3 Y- ? ^/ r7 Tvar bp_delim= '%#%#';
5 A! B1 q3 J# Ufunction SaveData( data ) ...{; M5 Q4 a2 j E# ~, R0 }* S
// data is an array of arrays that needs
( Z* b8 P9 a3 D8 Y. b: a+ p+ Y3 m // to be serialized and stored into a persistent
) J9 s: I( W" C m5 c: a; f // global string; K' C8 B- E- i2 e
var ds= '';4 X. f8 k. c% t4 T& _
for( ii= 0; ii< data.length; ++ii ) ...{3 c# k" I( E( }" P$ I8 l: @
for( jj= 0; jj< 3; ++jj ) ...{8 U5 G6 Y( W) w
if( ii!= 0 || jj!= 0 )) E: F z4 O% N, `" g% k3 w
ds+= bp_delim;
- |5 y8 A0 A7 W' w' y8 U ds+= data[ii][jj];
* s2 r! q X |! v4 [; N }
* o6 c0 K# C4 W% J T }8 f: R) [6 p8 \6 ]; _5 M
global.pdf_hacks_js_bookmarks= ds;
! t$ X% r) [- t$ h3 b. X global.setPersistent( "pdf_hacks_js_bookmarks", true ); i/ j( \1 X& B4 F
}. t5 M0 G$ M; C* U# X: ^5 `
function GetData() ...{6 y a+ F1 ]! Z0 [% u$ i k! R6 t
// reverse of SaveData; return an array of arrays1 `# X6 p( j* h }" |) n9 |
if( global.pdf_hacks_js_bookmarks== null ) ...{
7 [, u9 K. c* t! M* } return new Array(0);% v& u; x2 n d, q
}
: a& K1 Q9 t( Q! ~' z6 O( \ var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );0 Y$ c. p$ f9 q+ a; g! P
var data= new Array();
6 w t" c: ~' |/ s/ S- c for( ii= 0; ii< flat.length; ) ...{2 A" ^5 Z0 K" V5 s
var record= new Array();+ ~% x! `) e1 p/ `# s
for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) ...{
4 v0 q+ a- L1 q record.push( flat[ii] );! |! {6 O6 L; w9 A. a
}& v5 h5 ^/ Y3 T p, ?
if( record.length== 3 ) ...{8 ~6 O: H5 Z2 r; e- d
data.push( record );
( p# c) r0 Z9 i) x z( t. \ }
& P0 x; h2 P+ }- p; | }
) ]8 p8 X5 n# L* v' O return data;
) Y, l' G9 r' A. t- o}3 U# X/ V9 ~/ z4 O" s! z- v
//Get Current Date
# a# r! ] e! {) Ffunction DateNow()...{
6 M- A: ^* X( f- b var d, s ;
4 F- s$ @7 w7 A d = new Date();8 L+ C+ p$ |) E- d6 m" G
s = d.getFullYear()+"/";
* O! o6 R" f2 y' M. c( W- y s += (d.getMonth() + 1) + "/"; p* N* t. D4 X1 U. n
s += d.getDate() ;. Z& }) l! ^/ P* f- p
/**//*# J- C; D: ?" [: q5 D! C b
s += d.getHours() + ":";
$ Z0 `( V7 a! K! v# o2 i, s( B5 \ s += d.getMinutes() + ":";
7 L2 B" h1 e+ [; s& |9 i6 _ s += d.getSeconds() ;% a" T, Y, p' r! D8 ~
*/* N; E0 g0 q" f8 @# x
return(s);
3 z2 W% o' F; V5 x& l- z}
( u; ?2 `/ F x, b m8 B, ^3 N. C2 Y( E! }
function AddBookmark() ...{- d6 d8 m9 l$ x3 s% {
// query the user for a name, and then combine it with
1 L6 i! O a, Y0 W // the current PDF page to create a record; store this record
9 D% t' Y' \; K var thisfilename=this.documentFileName;# Y1 L& v7 Q, t& R9 ], K
thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));1 V2 [( G6 s. Q3 v9 d
var numPlugInss=this.pageNum+1;
4 b; z+ s' q. ]/ [% B0 N2 T var currentdate=DateNow();
: z1 c$ t1 [9 }- t1 N( x8 h var label=
; O4 ~: W4 T( V. C: ~+ Y5 z app.response( "书签名称,可以修改以便于记忆:",
% x# U4 @1 G$ @6 S "书签名称",
3 n* m, m- ?; z/ i+ d "《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页 "+currentdate,
. T5 h+ {- w2 }# Q8 O8 E( | ^' e false );
4 U$ j4 K3 Y: P' N% C if( label!= null ) ...{0 a$ F2 B4 o& `9 r4 f5 z- o E0 C/ a
var record= new Array(3);
7 r5 h8 }3 h; K2 [ record[0]= label;; O" M" R, h% Z* }; d
record[1]= this.path;3 k9 i; }! ?7 \/ n; T
record[2]= this.pageNum;
! ~) S1 Q& o3 H# R- U6 A6 s5 Q data= GetData();
4 M6 M6 t! r( M/ f' c5 f# x data.push( record );
s% a; ^* o2 c& E+ `+ D7 k SaveData( data );* i+ _0 X1 K6 Z/ p1 Z
}; s5 o; s- `4 @- B, l4 N# n( M
}
9 o( S$ `$ v2 R/ b. Efunction ShowBookmarks() ...{" ]% B/ A! n5 u3 Q
// show a pop-up menu; this seems to only work when% o- n3 }" {; z% U, Z/ D
// a PDF is alreay in the viewer;0 h" Z" N# p2 [% b- Q |0 c
var data= GetData();0 L2 ?' u% g6 z! f
var items= '';( q5 {3 {8 X3 O; t8 X! ?
for( ii= 0; ii< data.length; ++ii ) ...{
2 ~+ [ _' \6 V if( ii!= 0 )" L, h: i! c7 w4 v( ^
items+= ', ';
% y6 }) y2 n: p( E9 S7 P1 T Y( s items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
* J/ y3 {3 C$ Y- _1 I4 B. G, u }0 p+ O( [9 \! d0 g) u6 u% \; v
// assemble the command and the execute it with eval()
! d, L) ]+ f9 }& q& E7 T) Q. {* m var command= 'app.popUpMenu( '+ items+ ' );';. z* t- R6 _9 s4 { ` v
var selection= eval( command );1 U w) Z/ i ?9 u. r$ B% i5 q* U
if( selection== null ) ...{
, L! I ]8 W+ ]- [; l; X( V return; // exit9 Z& M% p8 \) D @
}
# A8 q. f2 M4 {! f% Z // the user made a selection; parse out its index and use it7 N/ B9 `% S# }- k+ E; m
// to access the bookmark record
4 V) w( r( q( L( A% ]. L/ r, o! R var index= 0;: v( N6 z. o- t! @- }/ E
// toString() converts the String object to a string literal5 M' r2 ]7 V( }4 Z; u
// eval() converts the string literal to a number
* B; c0 v9 a1 I+ {4 V index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );& F, _) N& q6 g& }8 {
if( index< data.length ) ...{
5 w6 x* `5 {' }" g( y! X4 n- H7 r try ...{3 N& V1 b$ f) \( {$ z% I' ]
// the document must be 'disclosed' for us to have any access0 j2 A9 o1 E6 O# A& w
// to its properties, so we use these FirstPage NextPage calls9 ^& H6 k. F+ C7 ^% m# L
//; [# ^1 R% L/ ]& A" |
app.openDoc( data[index][1] );( e% n: W4 S8 ~' H$ u
app.execMenuItem( "FirstPage" );
, B& s5 S. D* X$ t9 d for( ii= 0; ii< data[index][2]; ++ii ) ...{9 y4 B+ @/ P: N" T, b
app.execMenuItem( "NextPage" );) i+ ^1 K# |( I( O
}# C. O* R4 N$ n5 k2 J
}9 e7 s: c; v5 j
catch( ee ) ...{
, Y! N# ^0 @( i/ J; u9 C var response= 5 P9 ]% `7 i1 j. H: z# Y
app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");8 y9 m: j/ \4 U
if( response== 4 && index< data.length ) ...{
$ C8 J: D1 ^ f data.splice( index, 1 );- g1 g; {( w" r P: @- ]# O% m
SaveData( data );
( z' r5 w+ r2 X# u$ i }# u5 F7 x% K3 t1 y" }
}4 C9 K6 \+ N' n* P, \
}
# y2 i. `/ |7 J: ~) O& M6 C}. E; K0 {# u( L: E" w& ?
function DropBookmark() ...{6 T* j. R. V( @" n+ Q8 Y# j6 F
// modelled after ShowBookmarks()- p; `# T1 X! h0 u# W/ O3 U
var data= GetData();
& W% Q% N$ h- r. L( m var items= '';2 [& C* T0 r; z W! A
for( ii= 0; ii< data.length; ++ii ) ...{- q% G8 ^, S! a, D
if( ii!= 0 ): m& T# N; f' t% g7 p4 B
items+= ', ';
! e* Q% V( V% \# v% [9 R. o- j8 ^ items+= '"'+ ii+ ': '+ data[ii][0]+ '"';: f; n+ h( o5 N2 R* D
}
0 q* [! Y& q% P7 P* \! n var command= 'app.popUpMenu( '+ items+ ' );';
+ K7 [% b) N+ d: [& g8 |2 } var selection= eval( command );2 r4 `5 O% `8 b
if( selection== null ) ...{
\1 L! r9 r& G' w return; // exit
/ M0 ?8 A2 x2 O( D$ D3 _ b }' j0 C4 E( j% \& f% `& U7 H
var index= 0;
" ~1 v8 T! G% h2 \8 A index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );8 ?9 {1 j; R7 R6 U- D
if( index< data.length ) ...{
: m4 G G, F- x# U9 v2 B' i# ?6 ]# N data.splice( index, 1 );) R8 c$ O- Q) q. ]" V" j8 p
SaveData( data ); B- i5 R1 R) n) O) S
}( s9 O0 E% N# `: A+ o8 X7 R- M
}9 s; L7 R2 c: v- W# D
function ClearBookmarks() ...{
! g8 D) d, s3 `" X) g8 p if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) ...{7 s: N5 I) L( Z3 n+ ]1 F
SaveData( new Array(0) );
- g. t8 V5 T6 G: T }
/ Y& B9 E* Z) Y( s0 R+ Z}5 b8 b4 _8 n! r" V* G; p
app.addMenuItem( ...{
/ G1 ]& a" H" ^$ }; AcName: "-", // menu divider
9 ~1 ^3 B) d6 [3 B/ ?+ B$ OcParent: "View", // append to the View menu
, D! ?, b' v. |2 R3 KcExec: "void(0);" } );
/ M" D- H' i8 @% yapp.addMenuItem( ...{( I! P: ~6 M( j9 [' S- w
cName: "设置本页为书签(&B)",
" q. n! e+ W# ?3 z- UcParent: "View",
% k2 y: P: Z! scExec: "AddBookmark();",+ Q! Z' I7 @" V$ L
cEnable: "event.rc= (event.target != null);" } );
4 ^4 z c" _% C% a K: kapp.addMenuItem( ...{' F2 ]6 B( E. R$ D7 Z$ z% o) ~& I+ P
cName: "转到指定书签(&T)",0 t8 i$ R( v2 s! W) S. o" v
cParent: "View",
* t j) ]- I) f' V+ @ u4 U, lcExec: "ShowBookmarks();",
. a, V/ U) B( S: FcEnable: "event.rc= (event.target != null);" } );
# S% R3 V& y' {: o7 f% K8 o B% N//cEnable: "event.rc= true;" } );
* k. V# ~9 U/ gapp.addMenuItem( ...{! Y. h( B; T. X. ^* K# i- L% U
cName: "删除一个书签(&D)",' c/ ~7 H6 A9 d9 m) O- p
cParent: "View",( o; y) Y+ \! d( i+ g% N1 l
cExec: "DropBookmark();",; |5 f: d$ p5 p2 d7 b
cEnable: "event.rc= (event.target != null);" } );( b( T. ~! \% G% D
app.addMenuItem( ...{# H! Y& y3 e, l' }+ N0 d. r9 }
cName: "清除所有书签(&C)",2 W5 f7 T2 a! @+ d/ }1 U
cParent: "View",8 I+ m. u! n1 \* T
cExec: "ClearBookmarks();",; a; ^! x) k5 n; g0 b; R- e9 x
cEnable: "event.rc= true;" } );- Z2 o9 ~9 S" z$ ^
4 将文件拷贝到C:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下
; F, M* W6 K" E" h$ U; w5 重新打开Adobe Reader,看看下面的图形,相信不用说任何东西,大家都会用了1 f# U6 M' S& c& I% m6 s$ X7 P6 B7 Z
! ~$ g! \; m: O* ^4 R+ ^ d, a% {0 }1 N( M; k
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aohan/archive/2008/02/20/2108051.aspx |
|