2012年9月11日 星期二

PDF中的索引和書籤(四)

Outline *PDFDoc::getOutline() 是屬於poppler的函式,一呼叫就會傳回一個樹狀的結構,因此需要一個 traverser 或 iterator 來去把它遍歷以存取每個節點。這也是遞迴函式 static void fillToc(...) 在程式中的用途,去遍歷節點進行處理,當然它一個函式包含了遍歷的演算法和處理節點的邏輯,在模組化的方面作的還有點不夠,不過因為他是個demo,所以也就不要太強求了。 從函式庫的使用者觀點,我們現在要做的是
  1. 開啟檔案,得到 PDFDoc* ==> PDFDoc::PDFDoc(GooString *fileNameA,...)
  2. 呼叫 Outline *PDFDoc::getOutline()
  3. 拜訪( visit )  Outline * 資料結構
ps.
看到第6點"將main()函數改名"我突然想到,其實這些函式庫經常帶有一些demo,這些demo本身就會調用函式庫,所以提供了使用上的順序和方法的資訊…(這不就是demo應該要做的事嗎)。目前看到幾個主程式
  1. poppler-0.20.3\glib\demo\main.c
  2. poppler-0.20.3\qt4\demos\main_viewer.cpp 當中的 main() ,由其定義可知,整個程式乃是使用命令列的第一個參數作為所要打開的檔案名稱,並呼叫了 loadDocument 函數
  3. poppler-0.20.3\utils\pdftohtml.cc(178) 當中亦定義了main(),420行呼叫了 dumpDocOutline ,其定義在  HtmlOutputDev.cc ,而取得書籤的函數定義在 poppler-0.20.3\utils\HtmlOutputDev.cc(1684): Outline *outline = doc->getOutline(); 

其實如果懶得跟 pdf 週旋下去的話,直接把它 dump 成 html 來處理也是滿可行的。事實上ubuntu似乎預裝了 pdftohtml ,而測試的結果也證實,這樣一轉以後,所有的格式資訊都消失了…

python-poppler 及 ruby-poppler 都以套件的形式在apt的套件庫中存在。稍微看了一下是很久沒維護的樣子,可能是不需要,還是沒人?不知道…不過我有點可以理解,因為poppler的版本演進還滿快的,如果介面經常改變,那可能會令人失去追逐新版本的熱情。為了維持自身的穩定性,可能最好是抓個固定的版本編譯後給自己用,而不去使用系統預裝的版本。

要查ubuntu中安裝了那些套件,如poppler,可以下此命令
sudo dpkg --get-selections | grep poppler
結果會發現 libpoppler19 已經預裝了。以下命令可以查詢其資訊及位置
dpkg -s libpoppler19
dpkg -L libpoppler19

沒有留言:

張貼留言