2012年9月4日 星期二

PDF中的索引和書籤(一)

在WIN7用adobe reader時,並不怎麼注意索引和書籤的分別;但是在ubuntu上發現可以自訂書籤,卻無法自訂索引後,回頭才發現WIN7不能自訂書籤,要在adobe acrobat上才可以(http://blog.yam.com/ebag/article/32389172)。這把我搞得一頭霧水啊…

由 http://blog.csdn.net/q465162770/article/details/5802151 該文初步可知,“/Type”中除了有“/Catalog(index 目录对象)”外,还有“/Outlines(bookmarks 书签大纲对象)”、“/Pages (页面组对象)”

再查 Portable Document Format Reference Manual (v 1.2) 看看,outline在94頁,catalog在75頁,還是不大懂啊…

http://ftp.gnome.org/pub/GNOME/sources/evince/3.5/?C=S;O=A
evince是ubuntu上開源的pdf viewer,抓下來看看源碼,發現在 ./po/zh_TW.po 裏有語言的轉換,看來開檔的動作主要在函式 ev_window_open_uri 當中執行,索引側欄定義在 ev-sidebar-links.c 中,bookmark側欄定義在 ev-sidebar-bookmarks.c 中,

由函式中稱為metadata的資料似乎對應到bookmarks來看,metadata應該是存在本機某個資料夾的資料,因此bookmarks並不是直接存到pdf檔中。

函式 ev_job_load_new 依序被呼叫。EV_TYPE_SIDEBAR_PAGE 是側欄的父類別,衍生出來的類別會以下列敘述宣告
./shell/ev-sidebar-attachments.c:                        G_IMPLEMENT_INTERFACE (EV_TYPE_SIDEBAR_PAGE,
./shell/ev-sidebar-layers.c:                        G_IMPLEMENT_INTERFACE (EV_TYPE_SIDEBAR_PAGE,
./shell/ev-sidebar-links.c:                        G_IMPLEMENT_INTERFACE (EV_TYPE_SIDEBAR_PAGE,
./shell/ev-sidebar-annotations.c:                        G_IMPLEMENT_INTERFACE (EV_TYPE_SIDEBAR_PAGE,
./shell/ev-sidebar-bookmarks.c:                        G_IMPLEMENT_INTERFACE (EV_TYPE_SIDEBAR_PAGE,
./shell/ev-sidebar-thumbnails.c:                        G_IMPLEMENT_INTERFACE (EV_TYPE_SIDEBAR_PAGE,

_EvDocumentLinksInterface 是做為 virtual table, 模擬 c++ virtual functions. In ev-poppler.cc:

iface->get_links = pdf_document_links_get_links;

是實際填上這個vtbl的地方,此函數中呼叫 poppler_page_get_link_mapping 來取得 mapping_list ,然後此函數離開了evince 的部分,進入 poppler 函式庫。

剛好在這時發現,poppler下的glib/demo目錄似乎有範例程式,且其中的links.c亦呼叫了 poppler_page_get_link_mapping ,似乎可以好好研究一下。又在ubuntu下建立的書籤,到底是存在那呢?應該比較修改前後PDF檔的大小即可判斷。比較結果確定書籤是存在其它地方,而ubuntu上顯示為“索引”的資料在WIN7則顯示為“書籤”。總之這又是一個命名不一致而產生的誤會。

沒有留言:

張貼留言