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) 並回傳之
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() 就是取得目錄的標準方式了。
沒有留言:
張貼留言