在Acrobat中利用Javascript根据目录一键生成带页码的书签

网络上很多扫描版的PDF电子书都缺少书签。特别是对计算机教程类的大部头来说,由于需要经常翻阅,没有书签的痛苦可想而知
制作书签的办法主要有:
  • Ctrl+B来一个个地创建;
  • 在Word2007里面生成书签,然后和内容主体合并;
  • 利用JavaScript生成;
今天我来讲讲怎样利用JavaScript在Acrobat一键生成书签。
基本思路:大多数的扫描版PDF电子图书都可以在官网或者各大网上书店找到目录,很多都是带有页码的(图1)。 将目录用文本文件保存起来,作为附件添加到PDF中,利用JavaScript读取附件,生成数组,用循环处理字符串,再生成书签。
在Acrobat中利用Javascript根据目录一键生成带页码的书签_第1张图片
图1
 
下面是具体步骤:
1.把目录复制粘贴到一个文本文件中,确保所有的分隔符是半角的空格(正则表达式为\s),并保存为UTF-8的编码。(图2,图3)
图2
在Acrobat中利用Javascript根据目录一键生成带页码的书签_第2张图片
图3
2.在Acrobat把目录.txt添加到附件里(图4)并保存PDF文件。
在Acrobat中利用Javascript根据目录一键生成带页码的书签_第3张图片
图4
3.下载文末的附件把Bookmark.js文件解压出来复制到Acrobat安装目录下的JavaScript文件夹里面,默认是Adobe\Acrobat 9.0\Acrobat\Javascripts
Bookmark.js文件内容:
 
  
  
  
  
  1. app.addMenuItem({   
  2.     cName: "从附件添加书签", cParent: "Tools",  
  3.     cExec: "bookm();",  
  4.     cEnable: "event.rc= (event.target != null);" });  
  5.  
  6.       
  7. var Name_Bookmark;  
  8. var Page_Bookmark;  
  9.  
  10.  
  11. function bookm()  
  12. {  
  13.     var StartNum = app.response({   
  14.         cQuestion: "输入页码为1的实际页数",   
  15.         cTitle: "若缺少1页码,则输入2页码的实际页数,依此类推",   
  16.         cDefault: "1",   
  17.         cLabel: "输入:" 
  18.         });  
  19.           
  20.     if (StartNum!=null)  
  21.     {  
  22.         var myThis=event.target;  
  23.         var attName=myThis.dataObjects[0].name;  
  24.         var oFile = myThis.getDataObjectContents(attName);  
  25.         var arrFile = util.stringFromStream(oFile, "utf-8");  
  26.         var tArr=arrFile.split("\n");  
  27.  
  28.         myThis.bookmarkRoot.remove();  
  29.         myThis.bookmarkRoot.createChild("目录");  
  30.  
  31.         var fSpc,lSpc;  
  32.         var tCht;  
  33.         var oDot;  
  34.         var Num_Dot;  
  35.           
  36.         var Bkm= new Array(10);  
  37.         Bkm[0]=myThis.bookmarkRoot.children[0];  
  38.                   
  39.         var i;  
  40.         var a;  
  41.         var b;//首空格后的字符  
  42.         for (i=0;i<tArr.length;i++)  
  43.         {  
  44.             a=tArr[i];  
  45.             if (a.length>2)//空行的length=1,设置为2即不添加空行  
  46.             {  
  47.                 //fSpc=a.indexOf("\u0020");  
  48.                 tCht=a.match(/^.+?\s/);  
  49.                 oDot=tCht.toString().match(/\./g);//匹配.符号  
  50.                 Num_Dot=(oDot==null? 0:oDot.length);  
  51.                   
  52.                 lSpc=a.lastIndexOf("\u0020");//末空格的位置  
  53.                 b=Number(a.slice(lSpc));  
  54.                 Page_Bookmark=(isNaN(b)? 0:b-2+Number(StartNum));//书签指向的页码  
  55.                 Name_Bookmark=(isNaN(b)? a:a.slice(0,lSpc));//书签的名字  
  56.  
  57.                 Bkm[Num_Dot+1]=CreateSubBkm(Bkm[Num_Dot]);  
  58.             }  
  59.         }  
  60.     }     
  61. }  
  62.    
  63. function CreateSubBkm(RootBkm)//在RootBkm书签底下创建一个新书签,并返回新书签对象  
  64. {  
  65.     var RootBkm;  
  66.     var subBookmark;  
  67.     with (RootBkm)  
  68.     {  
  69.         createChild(Name_Bookmark, "this.pageNum="+Page_Bookmark+";");  
  70.         insertChild(children[0],children.length);  
  71.         subBookmark=children[children.length-1];//目录中最后一个章节  
  72.     }  
  73.     return subBookmark;  
  74. }   
  75.     
4.重新打开Acrobat,并打开刚才保存了附件的PDF文件。选择"工具"菜单下的"从附件添加书签”选项。
在Acrobat中利用Javascript根据目录一键生成带页码的书签_第4张图片
图5
 
接下来弹出的这个对话框要讲解一下(图6)
在Acrobat中利用Javascript根据目录一键生成带页码的书签_第5张图片
图6
页码为1的页面就是正文开始的第一页,但一般都不是PDF开始的第一页。
如图7所示,页码为1的页面是PDF文件的第14页,这里我已修改了页码。
在Acrobat中利用Javascript根据目录一键生成带页码的书签_第6张图片
图7
这样就可以按照目录的页数直接找到要看的页面,就是看实体书一样。
因此,对于图7来说,图6中就应该输入14,然后按确定,稍等一下,带连接的书签就自动生成了。
在Acrobat中利用Javascript根据目录一键生成带页码的书签_第7张图片
图8
有的PDF没有页码1的页面,只有页码2或其它,这时需要把推断出的页码1的页数填入
如上图,页码2的页数是15,则页码1的页数是14,以此类推。
 
注意事项:
  1. 有的PDF正文内可能插有其他的内容,例如发布网站的广告等,这时要把这些页面删掉,以确保正文的页数跟目录是一致的,否则将连接不到正确的页面。
  2. 脚本也能处理没有页数的目录,但是需要手动设置书签的目标了…
  3. Acrobat Pro的版本要高于9.3,否则不能读取附件内容。
    在Acrobat中利用Javascript根据目录一键生成带页码的书签_第8张图片
好了,本文就到此结束了,有任何疑问请回帖,希望本文对你有帮助!

附近请下最后一个,第一个是旧版的,虽然功能是一样的。

本文出自 “一些心得” 博客

你可能感兴趣的:(JavaScript,正则表达式,脚本,null,Adobe,tools)