TA的每日心情 | 奋斗 13 小时前 |
---|
签到天数: 2255 天 [LV.Master]伴坛终老
|
最近经常看一些PDF的电子文档,痛苦的是Adobe Reader竟然没有提供书签的功能,每次看完之后再回到上次看的地方都很麻,到网上一找,还真有人就做了PDF的书签,下载一试效果不错,于是参看了一下Adobe Reader的SDK,修改了一点地方,以更方便的使用,下面是程序的使用方法
+ |+ Z% z: g, t8 c1、打开编辑的首选项项
1 }! m4 h5 L e# X7 e& v2 a: V
. |2 J( T' o& p! Y, u% E/ _2、确保下面的选项都被选中* M7 O, d/ T: k1 x0 p9 Y
- d: x+ s, O0 V+ J
3 把下面的代码保存为一个bookmark_page.js文件
( R9 j5 T, d6 t// bookmark_page.js, ver. 1.0
- u( \+ \9 \5 U) g" }// visit: www.pdfhacks.com/bookmark_page/
- a% v7 Y7 }4 a* o( ?// edit:cjs 2008-02-17
0 Y! Y+ g2 B5 i1 [// 1 修改为中文标签; V; L3 Z) q$ Y3 u0 A! W
// 2 设置书签时可以自动获取当前的书名1 d- I/ g0 p' H
// 3 自动获取当前所在的页码与总页数,方便查阅 O- ?$ B( c F
// 4 实现更多功能可以参看Adobe Reader的SDK
& G; u$ P! r3 k2 }; l. P" ], h+ B$ ], I! z
// use this delimiter for serializing our array
" ~" d+ E. L% x" H4 s; y# E+ Qvar bp_delim= '%#%#';& p8 V, i y) ^+ B6 Q: d) s
function SaveData( data ) ...{
% D; V1 w9 c+ H2 n8 y- m // data is an array of arrays that needs. a! y4 o- M9 C/ L+ g
// to be serialized and stored into a persistent4 L; A3 v% R" E
// global string
' m2 e. r) I) u- ~+ Q7 L& `' B var ds= '';
4 r$ y; s+ \* n0 M% S- q for( ii= 0; ii< data.length; ++ii ) ...{
7 i+ C. |2 K1 h% _6 {% l0 V for( jj= 0; jj< 3; ++jj ) ...{1 F/ E" ?% |: m
if( ii!= 0 || jj!= 0 )6 Q- g* c" ?/ c1 H+ H' e
ds+= bp_delim;4 d. Q F2 k4 v' C4 R
ds+= data[ii][jj];& K& G2 |4 {6 r
}
- m, H, l! g2 U- u& }3 o }
. O% ]( j: u a+ \: W. Y8 `2 ~3 k e3 L- a global.pdf_hacks_js_bookmarks= ds;: U) J4 i2 ~6 n+ A! I9 n }
global.setPersistent( "pdf_hacks_js_bookmarks", true );
8 v2 \* q9 x: L- I}/ f( O* w. z# I
function GetData() ...{. J1 D* N; L" X9 ~+ s( G
// reverse of SaveData; return an array of arrays4 a4 D$ k' o# M% x( x* p% M
if( global.pdf_hacks_js_bookmarks== null ) ...{$ J% y0 Y( S- g8 h" ~
return new Array(0);0 Q c' T6 I; T
}
! B# ]# M- }" H var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );
( g" q6 q- S- P# `3 V- c. P var data= new Array();( \0 P3 H1 C2 Y
for( ii= 0; ii< flat.length; ) ...{
4 n( u# T" T* U5 h' y9 y var record= new Array();
2 t% w9 A+ z3 o* Z5 |& o( S for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) ...{' ]# ]- n" B H
record.push( flat[ii] );* ]9 _( h, _/ B( }$ |2 Y h
}2 o" O2 A0 z+ y* L A7 v- {
if( record.length== 3 ) ...{
2 z1 Z1 c4 r# f' s: N: b8 y data.push( record );0 S4 {" L6 q. D1 [3 O
}
# e/ C8 ?( n! z0 a# } H' P6 w& \+ D }
( j1 v! K' r9 A4 z' ? return data;
7 I9 N2 C7 y7 D3 a( M2 G* d}9 O& F# M4 A" A% A! l
//Get Current Date( w5 [4 F8 \2 G% @/ G* z T- M
function DateNow()...{
/ j) {2 ~) H- C6 G2 G var d, s ;* H; H5 `3 Q8 U! U c& a% s2 S
d = new Date();
0 R) o3 i3 F# i7 L( k" a s = d.getFullYear()+"/";
5 S9 H; K# }1 F" v, M2 n" w s += (d.getMonth() + 1) + "/";0 W4 f' L: U! t+ n& W1 a
s += d.getDate() ;
; T V" \& `* r- U& H; Z; d+ m /**//*1 y3 ~3 [1 |# c3 ~2 x- }' d: M
s += d.getHours() + ":";
$ n a, p5 B; K+ h7 g/ N s += d.getMinutes() + ":";/ [ F$ `$ W$ g
s += d.getSeconds() ; m; H" R# i) \. z
*/) C6 `! c7 k% [# U- W
return(s);
% T6 a/ I y( o. X# r4 y}
/ S* D0 Z7 r' H* x
. V* c0 x& ] B2 @; Y: Lfunction AddBookmark() ...{
! g3 Z; p) u5 j5 `0 ?5 k* b; ^1 K4 B5 ~ // query the user for a name, and then combine it with# p5 s6 W0 G2 o4 o6 D3 e
// the current PDF page to create a record; store this record
5 f$ b8 M% V; Q% ? var thisfilename=this.documentFileName;. s0 h, u: P- {" `, w
thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));: b: d+ b$ Y1 k) h
var numPlugInss=this.pageNum+1;9 y3 ]3 P6 E; U; Y3 H0 g
var currentdate=DateNow();: ]/ ]5 \9 S* M- L X# J* S- a
var label=
* X0 y+ a+ @7 o/ w5 L( y app.response( "书签名称,可以修改以便于记忆:",
2 D& J8 V/ \& L# K X "书签名称",$ I) D9 m1 D1 V: a0 W) r. U" n
"《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页 "+currentdate,
; k/ p) e3 l' u4 z) g false );/ n2 t3 `( P, `) c( H1 Z5 J7 e
if( label!= null ) ...{
5 M' u% O4 M+ y; h) ]" q2 e/ y( f var record= new Array(3);* }- [- E. A% s5 M
record[0]= label;
2 j; ?$ P) b! K2 w" ~5 ` E0 y; C/ t record[1]= this.path;/ l# F, k4 M X& k- O9 s
record[2]= this.pageNum;
5 d& x/ [# H$ l5 N data= GetData();- H( e5 _2 H9 W
data.push( record );; S2 T8 H- w1 C+ {* D y3 @' M/ q
SaveData( data );, T* O4 A' C9 F8 i, l
}
6 e6 ^. _3 s9 p0 o/ f5 e ?}
6 s1 j( Z: @) T& |3 o2 Q! K0 [. O' hfunction ShowBookmarks() ...{
% n Q# a4 N6 g6 v0 m7 l& |. e // show a pop-up menu; this seems to only work when
7 X! F( ^) E p& |$ A0 Z& F // a PDF is alreay in the viewer;5 x5 N. h1 y @
var data= GetData(); D* m! E# P1 ~' W% S. e
var items= '';
( D9 {) L- D! S9 M$ g) F2 c for( ii= 0; ii< data.length; ++ii ) ...{% M. @/ t$ @: f2 a/ d- R# o
if( ii!= 0 )8 w: d; H9 }! B7 t e
items+= ', ';
1 I: K0 d) h, v8 d1 t5 Y" o% e2 L* n3 m) n items+= '"'+ ii+ ': '+ data[ii][0]+ '"';' Q2 ^" O9 R; t1 E
}0 i5 U8 {5 O0 r7 P, r' Z# B2 l. T
// assemble the command and the execute it with eval()
% @8 T' V0 |1 d( V! L var command= 'app.popUpMenu( '+ items+ ' );';* J$ c- ^" ]: Y' P# M% S! F }& q
var selection= eval( command );
1 b# N" u' c/ i) ^0 `$ I if( selection== null ) ...{" |; H J: J6 l5 a+ y K
return; // exit" X9 F4 y& s, \# e5 s
}( S& t8 Y D3 W; |- f
// the user made a selection; parse out its index and use it
0 ]5 x" n# |7 ^8 N // to access the bookmark record
7 r/ L( r6 i; \, U var index= 0;
/ {; b6 A G1 K% Y6 S* u // toString() converts the String object to a string literal/ G3 T W, |; s8 S/ V
// eval() converts the string literal to a number; `0 a, f% ]# O \$ d
index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );
6 ^6 m0 f3 H& T5 l; L0 o if( index< data.length ) ...{2 m1 L( G6 M' o; R9 Q
try ...{
" x+ A/ H- J8 q) F7 V // the document must be 'disclosed' for us to have any access& [* S, Q N5 f- i R* J
// to its properties, so we use these FirstPage NextPage calls
, h) {( c& J& G. t& @' x3 b //: V' b" _; F& [9 m+ i2 E7 U
app.openDoc( data[index][1] );9 x' ]$ ?6 J a
app.execMenuItem( "FirstPage" );# e) _, l/ k2 }# C: r" X' L" _* z
for( ii= 0; ii< data[index][2]; ++ii ) ...{. N; V/ S% X5 ?- Q2 m3 }
app.execMenuItem( "NextPage" );' o1 l5 q5 E, v+ ~" P# T1 N
}
+ ~2 H1 S* `# h# J1 G; m1 X a }* W2 D1 g& r- [2 r9 @; p
catch( ee ) ...{. d7 u1 M/ W2 F6 z7 L) X
var response= 1 R* s' D2 m) f6 V) ]2 p: I
app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");
; I; _+ N# b1 u if( response== 4 && index< data.length ) ...{/ E) t5 p% r5 {: q, B3 s- ^ n
data.splice( index, 1 );
6 F: t3 C8 D k+ }% G+ J& U/ Z/ F SaveData( data );
6 @+ R3 A! |! M6 s4 [( s4 C }
; G( p) s$ c6 F U: s/ ? }
$ R- W6 f2 X# M! x8 ?& @% P }' ~( A2 Q1 n4 s5 L- @
}
, O, a; v5 W9 n! W2 I9 bfunction DropBookmark() ...{
$ E8 F; \( G- G) m; n+ U // modelled after ShowBookmarks()
* M& d7 K1 `# c" N5 F var data= GetData();
$ {+ H S5 p& _4 @9 t) X0 Q! ^$ v var items= '';0 W5 w! a0 F# U) k- N$ X( d/ \/ X3 J' _
for( ii= 0; ii< data.length; ++ii ) ...{0 V/ |1 a0 n: y* V6 v- h
if( ii!= 0 )
, v4 r- B% X3 [, K items+= ', ';
' R: y G" j5 w- L4 K1 G items+= '"'+ ii+ ': '+ data[ii][0]+ '"';4 b* i( z2 G# K
}6 ]) v. p- {& |! Z
var command= 'app.popUpMenu( '+ items+ ' );';2 z' j9 i% W8 {* {7 U y! [
var selection= eval( command );0 i: _1 K: v" v; n e
if( selection== null ) ...{ }1 m! g: n( E3 j& r
return; // exit3 w0 A9 S, w. q' m8 S8 N, f" @$ D
}
0 n0 [ }1 g% e% {$ h var index= 0;
+ Q' J7 k; O7 p: k0 s index= eval( selection.substring( 0, selection.indexOf(':') ).toString() ); b/ W+ R0 L2 q/ S, r' A
if( index< data.length ) ...{
' v) W+ j9 w/ e {4 P data.splice( index, 1 );
* v4 p2 Z& W* d# K& U7 A SaveData( data );) ~& B& B+ x; {$ e w+ R/ U& r% b! C
}
* H/ i; p- ?: @5 w( R% |# X}2 L& V6 K7 S0 i6 g2 i$ }: p
function ClearBookmarks() ...{
$ _. M; d- ^2 ]* @4 j$ H if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) ...{
0 x8 ~) a2 L8 ]' ?- K' E% r3 @3 w SaveData( new Array(0) ); w/ w% h# N+ c5 B9 F3 z/ p7 x) D
}* D$ K$ e- e# Z7 v, k/ D" N
}2 ^1 d2 J- g: j, J j
app.addMenuItem( ...{" V( M( P) c8 T4 i1 e6 w% G
cName: "-", // menu divider
0 a1 b# b, Z' H1 I! G0 ecParent: "View", // append to the View menu9 e. [& J N1 n& P+ J
cExec: "void(0);" } );
$ T) E' R j2 D& ~8 dapp.addMenuItem( ...{: {! ]1 [& i" ] B1 b' w
cName: "设置本页为书签(&B)",
; m2 I6 D1 ?( c, u8 T9 o$ GcParent: "View",6 r' {9 t" F# r. }. w2 r S
cExec: "AddBookmark();",
9 _7 b J: m# }1 p/ O; ^; v: ZcEnable: "event.rc= (event.target != null);" } );8 c! q5 y4 C8 f: C
app.addMenuItem( ...{( C' S2 q* j+ S, p& }/ L( e$ _" M
cName: "转到指定书签(&T)",* f& K9 r6 e f7 Z- g
cParent: "View",3 Z: A( |0 j2 U! s7 g
cExec: "ShowBookmarks();",
& t* e( N! ]* }; ?. W: J. u% VcEnable: "event.rc= (event.target != null);" } );5 E& F4 `2 c/ Q5 R
//cEnable: "event.rc= true;" } );% b% T1 S Z, Q0 b% E/ ?
app.addMenuItem( ...{2 P9 E- Z8 k' [7 j4 H, o: K
cName: "删除一个书签(&D)",
0 r/ }" Z j7 a7 _# s, O& l" I7 GcParent: "View",$ x# N1 M& ~/ ~+ I i- g
cExec: "DropBookmark();",+ M# _1 Z: E0 U6 @1 g1 |" u
cEnable: "event.rc= (event.target != null);" } );
: b# Y, t& ?7 B) }app.addMenuItem( ...{
0 y- L% B; J( A1 B: }cName: "清除所有书签(&C)",4 V0 T, N8 c* d& f/ Y ^5 |9 r Z. {
cParent: "View",: m1 W9 k( `) ?
cExec: "ClearBookmarks();",8 O# J2 E t2 v) {- t8 a& i, P3 U
cEnable: "event.rc= true;" } );
) L. k# U) h! m/ C3 D9 U1 t4 将文件拷贝到C:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下8 @/ l" o5 y8 f. S% g% o
5 重新打开Adobe Reader,看看下面的图形,相信不用说任何东西,大家都会用了
8 r! I* ~! e5 V$ X4 l3 X' [/ Y
. J/ X$ a. i* c* d
( ]5 ?# Q Q9 S( P d; A }本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aohan/archive/2008/02/20/2108051.aspx |
|