Index: fpdfsdk/src/fpdfview.cpp |
diff --git a/fpdfsdk/src/fpdfview.cpp b/fpdfsdk/src/fpdfview.cpp |
index d8ec8c676a077e53189adb8b6df247b61e36b2dc..c88c41d6a64c9078e2a77ca71717603c887279f1 100644 |
--- a/fpdfsdk/src/fpdfview.cpp |
+++ b/fpdfsdk/src/fpdfview.cpp |
@@ -788,6 +788,21 @@ 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; |
Tom Sepez
2015/01/01 01:10:08
nit: blank line here if you want to use one-line i
Bo Xu
2015/01/05 22:46:52
Done.
|
+ 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) |
@@ -799,3 +814,42 @@ DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document,FPDF_ |
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, std::string& name) |
+{ |
+ if (!document || index < 0) return NULL; |
+ CPDF_Document* pDoc = (CPDF_Document*)document; |
Tom Sepez
2015/01/01 01:10:08
nit: blank line.
Bo Xu
2015/01/05 22:46:52
Done.
|
+ CPDF_Dictionary* pRoot = pDoc->GetRoot(); |
+ if (!pRoot) return NULL; |
+ |
+ CPDF_Object* pDestObj = NULL; |
+ CFX_ByteString bsName; |
+ |
Tom Sepez
2015/01/01 01:10:08
nit: no blank line
Bo Xu
2015/01/05 22:46:52
Done.
|
+ 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; |
+ CFX_WideString wsName = PDF_DecodeText(bsName); |
+ CFX_ByteString utf16Name = wsName.UTF16LE_Encode(); |
+ name = utf16Name.c_str(); |
+ return (FPDF_DEST)pDestObj; |
+} |