早上起床本来打算看Transmission Electron Microscopy,看到PDF文件没有书签,实在不想重复Ctrl + B,就想找个法子批量新建书签,结果一天就这么过去了。。。
Acrobat XI + 32位Windows 7
需要准备两个文件。一个是书签相关的文件。主要是你书签的名字、对应 页码。一行对应一个书签,两侧允许有空格,允许有空行。以#开头的行认为是注释,直接略过。页码前面一定要有空格。
另一个是JavaScript脚本。
app.addMenuItem({
cName : "bookmark",
cParent : "File",
nPos : 0,
cExec : "makeBookmark();",
cEnable : "event.rc= (event.target != null);"
});
console.println("bookmark@chengzhi");
function getLastChild(headBK){
}
function getHeadNode(chapter, rootBM){
//[1, 2, 1] or 1
length = chapter.length;
var headBK = rootBM;
for (var i = 0; i < length - 1; i++) {
//console.println("length: " + length);
if (headBK.children != null && headBK.children[headBK.children.length - 1] != null){
headBK = headBK.children[headBK.children.length - 1];
//console.println(chapter[i] + ": " + headBK);
}else{
app.alert({
cMsg: chapter + ": no parent node!\nid: " + chapter[i],
cTitle: "Hierarchy Error"
});
}
};
//console.println("getChapter: " + chapter);
//console.println("getHeadNode: " + headBK);
return headBK;
}
function collapsBM(BM) { //折叠所有书签
if (BM.children != null) {
for (var i in BM.children) {
if (BM.children[i].children != null) {
BM.children[i].open = false;
}
}
for (var i in BM.children) {
collapsBM(BM.children[i])
}
}
}
function getPageInfo(){
//Read file data into stream
var stmFileData = util.readFileIntoStream();
// Convert data into a String
var strTextData = util.stringFromStream(stmFileData);
return strTextData;
}
function getFirstPage(){
var FirstPageNum = app.response({
cQuestion : "exact page number",
cTitle : "If no 1st index page existed, then input 2",
cDefault : "2",
cLabel : "input: "
});
//console.println(FirstPageNum + "\n");
return FirstPageNum;
}
function parseLine(myRow, FirstPageNum, rootBM){
//console.println("row: " + myRow);
myRow = myRow.replace(/^\s+|\s+$/g, "");
if (myRow.length < 2) {
return ;
}
if (myRow[0] == '#') {
return ;
}
//1.2.3 principle => 1.2.3 or 1 introduction => 1 or cover, content, reference => null
var chapter = myRow.match(/^(\d+\.)*\d+/g);
var headBK = rootBM;
var nIndex;
//headBK, nIndex
//console.println("77: " + chapter);
if (chapter != null) {
chapter = chapter.toString();
//console.println("79: " + chapter.length);
//1.2.3 or 1. or 1
chapter = chapter.toString().split(".");
headBK = getHeadNode(chapter, rootBM);
chapLen = chapter.length;
// last or headBK.children.length
//console.println(chapter);
//console.println("81: " + headBK);
if (headBK.children == null) {
nIndex = 0;
}else{
nIndex = headBK.children.length;
}
}else{
//null
//console.println(headBK);
nIndex = headBK.children ? headBK.children.length : 0;
}
//page number
var LastSpaceIndex = myRow.lastIndexOf("\u0020"); //last backspace
var pageNum = Number(myRow.slice(LastSpaceIndex));
//console.println("98: " + pageNum)
pageNum = pageNum + Number(FirstPageNum) -2;
//console.println("101: " + pageNum)
//content
var content = myRow.slice(0, LastSpaceIndex);
content = content.replace(/^\s+|\s+$/g, "");
//console.println("\n" + content+ ": " + chapter + " - " + pageNum);
//console.println("107: " + headBK);
//console.println("108: " + nIndex);
headBK.createChild(content, "this.pageNum=" + pageNum + ";this.zoom=150;", nIndex);
}
function makeBookmark(){
var MyString = getPageInfo();
FirstPageNum = getFirstPage();
var rootBM = this.bookmarkRoot;
if (FirstPageNum != null) {
var myArr = MyString.split("\n");
for (var i in myArr) {
//each line corespond to a bookmark
parseLine(myArr[i], FirstPageNum, rootBM);
}
}
collapsBM(rootBM)
}
将上面的脚步复制另存为bookmark.js的脚本,置于C:\Program Files\Adobe\Acrobat 11.0\Acrobat\Javascripts路径下(文件名自便,路径和acrobat安装位置有关)。再次打开acrobat,这个路径下的JS脚步会被自动调用,File菜单下会注册产生一个叫bookmark的子菜单。点击菜单,首先会弹出对话框选择包含书签信息的文件,之后会再弹出一个对话框,给出第一页对应的实际页码,即正文对应的第一页(第1章)往往不是PDF文件的第一页,需要自己给出对应关系。如果正文第一页出现在PDF文件第17页,则填17。
这样产生的书签是通过JavaScript脚步实现跳转,Android平台的Adobe Acrobat、WPS、PDF Max Pro都不支持,所以不能实现跳转。我是在PC上点击书签调到相应页码,然后在书签上右键选择”设置目标(A)”,再选yes。
资料:http://2134255.blog.51cto.com/2124255/641839
http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/js_api_reference.pdf(官方文档)