PDF自動生成頁碼
原文:http://www.2cto.com/kf/201108/100715.html
在Acrobat中利用Javascript根據目錄一鍵生成帶頁碼的書籤
網路上很多掃描版的PDF電子書都缺少書籤。特別是對計算機教程類的大部頭來說,由於需要經常翻閱,沒有書籤的痛苦可想而知。
製作書籤的辦法主要有:
Ctrl+B來一個個地建立;
在Word2007裡面生成書籤,然後和內容主體合併;
利用JavaScript生成;
今天我來講講怎樣利用JavaScript在Acrobat一鍵生成書籤。
基本思路:大多數的掃描版PDF電子圖書都可以在官網或者各大網上書店找到目錄,很多都是帶有頁碼的(圖1)。 將目錄用文字檔案儲存起來,作為附件新增到PDF中,利用JavaScript讀取附件,生成陣列,用迴圈處理字串,再生成書籤。
圖1
下面是具體步驟:
1.把目錄複製貼上到一個文字檔案中,確保所有的分隔符是半形的空格(正則表示式為\s),並儲存為UTF-8的編碼。(圖2,圖3)
圖2
圖3
2.在Acrobat把目錄.txt新增到附件裡(圖4)並儲存PDF檔案。
圖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)
圖6
頁碼為1的頁面就是正文開始的第一頁,但一般都不是PDF開始的第一頁。
如圖7所示,頁碼為1的頁面是PDF檔案的第14頁,這裡我已修改了頁碼。
圖7
這樣就可以按照目錄的頁數直接找到要看的頁面,就是看實體書一樣。
因此,對於圖7來說,圖6中就應該輸入14,然後按確定,稍等一下,帶連線的書籤就自動生成了。
圖8
有的PDF沒有頁碼1的頁面,只有頁碼2或其它,這時需要把推斷出的頁碼1的頁數填入
如上圖,頁碼2的頁數是15,則頁碼1的頁數是14,以此類推。
注意事項:
一.這個指令碼只能處理最多5層的書籤,如
目錄--第一章--1.1--1.1.1--1.1.1.1
需要處理更多的層數請自己修改指令碼,很簡單的。
二.有的PDF正文內可能插有其他的內容,例如釋出網站的廣告等,這時要把這些頁面刪掉,以確保正文的頁數跟目錄是一致的,否則將連線不到正確的頁面。
三.指令碼也能處理沒有頁數的目錄,但是需要手動設定書籤的目標了…
四.Acrobat Pro的版本要高於9.3,否則不能讀取附件內容。
好了,本文就到此結束了,有任何疑問請回帖,希望本文對你有幫助!
本文出自 “一些心得” 部落格