TA的每日心情 | 奋斗 昨天 15:16 |
---|
签到天数: 2341 天 [LV.Master]伴坛终老
|
最近经常看一些PDF的电子文档,痛苦的是Adobe Reader竟然没有提供书签的功能,每次看完之后再回到上次看的地方都很麻,到网上一找,还真有人就做了PDF的书签,下载一试效果不错,于是参看了一下Adobe Reader的SDK,修改了一点地方,以更方便的使用,下面是程序的使用方法5 v/ x, y6 f% e0 c' ?) N6 j
1、打开编辑的首选项项
7 x$ {" U; ]. L) o+ G/ _* S* Q
, `% f& i# b! F2 g2、确保下面的选项都被选中
5 i6 w: ^0 U5 ~3 M" k! U& R7 k1 p& g9 t! g! ^
3 把下面的代码保存为一个bookmark_page.js文件% \- h4 i: X) L' v9 G
// bookmark_page.js, ver. 1.0
( |& X' z5 A: _0 G: s( v// visit: www.pdfhacks.com/bookmark_page/
/ M, N, F/ E( ^9 N) \8 p// edit:cjs 2008-02-17 6 _7 z, P+ j* x- Q& X l* P
// 1 修改为中文标签
7 F3 c; M2 I* Y; k+ {0 x// 2 设置书签时可以自动获取当前的书名
3 S! Z1 X( H4 f5 H- Z* ]' Y// 3 自动获取当前所在的页码与总页数,方便查阅8 @4 Q, n/ |0 e# l( ~5 b
// 4 实现更多功能可以参看Adobe Reader的SDK; U9 m" P1 T# w. u# x2 F1 L4 [9 j
- Z$ V0 c, ?% q/ G3 b
// use this delimiter for serializing our array
3 n" }$ m% Q$ T: |" Z0 W' Svar bp_delim= '%#%#';7 E O ?+ { x. L3 H; _
function SaveData( data ) ...{
4 T$ |) ?% g( |9 M- t3 D) m, Q: I // data is an array of arrays that needs0 c/ X$ A: B o1 o% T' ]) i& |
// to be serialized and stored into a persistent
. T3 H$ L; y: a/ M // global string/ h& E% }: _! K. f2 k
var ds= '';
* S t# s/ n" | for( ii= 0; ii< data.length; ++ii ) ...{! R! j# l, X& N7 |+ S; L6 ~7 ^- A
for( jj= 0; jj< 3; ++jj ) ...{
1 d% p5 g+ E" i4 [, u: B7 D if( ii!= 0 || jj!= 0 )
Y+ Q$ P) Q4 {" {0 k7 k ds+= bp_delim;; R; Y8 d6 N9 F0 E
ds+= data[ii][jj];: _5 k9 t7 M L4 q0 t
}+ k+ ^6 Q; q0 ]$ W; D* ?5 c# _% D$ _
}
2 }7 o4 @' d7 E- U global.pdf_hacks_js_bookmarks= ds;
" j, c! M; x+ A9 C global.setPersistent( "pdf_hacks_js_bookmarks", true );
9 x" b3 w' b$ N6 Y}
# F$ B+ P6 k6 [( Jfunction GetData() ...{
" C/ `* V1 M; Y, S* D) j) L // reverse of SaveData; return an array of arrays
1 V4 v. X" \6 O' s/ } if( global.pdf_hacks_js_bookmarks== null ) ...{
+ t; {% A# z# z: v: S ]+ E return new Array(0);
& `0 d& v- ~9 u1 P1 I: ~. S }! W0 e- h3 A: C: `! i5 I# W
var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );
9 ~. K A! H1 ^5 h% ^. X1 D7 A+ m var data= new Array();
; ]' `! k5 a& J0 o# F for( ii= 0; ii< flat.length; ) ...{& N& j) E! a+ z# {9 x: L
var record= new Array();6 i3 Z T+ ?6 N# m! k7 j5 o
for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) ...{
1 m/ Q, F4 Q- U1 i2 T% D/ ^+ H4 g record.push( flat[ii] );
* B @3 }; A2 \8 |' j: R }
$ w5 s& c1 j$ J6 ^ if( record.length== 3 ) ...{6 G2 i6 G6 S2 J: F
data.push( record );
4 a" R/ C4 V: c, V- B }
; F" V+ U( m+ Z6 {& v }
, I& |; e, h& M- e1 o6 H! l return data;# s$ f% c; j& B0 I+ ?" ^- c
}
V$ J3 ]- ^" e. \4 _) f//Get Current Date H3 a* Q7 [; h- X8 Y- N
function DateNow()...{
# |5 M7 ~! I" x- j/ | var d, s ;
/ m: a, \" q% v2 _" i0 E d = new Date();0 \ [; e" ]/ @" Q" e; t% s4 S1 y
s = d.getFullYear()+"/";
0 p7 \5 F4 |/ ~. G Y s += (d.getMonth() + 1) + "/";
- S% p. q1 \- K( t( `0 x9 \# T s += d.getDate() ;3 b5 Q# K" `* l k, ]
/**//*
, M8 r) g0 ~0 t4 l/ q s += d.getHours() + ":";
5 u* O4 M" S+ x0 F. k s += d.getMinutes() + ":";
9 S w: G1 B" Y! E5 ^. ] s += d.getSeconds() ;" J' K" S( D' U# `0 [
*/
1 N2 c7 K" b3 k6 B" p: R1 } return(s);
) ?# R; T r# q' W" r}
* [ V$ V1 ~- R4 S9 w, Y
0 i5 u6 B* \& {% Pfunction AddBookmark() ...{/ d) Q P5 G {9 k# {
// query the user for a name, and then combine it with. I0 L7 ?6 |4 M& T# M0 d: x8 ~
// the current PDF page to create a record; store this record
4 h! I4 n- Z' G var thisfilename=this.documentFileName;1 R4 Z! T, K: K4 K+ E& i8 \' ?* S1 u
thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));
8 e6 L* e- v: j( ?) {1 O var numPlugInss=this.pageNum+1;
$ u7 }# @, d1 g% i var currentdate=DateNow();
( Z4 w5 J/ f6 m4 s7 B* n var label=
; d5 D5 H. _! @# c4 D/ V app.response( "书签名称,可以修改以便于记忆:",
: P" r6 b7 ]# b2 q2 `( | "书签名称",
( o, X* q& M0 u' F "《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页 "+currentdate,4 {! u" i/ ]8 K8 ?) X( [
false );
% K) I+ d; t5 J" ?5 L1 R if( label!= null ) ...{1 o; B' N* L* v* B% A6 ~- n
var record= new Array(3);4 [3 P; s6 D/ h9 J0 c1 S; e" t6 H, j
record[0]= label;
2 k/ B, z7 t( N, q* D k5 t record[1]= this.path;
2 I7 m# Z. O- ^2 c: D7 C record[2]= this.pageNum;
8 z, z; J* [$ A# r2 U data= GetData();
: i/ ?5 P8 x+ f$ Y5 L' T0 l data.push( record );- [1 R; J0 F2 _) e9 E/ E: A2 x! H
SaveData( data );
: X, z2 D% p& S; ^. X3 w5 N }
. ~' C0 e# D3 e" p8 n @}! W2 H+ E8 ?& ]$ [5 j
function ShowBookmarks() ...{
k9 S) V% l% ^& Q) O( E // show a pop-up menu; this seems to only work when
& j+ W" T7 F+ d // a PDF is alreay in the viewer;4 ?. W6 G5 g% \8 m
var data= GetData();2 g0 p$ x" @8 F( O# a% n) z( ~. P& f
var items= '';
& p( f: U/ k* s( n# }1 q for( ii= 0; ii< data.length; ++ii ) ...{6 ^6 N9 d/ e: D
if( ii!= 0 )- t" }5 D3 L, W1 E1 M2 t5 B1 F
items+= ', ';" A3 G5 ?- C: C' ~
items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
* i* |4 U& L0 O' v }
& D* M& g- \+ ?1 T: ]- a7 W // assemble the command and the execute it with eval()' a$ V1 x; s( `
var command= 'app.popUpMenu( '+ items+ ' );';. T L) ~" Y2 _* d
var selection= eval( command );
* u. z) o, @, k' m if( selection== null ) ...{
6 K z) n- v! N' } return; // exit p; J/ i% f/ O! t2 D7 H
}$ _8 ?4 n6 L) }! ~+ A
// the user made a selection; parse out its index and use it
& H; B+ `" X# x3 Y; M$ @! {8 K // to access the bookmark record6 k# `4 V8 A* h7 A2 p/ d
var index= 0;
# X9 C9 r; k. m A1 q' T9 e // toString() converts the String object to a string literal
1 @) J% B3 {$ ~ // eval() converts the string literal to a number
8 `( g; E/ X) e @5 R0 R index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );4 ]. ~$ @ J E$ c% |
if( index< data.length ) ...{* m+ |5 p# r! a5 a" B# n& q
try ...{) H# [4 P) I. U+ U w- Q# l
// the document must be 'disclosed' for us to have any access2 B! i6 w4 R2 G/ M0 m
// to its properties, so we use these FirstPage NextPage calls
# Q, i j: _/ ^: ^- j/ G& r8 z // |8 G8 [8 q% ?* \5 f2 g9 f
app.openDoc( data[index][1] );- u& z2 o1 ?2 K8 c
app.execMenuItem( "FirstPage" );
6 J' I7 H' K- o4 V# p4 P8 L for( ii= 0; ii< data[index][2]; ++ii ) ...{
; K* n1 X8 h9 j9 L ?3 o, S$ n app.execMenuItem( "NextPage" );/ `. ^7 b& J( k' y; L, e* R
}# u, y5 J. v5 u% B
}
( ^- i5 c0 ^: h0 b$ ^/ o2 s catch( ee ) ...{2 n# ~) C/ C" t! ~- B$ k
var response=
1 v/ C* F3 Q- n$ l- c+ q app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");; o* L* w, }. Z! c8 L) b) ~8 D
if( response== 4 && index< data.length ) ...{
! a. }. _% r0 A9 ?: ~5 p% ^ O data.splice( index, 1 );# G0 p: U7 V+ k1 T; s1 A
SaveData( data );
8 ^& c5 V7 X6 ?7 }! Y6 n }5 K ^# `& {% p r6 v: H$ @
}
4 e' @% B& e& h9 c4 q }
( }, i) g2 w# [; l' v4 |0 ?}
1 B! Z' O# c1 R {. tfunction DropBookmark() ...{3 Q6 k# u1 R9 \6 C; v
// modelled after ShowBookmarks()
' H7 P! _- M4 G7 B! ], I R4 @ var data= GetData();
. P1 H% B, y3 a! ]8 S% J var items= '';
# p; C1 c$ X4 I# g) {8 R C$ t for( ii= 0; ii< data.length; ++ii ) ...{
8 m/ Z" x4 {6 m' c/ \3 S- I if( ii!= 0 )5 I; X7 y' | }' i5 v+ i$ C
items+= ', ';: w* E! [( H) O( H
items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
3 M* i# ^7 r3 X3 F }& K5 S, u8 h" \, p
var command= 'app.popUpMenu( '+ items+ ' );';) J0 i+ G% W/ [* ]$ Q5 }/ K
var selection= eval( command );: g+ O$ S5 B8 U1 O! a% M; G0 Y0 c6 T
if( selection== null ) ...{
7 p* o. y) t+ ^/ I! { return; // exit
( q" R7 ]& y5 i% v( _- ]% M }
6 c3 P/ W* D* B var index= 0;5 R& _8 o8 a3 g# w4 S6 t
index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );
! C: N9 X$ [+ N! k0 w) K. _ k3 q if( index< data.length ) ...{
: d" R, @7 i9 l& D7 \ k, w; R data.splice( index, 1 );/ z7 t+ K2 }- x- F" x2 H( F
SaveData( data );0 b. L2 g; @: y' g
}- I ]1 I# `0 D$ @6 f" d& ?7 p
}
z& ^6 M2 g3 m$ K) ]6 B, a. I4 i8 ~function ClearBookmarks() ...{* p s/ h( g' Z7 f
if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) ...{, a# v0 ~- `& G' Z3 i5 N# I' D S+ C# Q
SaveData( new Array(0) );1 w% m8 l7 H- g" U4 q
}" |7 l0 A8 Z0 h! s. U
}
% m9 ?+ x( _! A+ L1 `app.addMenuItem( ...{
( B% Q/ X& E' Y v2 R" G% o- pcName: "-", // menu divider2 @# J: D. p4 c4 \3 c
cParent: "View", // append to the View menu$ a6 a- Q1 Y- F2 r
cExec: "void(0);" } );# s0 v9 W5 i' v' Q
app.addMenuItem( ...{/ M, D# n! k, s5 | M: C
cName: "设置本页为书签(&B)",- l" K+ p! O' V" w
cParent: "View",
/ V' i/ n$ ~+ P. CcExec: "AddBookmark();",
, F) p9 y8 Y) qcEnable: "event.rc= (event.target != null);" } );9 h3 I+ u% s$ m# a
app.addMenuItem( ...{7 Y3 O$ M+ [5 }7 u' x9 ]/ W5 I0 D
cName: "转到指定书签(&T)",; A& e0 b( }& l6 W# n) k
cParent: "View",! B5 _/ W4 I) E4 q
cExec: "ShowBookmarks();",, t, W, c* }/ b, ]; x
cEnable: "event.rc= (event.target != null);" } );
5 D; A- z$ _# l2 |3 s//cEnable: "event.rc= true;" } );6 {" M0 z5 j, M( l5 X) b# q8 j$ i
app.addMenuItem( ...{
~7 M: Z% z7 n) kcName: "删除一个书签(&D)",
0 J) k8 l5 f3 {) w2 t5 ZcParent: "View",
- _5 L- j, _* }; ?cExec: "DropBookmark();",' ^7 u8 D( l! u( k2 @& [$ Q1 j
cEnable: "event.rc= (event.target != null);" } );
! V4 |) q9 ?3 Dapp.addMenuItem( ...{
$ {6 z# ?3 N) U. DcName: "清除所有书签(&C)",
|" m' W1 M) O2 e DcParent: "View",9 ~, ~8 R# i2 C9 |6 L' w
cExec: "ClearBookmarks();",+ d& w2 J" M* S( ^$ L* ]( r
cEnable: "event.rc= true;" } );
( v7 |- L8 i. U4 将文件拷贝到C:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下
3 r$ g) l* r0 k/ T' _5 重新打开Adobe Reader,看看下面的图形,相信不用说任何东西,大家都会用了
# d# ?# m7 L- z, v1 ]$ N4 e" _. ]4 y- L- V/ E- ^5 ]
2 v/ M( C. o# A: p& j0 X; w本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aohan/archive/2008/02/20/2108051.aspx |
|