DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDest(FPDF_DOCUMENT document, int index, void* buffer, long* buflen) { if (!buffer) *buflen = 0; if (!document || index < 0) return NULL; CPDF_Document* pDoc = (CPDF_Document*)document; CPDF_Dictionary* pRoot = pDoc->GetRoot(); if (!pRoot) return NULL; CPDF_Object* pDestObj = NULL; CFX_ByteString bsName; CPDF_NameTree nameTree(pDoc, FX_BSTRC("Dests")); int count = nameTree.GetCount(); if (index >= count) { CPDF_Dictionary* pDest = pRoot->GetDict(FX_BSTRC("Dests")); if (!pDest) return NULL; if (index >= count + pDest->GetCount()) return NULL; index -= count; FX_POSITION pos = pDest->GetStartPos(); int i = 0; while (pos) { pDestObj = pDest->GetNextElement(pos, bsName); if (!pDestObj) continue; if (i == index) break; i++; } } else { pDestObj = nameTree.LookupValue(index, bsName); } if (!pDestObj) return NULL; if (pDestObj->GetType() == PDFOBJ_DICTIONARY) { pDestObj = ((CPDF_Dictionary*)pDestObj)->GetArray(FX_BSTRC("D")); if (!pDestObj) return NULL; } if (pDestObj->GetType() != PDFOBJ_ARRAY) return NULL; CFX_WideString wsName = PDF_DecodeText(bsName); CFX_ByteString utf16Name = wsName.UTF16LE_Encode(); unsigned int len = utf16Name.GetLength(); if (!buffer) { *buflen = len; } else if (*buflen >= len) { memcpy(buffer, utf16Name.c_str(), len); *buflen = len; } else { *buflen = -1; } return (FPDF_DEST)pDestObj; }
DLLEXPORT FPDF_DWORD STDCALL FPDF_CountNamedDests(FPDF_DOCUMENT document) { if (!document) return 0; CPDF_Document* pDoc = (CPDF_Document*)document; CPDF_Dictionary* pRoot = pDoc->GetRoot(); if (!pRoot) return 0; CPDF_NameTree nameTree(pDoc, FX_BSTRC("Dests")); int count = nameTree.GetCount(); CPDF_Dictionary* pDest = pRoot->GetDict(FX_BSTRC("Dests")); if (pDest) count += pDest->GetCount(); return count; }