void DumpTocItem(BaseEngine *engine, DocTocItem *item, int level, int& idCounter) { for (; item; item = item->next) { ScopedMem<char> title(Escape(item->title, true)); for (int i = 0; i < level; i++) Out("\t"); Out("<Item Title=\"%s\"", title.Get()); if (item->pageNo) Out(" Page=\"%d\"", item->pageNo); if (item->id != ++idCounter) Out(" Id=\"%d\"", item->id); if (item->GetLink()) { PageDestination *dest = item->GetLink(); ScopedMem<char> target(Escape(dest->GetDestValue())); if (target) Out(" Target=\"%s\"", target.Get()); if (item->pageNo != dest->GetDestPageNo()) Out(" TargetPage=\"%d\"", dest->GetDestPageNo()); ScopedMem<char> rectStr(DestRectToStr(engine, dest)); if (rectStr) Out(" Target%s", rectStr.Get()); } if (!item->child) Out(" />\n"); else { if (item->open) Out(" Expanded=\"yes\""); Out(">\n"); DumpTocItem(engine, item->child, level + 1, idCounter); for (int i = 0; i < level; i++) Out("\t"); Out("</Item>\n"); } } }
void DumpPageContent(BaseEngine *engine, int pageNo, bool fullDump) { // ensure that the page is loaded engine->BenchLoadPage(pageNo); Out("\t<Page Number=\"%d\"\n", pageNo); if (engine->HasPageLabels()) { ScopedMem<char> label(Escape(engine->GetPageLabel(pageNo))); Out("\t\tLabel=\"%s\"\n", label.Get()); } RectI bbox = engine->PageMediabox(pageNo).Round(); Out("\t\tMediaBox=\"%d %d %d %d\"\n", bbox.x, bbox.y, bbox.dx, bbox.dy); RectI cbox = engine->PageContentBox(pageNo).Round(); if (cbox != bbox) Out("\t\tContentBox=\"%d %d %d %d\"\n", cbox.x, cbox.y, cbox.dx, cbox.dy); if (!engine->HasClipOptimizations(pageNo)) Out("\t\tHasClipOptimizations=\"no\"\n"); Out("\t>\n"); if (fullDump) { ScopedMem<char> text(Escape(engine->ExtractPageText(pageNo, L"\n"))); if (text) Out("\t\t<TextContent>\n%s\t\t</TextContent>\n", text.Get()); } Vec<PageElement *> *els = engine->GetElements(pageNo); if (els && els->Count() > 0) { Out("\t\t<PageElements>\n"); for (size_t i = 0; i < els->Count(); i++) { RectD rect = els->At(i)->GetRect(); Out("\t\t\t<Element Type=\"%s\"\n\t\t\t\tRect=\"%.0f %.0f %.0f %.0f\"\n", ElementTypeToStr(els->At(i)), rect.x, rect.y, rect.dx, rect.dy); PageDestination *dest = els->At(i)->AsLink(); if (dest) { if (dest->GetDestType() != Dest_None) Out("\t\t\t\tLinkType=\"%s\"\n", PageDestToStr(dest->GetDestType())); ScopedMem<char> value(Escape(dest->GetDestValue())); if (value) Out("\t\t\t\tLinkTarget=\"%s\"\n", value.Get()); if (dest->GetDestPageNo()) Out("\t\t\t\tLinkedPage=\"%d\"\n", dest->GetDestPageNo()); ScopedMem<char> rectStr(DestRectToStr(engine, dest)); if (rectStr) Out("\t\t\t\tLinked%s\n", rectStr.Get()); } ScopedMem<char> name(Escape(els->At(i)->GetValue())); if (name) Out("\t\t\t\tLabel=\"%s\"\n", name.Get()); Out("\t\t\t/>\n"); } Out("\t\t</PageElements>\n"); DeleteVecMembers(*els); } delete els; Out("\t</Page>\n"); }