在Acrobat中利用Javascript根據目錄一鍵生成帶頁碼的書簽

網絡上很多掃描版的PDF電子書都缺少書簽。特別是對計算機教程類的大部頭來說,由於需要經常翻閱,沒有書簽的痛苦可想而知。
制作書簽的辦法主要有:
Ctrl+B來一個個地創建;
在Word2007裡面生成書簽,然後和內容主體合並;
利用JavaScript生成;
今天我來講講怎樣利用JavaScript在Acrobat一鍵生成書簽。
基本思路:大多數的掃描版PDF電子圖書都可以在官網或者各大網上書店找到目錄,很多都是帶有頁碼的(圖1)。 將目錄用文本文件保存起來,作為附件添加到PDF中,利用JavaScript讀取附件,生成數組,用循環處理字符串,再生成書簽。

image

圖1
 
下面是具體步驟:
1.把目錄復制粘貼到一個文本文件中,確保所有的分隔符是半角的空格(正則表達式為\s),並保存為UTF-8的編碼。(圖2,圖3)

image

圖2

image

圖3
2.在Acrobat把目錄.txt添加到附件裡(圖4)並保存PDF文件。

image

圖4
3.下載文末的附件把Bookmark.js文件解壓出來復制到Acrobat安裝目錄下的JavaScript文件夾裡面,默認是Adobe\Acrobat 9.0\Acrobat\Javascripts
Bookmark.js文件內容:
app.addMenuItem({    
  cName: "從附件添加書簽", cParent: "Tools",
  cExec: "bookm();",
  cEnable: "event.rc= (event.target != null);" });

    
var Name_Bookmark;
var Page_Bookmark;


function bookm()
{
  var StartNum = app.response({    
    cQuestion: "輸入頁碼為1的實際頁數",    
    cTitle: "若缺少1頁碼,則輸入2頁碼的實際頁數,依此類推",    
    cDefault: "1",    
    cLabel: "輸入:"
    });
    
  if (StartNum!=null)
  {
    var myThis=event.target;
    var attName=myThis.dataObjects[0].name;
    var oFile = myThis.getDataObjectContents(attName);
    var arrFile = util.stringFromStream(oFile, "utf-8");
    var tArr=arrFile.split("\n");

    myThis.bookmarkRoot.remove();
    myThis.bookmarkRoot.createChild("目錄");

    var fSpc;
    var lSpc;
    var tCht;
    var oDot;
    var Num_Dot;
    
    var MenuBookmark=myThis.bookmarkRoot.children[0];//目錄
    var ChaptersBookmark;
    var SectionsBookmark;
    var SubSectionsBkm;
    var SubSectionsBkm1;
        
    var i;
    var a;
    var b;//首空格後的字符
    for (i=0;i<tArr.length;i++)
    {
      a=tArr[i];
      if (a.length>2)//空行的length=1,設置為2即不添加空行
      {
        fSpc=a.search(/\s/);// 首空格位置
        tCht=a.slice(0,fSpc);//首空格前的字符
        oDot=tCht.match(/\./g);//匹配.符號
        Num_Dot=(oDot==null? 0:oDot.length);

        lSpc=a.lastIndexOf(a.charAt(fSpc));//末空格的位置
        b=Number(a.slice(lSpc));
        Page_Bookmark=(isNaN(b)? 0:b-2+Number(StartNum));//書簽指向的頁碼
        Name_Bookmark=(isNaN(b)? a:a.slice(0,lSpc));//書簽的名字

        
        switch (Num_Dot)
        {
          case 0:
            ChaptersBookmark=CreateSubBkm(MenuBookmark);
            break;
          case 1:
            SectionsBookmark=CreateSubBkm(ChaptersBookmark);
            break;
          case 2:
            SubSectionsBkm=CreateSubBkm(SectionsBookmark);
            break;
          case 3:
            SubSectionsBkm1=CreateSubBkm(SubSectionsBkm);
            break;
          default:
            break;
        }

      }
    }
  }    
}
    
function CreateSubBkm(RootBkm)//在RootBkm書簽底下創建一個新書簽,並返回新書簽對象
{
  var RootBkm;
  var subBookmark;
  RootBkm.createChild(Name_Bookmark, "this.pageNum="+Page_Bookmark+";");
  RootBkm.insertChild(RootBkm.children[0],RootBkm.children.length);
  subBookmark=RootBkm.children[RootBkm.children.length-1];//目錄中最後一個章節
  return subBookmark;
}    
    
4.重新打開Acrobat,並打開剛才保存瞭附件的PDF文件。選擇"工具"菜單下的"從附件添加書簽”選項。

圖5
 
接下來彈出的這個對話框要講解一下(圖6)

image

圖6
頁碼為1的頁面就是正文開始的第一頁,但一般都不是PDF開始的第一頁。
如圖7所示,頁碼為1的頁面是PDF文件的第14頁,這裡我已修改瞭頁碼。

image

圖7
這樣就可以按照目錄的頁數直接找到要看的頁面,就是看實體書一樣。
因此,對於圖7來說,圖6中就應該輸入14,然後按確定,稍等一下,帶連接的書簽就自動生成瞭。

image

圖8
有的PDF沒有頁碼1的頁面,隻有頁碼2或其它,這時需要把推斷出的頁碼1的頁數填入

image

如上圖,頁碼2的頁數是15,則頁碼1的頁數是14,以此類推。
 
註意事項:
一.這個腳本隻能處理最多5層的書簽,如
目錄–第一章–1.1–1.1.1–1.1.1.1
需要處理更多的層數請自己修改腳本,很簡單的。
二.有的PDF正文內可能插有其他的內容,例如發佈網站的廣告等,這時要把這些頁面刪掉,以確保正文的頁數跟目錄是一致的,否則將連接不到正確的頁面。
三.腳本也能處理沒有頁數的目錄,但是需要手動設置書簽的目標瞭…
四.Acrobat Pro的版本要高於9.3,否則不能讀取附件內容。


好瞭,本文就到此結束瞭,有任何疑問請回帖,希望本文對你有幫助!
本文出自 “一些心得” 博客

You May Also Like