Goodbye, Ctrl+B

早上起床本来打算看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(官方文档)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值