1. 程式人生 > >PDF自動生成頁碼

PDF自動生成頁碼

原文:http://www.2cto.com/kf/201108/100715.html

在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,否則不能讀取附件內容。


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