2012年9月6日 星期四

PDF中的索引和書籤(三)

但是如果我們連ui都不要的話呢?如前所述我們追蹤到了 static void fillToc(...) ,但是它的參數都是QT的ui,而toc實際上是由這行

const QDomDocument *toc = document()->toc();

所取得的,其內容如下


    QDomDocument *Document::toc() const
    {
        Outline * outline = m_doc->doc->getOutline();
        if ( !outline )
            return NULL;

        GooList * items = outline->getItems();
        if ( !items || items->getLength() < 1 )
            return NULL;

        QDomDocument *toc = new QDomDocument();
        if ( items->getLength() > 0 )
           m_doc->addTocChildren( toc, toc, items );

        return toc;
    }


m_doc的型態為 DocumentData * ,宣告在 poppler-0.20.3\qt4\src\poppler-private.h(78) 。其 doc 成員宣告在 188行,型態為 PDFDoc * 。 PDFDoc::getOutline() 定義於 poppler-0.20.3\poppler\PDFDoc.cc(1466):


Outline *PDFDoc::getOutline()
{
  if (!outline) {
    // read outline
    outline = new Outline(catalog->getOutline(), xref);
  }

  return outline;
}


所以現在問題就是,1:catalog怎麼來的,2,xref又那來的,3,getOutline()做了什麼,前文說

從xref(p-67)中取得catalog(p-77),存入catDict,找出其中的 Outlines(96) 並回傳之

所以問題簡化為:1:xref怎來的,2:取catalog,3:取outlines

xref 的建構在 poppler-0.20.3\poppler\PDFDoc.cc(268):
   xref = new XRef(str, getStartXRef(), getMainXRefEntriesOffset(), &wasReconstructed);

這屬於248行的 GBool PDFDoc::setup(GooString *ownerPassword, GooString *userPassword) 的工作;而catalog也在282行被初始化。因此呼叫 Outline *PDFDoc::getOutline() 就是取得目錄的標準方式了。


沒有留言:

張貼留言