为 adobe reder(pdf阅读器)添加书签
--------完美解决中文乱码和支持reder10.0/reader11.0
从adobe reder的官方说明书中可以看到,adobe reder是不支持书签功能的。这给我们阅读带来了很大的麻烦,我每次都是在桌面新建一文本文件,专门用来记录书签信息。(当然,adobe reder支持一种类似的功能,即:视图->页面导览->上一视图,它记录了你关闭PDF时的当时的页面,但功能单一且不实用)。
从adobe reder的技术手册中发现,adobe reder支持插件功能,且提供相应的SDK说明书,并借鉴网友们的帮助和建议,实现了书签功能。完美支持adobe reder 10.0 ,adobe reder11.0和中文显示等。
1.解决了菜单乱码问题。
使用cUser成员为菜单命名,防止乱码。
2.优化了书签跳转算法,使打开书签没有延迟。
原程序中使用的是for(page = 0; page < gotogage; ++page) nextPage(); 这样的机制,使得书签跳转速度慢,修改为gotoPage( gotopage);。
3.添加了书签自动排序功能。
书签保存形式为“《文件名》第N...N页/共N...N页 yyyy/mm/dd 备注”(其中备注为可选填项)书签会按照字母顺序自动排序,排序优先级为:文件名>页面>日期>备注。可以打开不同文件。
第一步,将以下代码复制到记事本,另存为Bookmark.js文件.放到安装目录 X:\Program Files\Adobe\Reader10.0\Reader\Javascripts文件夹下(X代表盘符,Reader 10.0这个版本随你安装的版本而不同)
第二步 运行Adobe Reader,菜单编辑->首选项->JavaScript->勾选启用Acrobat JavaScript和启用菜单项目JavaScript执行权限。
第三步 在“视图(view)”下面已经出现4个选择项:设置本页为书签、转到指定书签、删除一个书签、清除所有书签.
====================================================================================================================================
代码如下:
varbp_delim= '%#%#';
functionSaveData( data )
{
// data isan array of arrays that needs
// to beserialized and stored into a persistent
// globalstring
var ds= '';
data.sort();
for( ii= 0; ii< data.length; ++ii )
{
for( jj= 0; jj< 3; ++jj )
{
if( ii!= 0 || jj!= 0 )
ds+= bp_delim;
ds+= data[ii][jj];
}
}
global.pdf_hacks_js_bookmarks= ds;
global.setPersistent("pdf_hacks_js_bookmarks", true );
}
functionGetData()
{
// reverseof SaveData; return an array of arrays
if( global.pdf_hacks_js_bookmarks== null )
{
return new Array(0);
}
var flat=global.pdf_hacks_js_bookmarks.split( bp_delim );
var data= new Array();
for( ii= 0; ii< flat.length; )
{
var record= new Array();
for( jj= 0; jj< 3 && ii<flat.length; ++ii, ++jj )
{
record.push( flat[ii] );
}
if( record.length== 3 )
{
data.push( record );
}
}
return data;
}
//GetCurrent Date
functionDateNow()
{
var d, tmp ,s ;
d = new Date();
t = d.getFullYear();
s = t + "/";
t = (d.getMonth() + 1).toString();
if(t.length!=2) t = "0" + t;
s += t + "/";
t = (d.getDate()).toString();
if(t.length!=2) t = "0" + t;
s += t;
return(s);
}
functionAddBookmark()
{
// querythe user for a name, and then combine it with
// thecurrent PDF page to create a record; store this record
var thisfilename=this.documentFileName;
thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));
var numLen =this.numPages.toString().length;
var numPlugInss=this.pageNum+1;
while(numPlugInss.toString().length <numLen)
{
numPlugInss = "0" + numPlugInss;
}
var currentdate=DateNow();
var label="《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页 " + currentdate;
var cResponse = app.response(
{
cQuestion: label,
cTitle: "添加书签",
cDefault: "无备注",
cLabel: "备注:"
});
if( cResponse!= null )
{
var record= new Array(3);
record[0]= label + " " + cResponse;
record[1]= this.path;
record[2]= this.pageNum;
data= GetData();
data.push( record );
SaveData( data );
}
}
functionShowBookmarks()
{
// show apop-up menu; this seems to only work when
// a PDFis alreay in the viewer;
var data= GetData();
var items= '';
for( ii= 0; ii< data.length; ++ii )
{
if( ii!= 0 )
items+= ', ';
items+= '"'+ ii+ ': '+data[ii][0]+ '"';
}
// assemble the command and the execute it with eval()
var command= 'app.popUpMenu( '+ items+ ');';
var selection= eval( command );
if( selection== null )
{
return; // exit
}
// theuser made a selection; parse out its index and use it
// toaccess the bookmark record
var index= 0;
// toString() converts the String object to a string literal
// eval()converts the string literal to a number
index= eval( selection.substring( 0,selection.indexOf(':') ).toString() );
if( index< data.length )
{
try
{
// the document must be 'disclosed'for us to have any access
// to its properties, so we usethese FirstPage NextPage calls
//
if(this.path == data[index][1])
{
this.pageNum = data[index][2];
}
else
{
var otherDoc =app.openDoc( data[index][1]);
otherDoc.pageNum =data[index][2];
}
}
catch( ee )
{
var response=
app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");
if( response== 4 &&index< data.length )
{
data.splice( index, 1 );
SaveData( data );
}
}
}
}
functionDropBookmark()
{
// modelled after ShowBookmarks()
var data= GetData();
var items= '';
for( ii= 0; ii< data.length; ++ii )
{
if( ii!= 0 )
items+= ', ';
items+= '"'+ ii+ ': '+data[ii][0]+ '"';
}
var command= 'app.popUpMenu( '+ items+ ');';
var selection= eval( command );
if( selection== null )
{
return; // exit
}
var index= 0;
index= eval( selection.substring( 0,selection.indexOf(':') ).toString() );
if( index< data.length )
{
data.splice( index, 1 );
SaveData( data );
}
}
functionClearBookmarks()
{
if( app.alert("确认要清除所有的书签吗,删除后将不可恢复?", 2, 2,"删除书签" )== 4 )
{
SaveData( new Array(0) );
}
}
app.addMenuItem(
{
cName:"-", // menudivider
cParent:"View", // append tothe View menu
cExec:"void(0);"
} );
app.addMenuItem(
{
cName:"AddBookmark",
cUser:"设置本页为书签(&B)",
cParent:"View",
cExec:"AddBookmark();",
cEnable:"event.rc= (event.target != null);"
} );
app.addMenuItem(
{
cName:"ShowBookmarks",
cUser:"转到指定书签(&T)",
cParent:"View",
cExec:"ShowBookmarks();",
cEnable:"event.rc= (event.target != null);"
} );
app.addMenuItem(
{
cName:"DropBookmark",
cUser:"删除一个书签(&D)",
cParent:"View",
cExec:"DropBookmark();",
cEnable:"event.rc= (event.target != null);"
} );
app.addMenuItem(
{
cName:"ClearBookmarks",
cUser:"删除所有书签(&C)",
cParent:"View",
cExec:"ClearBookmarks();",
cEnable:"event.rc= true;"
} );
===========================================================
最后附上已经写好的Bookmark.js文件,以供大家直接下载使用:
地址:http://download.youkuaiyun.com/detail/cbnotes/4825981
******声明:以上代码是某位大神改进的代码~亲测可用,感谢大神!
在Adobe Reader中添加书签的解决方案

本文介绍如何在Adobe Reader中通过JavaScript插件实现书签功能,解决了官方不支持书签的问题,包括菜单乱码、书签跳转延迟和自动排序。详细步骤包括编写并保存Bookmark.js文件,开启JavaScript权限,以及操作书签的菜单选项。
1701

被折叠的 条评论
为什么被折叠?



