TA的每日心情 | 擦汗 昨天 10:03 |
---|
签到天数: 2274 天 [LV.Master]伴坛终老
|
最近经常看一些PDF的电子文档,痛苦的是Adobe Reader竟然没有提供书签的功能,每次看完之后再回到上次看的地方都很麻,到网上一找,还真有人就做了PDF的书签,下载一试效果不错,于是参看了一下Adobe Reader的SDK,修改了一点地方,以更方便的使用,下面是程序的使用方法: g [+ q L! `0 a- Q
1、打开编辑的首选项项
( [( ~6 S, ^$ E1 r6 y: z" ]7 Y h6 k1 t- M/ G! ^' ^
2、确保下面的选项都被选中$ l, @4 S# l0 D# k* d
& ~& N' J. J: r! T# m
3 把下面的代码保存为一个bookmark_page.js文件
8 K A) T! x0 L4 `// bookmark_page.js, ver. 1.0
/ P7 r# q. @3 N+ j( H7 a/ [7 x// visit: www.pdfhacks.com/bookmark_page/
6 x7 I& x+ f4 l2 V% b// edit:cjs 2008-02-17 9 X" C! y+ V9 ?+ u8 n
// 1 修改为中文标签
( w/ B0 h3 ?# Y& r& s4 j// 2 设置书签时可以自动获取当前的书名 }6 K; L2 F, y, x8 `7 w0 f
// 3 自动获取当前所在的页码与总页数,方便查阅5 X) w6 k* l7 K _$ E$ ~6 @
// 4 实现更多功能可以参看Adobe Reader的SDK
/ z! i7 a& s! r- M1 S9 c/ I' ^5 A T) H
// use this delimiter for serializing our array
/ I/ X! a) @ [/ v m8 w7 R! ]var bp_delim= '%#%#';* w1 B6 V) _* f9 N \2 e& O
function SaveData( data ) ...{/ O7 l/ r5 a) a: K
// data is an array of arrays that needs
/ M F3 n# e$ F( S // to be serialized and stored into a persistent* {3 G1 i6 \5 V3 y; i
// global string' Q7 h6 g) U: U! O" \
var ds= '';+ h E% \( B6 R, }. ~
for( ii= 0; ii< data.length; ++ii ) ...{
- A8 J1 x3 |/ v1 J F( s for( jj= 0; jj< 3; ++jj ) ...{/ u2 R/ ]/ d( ]4 W# r
if( ii!= 0 || jj!= 0 )
3 K/ D. e7 O. X ds+= bp_delim;
+ j; ^6 L4 o3 a# ^! S, K ds+= data[ii][jj];
: q& L K: B7 b9 g' D1 { }
2 L( ~- F3 p( O( y5 [7 y6 V }
2 {# f# U9 O; ]2 l. G" W+ w global.pdf_hacks_js_bookmarks= ds;* Z% J- r, W, c
global.setPersistent( "pdf_hacks_js_bookmarks", true );
; \& L L. g( d1 w3 q: D1 I/ }}
: v: p& ~. f* `4 Qfunction GetData() ...{1 A- I) u9 e r7 ^
// reverse of SaveData; return an array of arrays, n5 g' e V9 m4 q; [3 z# O
if( global.pdf_hacks_js_bookmarks== null ) ...{0 j1 y9 E8 \+ _) h" ]0 }# h! v4 C
return new Array(0);
2 c$ {* k. P3 B/ z m, _+ v0 d }3 H' L& q% b$ ]/ L" u( N
var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );% M) ?7 v0 E+ N, k
var data= new Array();# O0 k* [' Z# v' D, n# w
for( ii= 0; ii< flat.length; ) ...{
: W# r) c! M9 Z, ^ var record= new Array();7 T5 _+ x0 @1 N0 d& j
for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) ...{' K. \, d$ w; q4 X; q% z, G3 m
record.push( flat[ii] );5 }- s! E% Z9 L8 @8 a5 ^- b4 N
}
. W8 l5 [2 f5 g' \( |, } if( record.length== 3 ) ...{4 M# H, ` b" d+ x7 l* D
data.push( record );
- I! `1 Q# p* e+ z- ] }
0 G2 l+ w) `2 ^/ N }3 b8 M" Q. @6 H8 h+ M
return data; r: W# E" z9 H" m8 C. V
}- ^) {0 S4 K, ]+ e: d- F, a
//Get Current Date( _( _& t, |& Z
function DateNow()...{
0 p) _! C: H. o3 {$ C% J* m& e var d, s ;
- b9 r% D8 ?6 N% H4 E$ x d = new Date();
5 M# ]$ W7 e% X% [2 J9 U s = d.getFullYear()+"/";
8 E$ Y6 P6 |. C9 j8 a s += (d.getMonth() + 1) + "/";
0 R) J& y- n1 N0 {) X s += d.getDate() ;
' { o- [) W2 }; X' U& h /**//*3 n) ^& Q, r2 l. O4 x' s
s += d.getHours() + ":";3 T' a; b* C" L$ v. H
s += d.getMinutes() + ":";! k' T9 l, d6 h& k
s += d.getSeconds() ;) e4 n1 c. |7 G5 a# [6 p7 J0 V
*/
. p& Q- [+ w4 x/ @0 G* E0 P return(s);% ^% } r1 m2 G" K5 {* I. K# c
}+ U' G: W/ m4 N- M: _
3 b8 D# F/ s- v% D) Vfunction AddBookmark() ...{5 A" H, I3 L! I u0 d6 t
// query the user for a name, and then combine it with5 ]( l+ E4 y9 Z
// the current PDF page to create a record; store this record
* c! G6 r- o- X7 \( `# z var thisfilename=this.documentFileName;
; M6 c) q8 ~+ [: p' L2 w" k: t thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));
) [( m* T: W' c4 ] var numPlugInss=this.pageNum+1;
. z7 {4 R4 w1 N- M% p6 y. @ var currentdate=DateNow();0 J5 W% i3 e6 m6 |* Q! m* L
var label= : Z; T9 Y: U$ N8 T& I3 ?7 i
app.response( "书签名称,可以修改以便于记忆:",0 O- ~6 Q4 P7 o% Q3 I- j, U4 L" r
"书签名称", x& l* E2 _% C& P4 p4 A, Q, M' @
"《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页 "+currentdate,
$ M" q3 }. f+ W false );
. ?" g" k# y( o: q: \9 y3 I+ i) \ if( label!= null ) ...{( w! X4 [$ @: N1 N
var record= new Array(3);
[2 L" B' @; x1 t, O2 l/ ?1 q' w$ B record[0]= label;) |* l7 t5 |4 M( I4 t/ S
record[1]= this.path;( @5 D" w/ i' O; H. l
record[2]= this.pageNum;
- @, n0 M. o: e9 w: L3 d data= GetData();
8 _( p' }: S, D7 ^/ e6 y data.push( record );! z1 n. P1 I) p, X
SaveData( data );
% w" T1 J- E7 C0 ?- j }
: Z! G* ]1 f: i8 ^}4 b0 o: `; N8 d3 F
function ShowBookmarks() ...{
1 T5 K: Q5 r6 O$ J0 S3 C // show a pop-up menu; this seems to only work when
, g# v; _: R4 X2 ] O0 e6 D) g* G6 m // a PDF is alreay in the viewer; |3 ]3 [ l' ]+ n% x7 H \; I7 O
var data= GetData();
2 D# O1 B2 L8 \! q. b( ~ var items= '';8 M3 k/ t% g. [* l* _4 i8 }1 O
for( ii= 0; ii< data.length; ++ii ) ...{
% ^2 z- X9 r$ t2 U: s if( ii!= 0 )
7 U% W8 v) K/ v5 x items+= ', ';3 I) z4 D3 K7 x
items+= '"'+ ii+ ': '+ data[ii][0]+ '"';3 s3 X! X* B, `- p, b7 q+ H
}, E4 z& b1 D" ^: _+ w6 X$ U
// assemble the command and the execute it with eval()5 V, T& }" c9 `; j
var command= 'app.popUpMenu( '+ items+ ' );';
) N7 |2 O5 l/ Z% M* k var selection= eval( command );& x4 h( a X: w/ p
if( selection== null ) ...{
. n3 L& o. R6 \7 I" m$ B return; // exit0 ^! h6 T8 @2 S
}
5 X) D& |$ c/ p4 m' e6 v4 P // the user made a selection; parse out its index and use it6 K0 g+ X0 p) a# j; N( `2 G
// to access the bookmark record
7 O9 t0 E5 [4 b var index= 0;
# p6 i6 p( Z0 d; K# h% \) z // toString() converts the String object to a string literal
2 p3 M1 p2 o r, @0 [% {9 C // eval() converts the string literal to a number
# f/ S" w4 l& w4 `( Y) w index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );, ~7 \: q" r6 k* M5 ] W
if( index< data.length ) ...{0 q5 t' K: f7 q8 D6 K. R( O
try ...{6 H+ m+ I0 o5 [$ \
// the document must be 'disclosed' for us to have any access6 Q- B/ x+ {3 o* o7 E$ i& ?
// to its properties, so we use these FirstPage NextPage calls
! o( t/ ]7 e# G% {' Q /// Z2 R3 f1 T1 E# q" T9 M
app.openDoc( data[index][1] );
2 j# T; l8 A; j% E8 T3 V) c; A6 O1 x app.execMenuItem( "FirstPage" );
6 q4 ]4 Z( {2 F7 {/ J6 Z$ F! ~ for( ii= 0; ii< data[index][2]; ++ii ) ...{* x2 x- i% s" ?& i( w- t
app.execMenuItem( "NextPage" );
, p8 ]: T }7 e) {, m9 n9 s% {0 T; y }- _5 @4 }5 ^! r. F
}
" L( ]: o/ Y7 q5 F6 a0 a7 o catch( ee ) ...{
+ g: P. X) }$ |) c4 ] var response= $ @# h, ?; \+ C7 ~. k g j
app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");
& |' j$ e5 k$ _: p, [8 w+ [. g if( response== 4 && index< data.length ) ...{
; \* a8 x3 ~- S% U data.splice( index, 1 );$ k& u ~: G9 Q5 b# p6 G+ i8 i+ n
SaveData( data );
0 h2 m+ x, O) W- d$ f6 j% G8 K V }
; t# f9 u9 b, B/ D$ H) L, S }6 f) M/ ^, a: c1 U5 q
}6 r/ g }. }) Y9 }! @% e2 W* _
}
0 E1 M" }1 Y" y$ R. Z# vfunction DropBookmark() ...{
/ W( R+ U/ i. `8 x. R // modelled after ShowBookmarks()/ {+ H9 P2 Q0 Q* ^4 T* y
var data= GetData();6 F4 ^) V) T. _
var items= '';& I" h# c3 z# W4 q) |2 c, _
for( ii= 0; ii< data.length; ++ii ) ...{
: I- @7 ]' N, P7 w$ d+ ]7 p if( ii!= 0 )
. `) a+ X1 n/ P0 @* f$ B0 j# ^ items+= ', ';
o) D2 l& D, i0 A5 K4 s: q7 {- ^ items+= '"'+ ii+ ': '+ data[ii][0]+ '"';& l# s. f" t- A) J$ k3 L
}' V0 b9 s# n; e) P7 [
var command= 'app.popUpMenu( '+ items+ ' );';
% r$ h, T, c. ^3 s \ _7 B7 ^ var selection= eval( command );
5 }4 \: N& }" ~9 y9 O( \( ] if( selection== null ) ...{
/ ^. B+ ?3 T; k5 Q2 A return; // exit
7 X& z& h6 z" m! b6 Z }
1 x! e9 |. n8 @' C. I/ r, ` var index= 0;7 \% j! l+ a( u7 o0 n
index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );% f4 q( M, v( v+ c
if( index< data.length ) ...{# P5 n! _7 d' I0 V2 {
data.splice( index, 1 );
' J! f9 `. `* S7 l! ` SaveData( data );! S/ ?. { y! g1 p% [1 t
}
/ O% u, B/ _/ j e; [}( `. M+ j6 b/ _/ c7 `1 `0 [
function ClearBookmarks() ...{
, B2 b- b, y6 p$ g% B if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) ...{% J: O' b5 y) ~; ^0 `
SaveData( new Array(0) );- V3 p& B8 p2 J, @
}4 L1 W% X) x9 [. ]( d
}+ u/ G2 ]2 I( |/ R/ v7 B
app.addMenuItem( ...{
% @% K p* x. Q% N" J9 CcName: "-", // menu divider
& y9 k+ n, O$ m% {cParent: "View", // append to the View menu
9 y. T; A9 r) C4 h; k) N8 ecExec: "void(0);" } );: I+ ?/ x: F, [ M" w& |# H6 u
app.addMenuItem( ...{: j) L' ~& M( ^5 S
cName: "设置本页为书签(&B)",
" C3 N9 X% k3 U, b6 G4 o" T0 lcParent: "View",
8 e# P. X! ^( N c: @& U( vcExec: "AddBookmark();",9 S! @) K0 P- Y' I
cEnable: "event.rc= (event.target != null);" } );6 b9 D. V* n* v) }
app.addMenuItem( ...{0 v' j- z! u: V4 E/ Y3 l
cName: "转到指定书签(&T)",- B3 o( v! o! V8 G/ }& {2 _1 @
cParent: "View",8 L* q3 N% |9 g
cExec: "ShowBookmarks();",; X8 Y% i- K6 k) k
cEnable: "event.rc= (event.target != null);" } );! {' u" V4 J6 D! p7 V6 q: x6 ?% y
//cEnable: "event.rc= true;" } );
% h2 Q9 I5 N( z6 Vapp.addMenuItem( ...{& m2 Q) [. _4 |, J
cName: "删除一个书签(&D)",- ^, x' B' ]5 t7 i$ t
cParent: "View",
9 J$ j/ O$ q! k& E; E: L$ F! T9 NcExec: "DropBookmark();",% u( o! i3 c; t# f" w8 m6 q
cEnable: "event.rc= (event.target != null);" } );. l& O1 g2 Q* O- u. A
app.addMenuItem( ...{
* X% G1 v2 M& ~: ]/ L. y5 AcName: "清除所有书签(&C)",0 F2 W: S+ m" j. J. g0 u2 y
cParent: "View",0 Y3 C7 r, Y% t$ s8 C
cExec: "ClearBookmarks();",. S ?( ~& |5 r o; B9 x' _& r$ o5 Y
cEnable: "event.rc= true;" } );9 \+ M6 b% ^7 b- Z+ C- H
4 将文件拷贝到C:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下
" R9 b8 T( D. j# V5 重新打开Adobe Reader,看看下面的图形,相信不用说任何东西,大家都会用了
; Z" V5 j$ z, ?
7 ^ v& O. T" E2 @
" w/ Y' L5 b- b& f% U本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aohan/archive/2008/02/20/2108051.aspx |
|