TA的每日心情 | 擦汗 昨天 10:03 |
---|
签到天数: 2274 天 [LV.Master]伴坛终老
|
最近经常看一些PDF的电子文档,痛苦的是Adobe Reader竟然没有提供书签的功能,每次看完之后再回到上次看的地方都很麻,到网上一找,还真有人就做了PDF的书签,下载一试效果不错,于是参看了一下Adobe Reader的SDK,修改了一点地方,以更方便的使用,下面是程序的使用方法7 _3 {* N9 w4 D9 y* Y" S8 k0 [
1、打开编辑的首选项项
7 a5 u" k" |0 ?$ z* ~: G! L
# V2 N {4 E, r4 k2、确保下面的选项都被选中
& z& E1 u4 K* K+ K' U- {8 r
4 v) A8 W+ r1 Z7 K# _, q' Z1 m3 把下面的代码保存为一个bookmark_page.js文件
; o- @6 N1 O/ w/ b+ m( t1 S// bookmark_page.js, ver. 1.0; u. @. S' Q* c, A% I/ l, T
// visit: www.pdfhacks.com/bookmark_page/
1 L( j/ p* a5 N5 W! K// edit:cjs 2008-02-17
! B2 I5 ]4 A T// 1 修改为中文标签4 `; r8 }0 t! g/ y
// 2 设置书签时可以自动获取当前的书名
, ?: G+ d& s+ K1 u _( r9 p// 3 自动获取当前所在的页码与总页数,方便查阅' K* D. M7 X0 P( w9 U9 c
// 4 实现更多功能可以参看Adobe Reader的SDK( r/ ]& s0 ~" U" f/ F7 R/ J2 e
9 m" G& c# C* A2 k5 D
// use this delimiter for serializing our array
" X: y: r% C8 Pvar bp_delim= '%#%#';
3 S* K) Z, ^( G. bfunction SaveData( data ) ...{
" U6 G5 ?' q" p0 G' r( n8 G // data is an array of arrays that needs6 C& I1 j3 h3 \* w! v' \
// to be serialized and stored into a persistent: r0 o5 T5 t3 `8 l
// global string# o. W8 g% [6 \( m) E
var ds= '';
$ Y( M" B/ E- w8 p5 c for( ii= 0; ii< data.length; ++ii ) ...{
4 u" G1 c/ u/ p for( jj= 0; jj< 3; ++jj ) ...{; w- a: I$ {1 \- V+ B5 {' N+ ?, h
if( ii!= 0 || jj!= 0 ) e/ A, a& p" ` E8 m; u4 R+ h# G/ g
ds+= bp_delim;
# Z: ]1 C% G a5 \ ds+= data[ii][jj];
4 {" X% x4 i- g/ J }
) C6 [$ I4 X5 A; A A( X }+ t6 G5 y& K' F2 i* \: ^" g
global.pdf_hacks_js_bookmarks= ds;
! G. o+ N7 g; F0 [4 G" i$ R- Z/ E global.setPersistent( "pdf_hacks_js_bookmarks", true );! ~) H# |/ f4 B0 U2 P$ U$ Z/ ]
}( S6 O( v- I7 m6 _+ ^% c2 g1 ^* m+ h" c
function GetData() ...{6 b. U) D# o, ?* v6 F$ l
// reverse of SaveData; return an array of arrays
* M! ?* N( |3 w if( global.pdf_hacks_js_bookmarks== null ) ...{
) y0 c* {/ T6 j! m return new Array(0);+ {0 `$ T. f. P% s$ J8 P) @: F8 n" I
}- P1 K( O6 [# ~0 _/ O- N4 V5 _* g. D. V7 ]
var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );$ _! Y% q; P: D' \7 z
var data= new Array();
2 x) f1 O+ T3 v1 r9 L0 H for( ii= 0; ii< flat.length; ) ...{
7 b' j( h5 R8 d6 p var record= new Array();
7 e3 `$ S& F" S3 I for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) ...{
7 A/ z. E. Q( E record.push( flat[ii] );
2 n( m) Z- _( N }
! p0 r: u0 H9 z if( record.length== 3 ) ...{
: H( E" |* H8 y5 J S/ k! }& @ data.push( record );' y6 B2 B. a1 p
}
- S( N3 W4 D; U9 a4 u* ? }
' D9 r8 D. }2 |, R. P9 D return data;
( g+ G w! V% U2 ]2 X- M; ]}
: i0 {/ p5 r" i$ D' C' L//Get Current Date
. T4 W2 }* j3 @0 j( b7 B+ hfunction DateNow()...{; P, c) V, }" w6 D3 C$ Q
var d, s ;* m4 U h6 w }- o3 {3 F) j
d = new Date();
8 O) J3 u9 t' M7 X; _* C. O s = d.getFullYear()+"/";; l4 B2 G7 R4 F, }& b
s += (d.getMonth() + 1) + "/";. h& d. w, }. f% u
s += d.getDate() ;
5 I c8 W( b" h1 Y /**//*
" V( g6 [* B3 J" z, C* w s += d.getHours() + ":";
, ^* ^; k2 X1 H. Y s += d.getMinutes() + ":";8 W+ g( e# p7 X% Y* s; O6 n! w. k' b3 n: T
s += d.getSeconds() ;" o( j, X: g! N9 s3 R
*/3 d7 H H% Y% \! p
return(s);
: M7 s' `( Z+ {8 I! r1 W0 D% `}4 {( ~" U9 v4 E* \) t1 K6 {
! ^- D. X4 q; ]# C C) r ~function AddBookmark() ...{
& g/ v; w) m. l: s& _6 X& q // query the user for a name, and then combine it with) F- M+ [: }6 i, l. D
// the current PDF page to create a record; store this record6 o4 w6 E, w3 L3 S$ j
var thisfilename=this.documentFileName;5 |1 R9 [/ _ y+ S S1 F. N( k5 B: b
thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));/ W0 A) L2 J, d6 ~( p
var numPlugInss=this.pageNum+1;
+ ?9 }- r; x0 { var currentdate=DateNow();
) }0 t5 Y2 s% C8 I: d var label= # g/ K$ s. T/ J9 i1 j
app.response( "书签名称,可以修改以便于记忆:",
; ~4 Y2 Z' ?9 ]3 V5 C& n, h+ t# G "书签名称",
" J( c, `2 K N7 D "《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页 "+currentdate,
; c/ o! f: Y9 p$ [/ M& u4 Y6 j false );4 ~# n" F; b0 w G+ N# {
if( label!= null ) ...{; c- q. Y6 X% }
var record= new Array(3);
- A l3 ]% D5 N record[0]= label;
3 A# t6 T. W# j6 k1 }/ w4 U record[1]= this.path;, g0 Y2 B. N$ Y6 P8 R
record[2]= this.pageNum;
2 d6 g5 j n& _- R- j/ p1 O data= GetData();
8 F( Q- f* e4 G( o: W7 Z1 Y, v( c4 e data.push( record );
7 Y( b- _' q) l# @2 l SaveData( data );2 W* O$ F; k; C8 B
}4 J% b2 @6 L6 N1 ]4 t9 K. [
}4 W6 y0 u7 ^% ~ S
function ShowBookmarks() ...{
; G- k. t" _& ]: X3 X' V // show a pop-up menu; this seems to only work when0 G7 {" F5 c- ]5 x, a
// a PDF is alreay in the viewer;! @" J. v: Z7 `
var data= GetData();
: Q/ ]# ?& F- z% D var items= '';- y8 I& U# d- J" S$ t9 f6 B
for( ii= 0; ii< data.length; ++ii ) ...{9 S" J! V) A" }- r
if( ii!= 0 )
0 M8 c- l5 E x items+= ', '; v) C4 x# e8 L
items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
+ v. N6 i& t9 ? }" `) F e2 y: V# k- N9 W1 L
// assemble the command and the execute it with eval()0 @4 i* {& \2 c
var command= 'app.popUpMenu( '+ items+ ' );';
/ n, j! E4 y d& k5 H y2 J v var selection= eval( command );
( L9 V: @' {6 e( z3 ~9 g* U, p if( selection== null ) ...{! ?4 N4 v+ i9 u, f
return; // exit
. f7 K8 h; G! I; D9 H" J- Q } i. T7 U5 f% P& N+ ~$ a# e
// the user made a selection; parse out its index and use it
3 S; U7 K" E: b$ b! Y // to access the bookmark record
% u5 @4 e% @3 h: I+ g/ ^5 i' _ var index= 0;
# `- }1 D6 I$ B; h6 O7 T6 d- X // toString() converts the String object to a string literal
7 ?/ j Q( I. F8 f // eval() converts the string literal to a number
3 L x, O* l7 c& S index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );% E2 L Z5 x& E v* ^( k
if( index< data.length ) ...{# s8 k. e( ~3 L3 ~5 a7 F
try ...{
( F2 ?% ?# S% h // the document must be 'disclosed' for us to have any access8 R" o4 m5 f4 W' [; p' R: u
// to its properties, so we use these FirstPage NextPage calls
! ?: G8 \; r; q" E! X# o3 L6 n* X //
+ O* G7 B/ d- t5 q0 X app.openDoc( data[index][1] );
' Z& |8 i: t1 g# A& M# c1 [: `+ c9 z app.execMenuItem( "FirstPage" );; K' y( a" l- \7 t
for( ii= 0; ii< data[index][2]; ++ii ) ...{
1 X1 M: K- L7 S3 [ app.execMenuItem( "NextPage" );
7 ?' E: k1 p! c6 @# S }2 o! s" o: T, T: T. @) E
}
8 r+ X; ]' w3 D, ~$ x catch( ee ) ...{
+ C$ j! X! K+ X$ L/ i; s8 p var response= 1 I4 @- {2 g6 X! Y5 `
app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");
6 c- D6 o( ?+ j& G3 g1 q7 l if( response== 4 && index< data.length ) ...{+ ~' x& l/ V3 Q& r7 c
data.splice( index, 1 ); l, G% o0 G" E% o/ ]
SaveData( data );
3 @/ w" @5 r8 f" H" X8 ^$ G* G }; z9 c+ W# i' H# Y: I- z
}
' X7 `& I% E6 e0 y U" t }! d+ q* `4 v; }% u; o8 M# Z" i" Q
}6 d" b; n/ d6 W& w$ L1 `* O
function DropBookmark() ...{% k9 O. z1 p, p6 {2 u% {; w3 z
// modelled after ShowBookmarks()
+ Y/ [! v$ c% C, Z var data= GetData();) {% m) ^5 t4 d
var items= '';+ Z; f: o! }4 Y. {4 B, E
for( ii= 0; ii< data.length; ++ii ) ...{
# F: J3 N! Z0 H' g if( ii!= 0 )9 }1 j6 o! X: S! v1 ^
items+= ', ';
, \/ k+ p" u. ]4 V/ ~ V items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
: z' ]1 E {4 Y" L }
* P3 c! O7 H- c8 d6 b# a var command= 'app.popUpMenu( '+ items+ ' );';7 f) m) g9 Q% H# Z" P
var selection= eval( command );
' N. h' H7 F# ^9 q# o6 Q7 L$ M* ]! ^ if( selection== null ) ...{
1 S& G. d' k J3 M) Y+ q6 I1 R return; // exit
( D; e: m) m0 {; Z5 `- _ }
# D1 b0 J$ K8 o3 m var index= 0;
; X+ v/ c$ r+ ^( h) k- ^+ R index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );2 M/ |3 s, ?, f# {% X" r
if( index< data.length ) ...{0 S: G$ w- ^8 y7 x( [0 b
data.splice( index, 1 );; g6 j# N" ~! }$ t6 Q' M2 p
SaveData( data );4 B, B% U2 c3 x' Y# K
}' s4 F( y& s y4 T1 M+ o5 O
}
) B/ V' S7 T- [# zfunction ClearBookmarks() ...{
8 r; _4 w+ I! X if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) ...{2 T# j( u& @/ Q4 ~, y0 H, b# J, B* G
SaveData( new Array(0) );
$ _( X) J" J* s; p }' K; \ }. }( h Z" T4 X1 ?3 n
}
( W9 m$ D- h6 U$ p% R1 gapp.addMenuItem( ...{
0 M. Q7 F7 D8 [3 p: L7 }cName: "-", // menu divider# A5 Q4 J$ O1 [: Q$ D: \" m
cParent: "View", // append to the View menu
. ^3 y7 X, F QcExec: "void(0);" } );5 L2 o9 u9 y! b
app.addMenuItem( ...{
% M& V6 p, O7 x8 L, `, {2 ncName: "设置本页为书签(&B)",* @# T2 P6 l* u0 c
cParent: "View",
9 }6 I1 d$ V/ \: w+ o- p" ZcExec: "AddBookmark();",
: t1 h3 ^; y$ kcEnable: "event.rc= (event.target != null);" } ); g" _' Z; A. r% Q& I( l
app.addMenuItem( ...{
, n1 [1 u( K" i6 r& ?! z ^& \cName: "转到指定书签(&T)",, h% ?* i+ `, A+ v" _( m
cParent: "View",
& D2 a9 {7 e3 v) R* d- b, ~cExec: "ShowBookmarks();",, b; r& G" X* E! @! q, w; W
cEnable: "event.rc= (event.target != null);" } );
4 C9 _$ n* |. W# k9 R//cEnable: "event.rc= true;" } );; c q, [8 Q+ d8 j) K
app.addMenuItem( ...{
, }* V4 e- k5 i- d& scName: "删除一个书签(&D)",
( g! f7 a5 X7 i0 d. o0 g# GcParent: "View",
9 S% H' H/ g& C! Z, Z: tcExec: "DropBookmark();",/ J5 ]' |; M( ~, R+ U' k N
cEnable: "event.rc= (event.target != null);" } );5 O" @/ X1 |8 k- @2 K: z( ^
app.addMenuItem( ...{: g: w) k7 z% P
cName: "清除所有书签(&C)",
3 y- x# B7 k- J. l" E) }cParent: "View",) A$ P* m9 M0 @4 T
cExec: "ClearBookmarks();",1 w3 V* v& I7 h7 Z% ]) J
cEnable: "event.rc= true;" } );
1 c2 I7 o# R/ s2 O) l4 将文件拷贝到C:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下0 A4 x1 B! R8 \
5 重新打开Adobe Reader,看看下面的图形,相信不用说任何东西,大家都会用了
& S! d2 R/ }* B4 k0 ]+ k. a; I+ L, I) `8 a, B5 _! b
0 G1 U: {+ t5 t! O9 c0 v本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aohan/archive/2008/02/20/2108051.aspx |
|