Index: fpdfsdk/src/fpdfview.cpp |
diff --git a/fpdfsdk/src/fpdfview.cpp b/fpdfsdk/src/fpdfview.cpp |
index 653702382c6ea4389604a397503f3568f073b153..a97730a8d38457e484ab5e2062dc14ecd2e68cd1 100644 |
--- a/fpdfsdk/src/fpdfview.cpp |
+++ b/fpdfsdk/src/fpdfview.cpp |
@@ -789,14 +789,75 @@ DLLEXPORT FPDF_DUPLEXTYPE STDCALL FPDF_VIEWERREF_GetDuplex(FPDF_DOCUMENT documen |
return DuplexUndefined; |
} |
+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; |
+} |
+ |
DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document,FPDF_BYTESTRING name) |
{ |
- if (document == NULL) |
+ if (!document) |
return NULL; |
- if (name == NULL || name[0] == 0) |
+ if (!name || name[0] == 0) |
return NULL; |
CPDF_Document* pDoc = (CPDF_Document*)document; |
CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests")); |
return name_tree.LookupNamedDest(pDoc, name); |
} |
+ |
+DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDest(FPDF_DOCUMENT document, int index, char* name, unsigned int& len) |
+{ |
+ if (!name) |
+ len = 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->GetType() != PDFOBJ_ARRAY) return NULL; |
+ if (!name) { |
+ len = bsName.GetLength() + 1; |
+ } else { |
+ CFX_WideString wsName = PDF_DecodeText(bsName); |
Tom Sepez
2015/01/07 16:56:24
need to check that len was sufficient here to get
Bo Xu
2015/01/09 19:35:21
Return -1 if length not sufficient.
|
+ CFX_ByteString utf16Name = wsName.UTF16LE_Encode(); |
+ memcpy(name, utf16Name.c_str(), len-1); |
+ name[len-1] = '\0'; |
+ } |
+ return (FPDF_DEST)pDestObj; |
+} |