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