diff --git a/fpdfsdk/fpdfdoc.cpp b/fpdfsdk/fpdfdoc.cpp
index 88ba246..befdc4d 100644
--- a/fpdfsdk/fpdfdoc.cpp
+++ b/fpdfsdk/fpdfdoc.cpp
@@ -62,14 +62,29 @@
 
 }  // namespace
 
+CPDF_Array* CPDFArrayFromDest(FPDF_DEST dest) {
+  return static_cast<CPDF_Array*>(dest);
+}
+
+CPDF_Dictionary* CPDFDictionaryFromFPDFAction(FPDF_ACTION action) {
+  return ToDictionary(static_cast<CPDF_Object*>(action));
+}
+
+CPDF_Dictionary* CPDFDictionaryFromFPDFBookmark(FPDF_BOOKMARK bookmark) {
+  return ToDictionary(static_cast<CPDF_Object*>(bookmark));
+}
+
+CPDF_Dictionary* CPDFDictionaryFromFPDFLink(FPDF_LINK link) {
+  return ToDictionary(static_cast<CPDF_Object*>(link));
+}
+
 FPDF_EXPORT FPDF_BOOKMARK FPDF_CALLCONV
 FPDFBookmark_GetFirstChild(FPDF_DOCUMENT document, FPDF_BOOKMARK pDict) {
   CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document);
   if (!pDoc)
     return nullptr;
   CPDF_BookmarkTree tree(pDoc);
-  CPDF_Bookmark bookmark =
-      CPDF_Bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict)));
+  CPDF_Bookmark bookmark(CPDFDictionaryFromFPDFBookmark(pDict));
   return tree.GetFirstChild(bookmark).GetDict();
 }
 
@@ -81,8 +96,7 @@
   if (!pDoc)
     return nullptr;
   CPDF_BookmarkTree tree(pDoc);
-  CPDF_Bookmark bookmark =
-      CPDF_Bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict)));
+  CPDF_Bookmark bookmark(CPDFDictionaryFromFPDFBookmark(pDict));
   return tree.GetNextSibling(bookmark).GetDict();
 }
 
@@ -90,7 +104,7 @@
 FPDFBookmark_GetTitle(FPDF_BOOKMARK pDict, void* buffer, unsigned long buflen) {
   if (!pDict)
     return 0;
-  CPDF_Bookmark bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict)));
+  CPDF_Bookmark bookmark(CPDFDictionaryFromFPDFBookmark(pDict));
   WideString title = bookmark.GetTitle();
   return Utf16EncodeMaybeCopyAndReturnLength(title, buffer, buflen);
 }
@@ -116,7 +130,7 @@
   CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document);
   if (!pDoc)
     return nullptr;
-  CPDF_Bookmark bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict)));
+  CPDF_Bookmark bookmark(CPDFDictionaryFromFPDFBookmark(pDict));
   CPDF_Dest dest = bookmark.GetDest(pDoc);
   if (dest.GetObject())
     return dest.GetObject();
@@ -132,7 +146,7 @@
 FPDFBookmark_GetAction(FPDF_BOOKMARK pDict) {
   if (!pDict)
     return nullptr;
-  CPDF_Bookmark bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict)));
+  CPDF_Bookmark bookmark(CPDFDictionaryFromFPDFBookmark(pDict));
   return bookmark.GetAction().GetDict();
 }
 
@@ -140,7 +154,7 @@
   if (!pDict)
     return PDFACTION_UNSUPPORTED;
 
-  CPDF_Action action(ToDictionary(static_cast<CPDF_Object*>(pDict)));
+  CPDF_Action action(CPDFDictionaryFromFPDFAction(pDict));
   CPDF_Action::ActionType type = action.GetType();
   switch (type) {
     case CPDF_Action::GoTo:
@@ -163,7 +177,7 @@
   CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document);
   if (!pDoc)
     return nullptr;
-  CPDF_Action action(ToDictionary(static_cast<CPDF_Object*>(pDict)));
+  CPDF_Action action(CPDFDictionaryFromFPDFAction(pDict));
   return action.GetDest(pDoc).GetObject();
 }
 
@@ -173,7 +187,7 @@
   if (type != PDFACTION_REMOTEGOTO && type != PDFACTION_LAUNCH)
     return 0;
 
-  CPDF_Action action(ToDictionary(static_cast<CPDF_Object*>(pDict)));
+  CPDF_Action action(CPDFDictionaryFromFPDFAction(pDict));
   ByteString path = action.GetFilePath().UTF8Encode();
   unsigned long len = path.GetLength() + 1;
   if (buffer && len <= buflen)
@@ -191,7 +205,7 @@
   CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document);
   if (!pDoc)
     return 0;
-  CPDF_Action action(ToDictionary(static_cast<CPDF_Object*>(pDict)));
+  CPDF_Action action(CPDFDictionaryFromFPDFAction(pDict));
   ByteString path = action.GetURI(pDoc);
   unsigned long len = path.GetLength() + 1;
   if (buffer && len <= buflen)
@@ -208,7 +222,7 @@
   if (!pDoc)
     return 0;
 
-  CPDF_Dest destination(static_cast<CPDF_Array*>(dest));
+  CPDF_Dest destination(CPDFArrayFromDest(dest));
   return destination.GetPageIndexDeprecated(pDoc);
 }
 
@@ -221,7 +235,7 @@
   if (!pDoc)
     return -1;
 
-  CPDF_Dest destination(static_cast<CPDF_Array*>(dest));
+  CPDF_Dest destination(CPDFArrayFromDest(dest));
   return destination.GetDestPageIndex(pDoc);
 }
 
@@ -234,13 +248,13 @@
     return 0;
   }
 
-  CPDF_Dest dest(static_cast<CPDF_Array*>(pDict));
-  unsigned long nParams = dest.GetNumParams();
+  CPDF_Dest destination(CPDFArrayFromDest(pDict));
+  unsigned long nParams = destination.GetNumParams();
   ASSERT(nParams <= 4);
   *pNumParams = nParams;
   for (unsigned long i = 0; i < nParams; ++i)
-    pParams[i] = dest.GetParam(i);
-  return dest.GetZoomMode();
+    pParams[i] = destination.GetParam(i);
+  return destination.GetZoomMode();
 }
 
 FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
@@ -254,7 +268,7 @@
   if (!pDict)
     return false;
 
-  auto dest = pdfium::MakeUnique<CPDF_Dest>(static_cast<CPDF_Object*>(pDict));
+  auto dest = pdfium::MakeUnique<CPDF_Dest>(CPDFArrayFromDest(pDict));
 
   // FPDF_BOOL is an int, GetXYZ expects bools.
   bool bHasX;
@@ -312,7 +326,7 @@
   CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document);
   if (!pDoc)
     return nullptr;
-  CPDF_Link link(ToDictionary(static_cast<CPDF_Object*>(pDict)));
+  CPDF_Link link(CPDFDictionaryFromFPDFLink(pDict));
   FPDF_DEST dest = link.GetDest(pDoc).GetObject();
   if (dest)
     return dest;
@@ -327,7 +341,7 @@
   if (!pDict)
     return nullptr;
 
-  CPDF_Link link(ToDictionary(static_cast<CPDF_Object*>(pDict)));
+  CPDF_Link link(CPDFDictionaryFromFPDFLink(pDict));
   return link.GetAction().GetDict();
 }
 
@@ -343,8 +357,7 @@
   if (!pAnnots)
     return false;
   for (size_t i = *start_pos; i < pAnnots->GetCount(); i++) {
-    CPDF_Dictionary* pDict =
-        ToDictionary(static_cast<CPDF_Object*>(pAnnots->GetDirectObjectAt(i)));
+    CPDF_Dictionary* pDict = ToDictionary(pAnnots->GetDirectObjectAt(i));
     if (!pDict)
       continue;
     if (pDict->GetStringFor("Subtype") == "Link") {
@@ -360,8 +373,7 @@
                                                           FS_RECTF* rect) {
   if (!link_annot || !rect)
     return false;
-  CPDF_Dictionary* pAnnotDict =
-      ToDictionary(static_cast<CPDF_Object*>(link_annot));
+  CPDF_Dictionary* pAnnotDict = CPDFDictionaryFromFPDFLink(link_annot);
   FSRECTFFromCFXFloatRect(pAnnotDict->GetRectFor("Rect"), rect);
   return true;
 }
@@ -369,8 +381,7 @@
 FPDF_EXPORT int FPDF_CALLCONV FPDFLink_CountQuadPoints(FPDF_LINK link_annot) {
   if (!link_annot)
     return 0;
-  CPDF_Dictionary* pAnnotDict =
-      ToDictionary(static_cast<CPDF_Object*>(link_annot));
+  CPDF_Dictionary* pAnnotDict = CPDFDictionaryFromFPDFLink(link_annot);
   CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
   if (!pArray)
     return 0;
@@ -383,8 +394,7 @@
                        FS_QUADPOINTSF* quad_points) {
   if (!link_annot || !quad_points)
     return false;
-  CPDF_Dictionary* pAnnotDict =
-      ToDictionary(static_cast<CPDF_Object*>(link_annot));
+  CPDF_Dictionary* pAnnotDict = CPDFDictionaryFromFPDFLink(link_annot);
   CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
   if (!pArray)
     return false;
diff --git a/fpdfsdk/fsdk_define.h b/fpdfsdk/fsdk_define.h
index 77c2315..d503ba5 100644
--- a/fpdfsdk/fsdk_define.h
+++ b/fpdfsdk/fsdk_define.h
@@ -75,6 +75,14 @@
 
 CFX_DIBitmap* CFXBitmapFromFPDFBitmap(FPDF_BITMAP bitmap);
 
+CPDF_Array* CPDFArrayFromDest(FPDF_DEST dest);
+
+CPDF_Dictionary* CPDFDictionaryFromFPDFAction(FPDF_ACTION action);
+
+CPDF_Dictionary* CPDFDictionaryFromFPDFBookmark(FPDF_BOOKMARK bookmark);
+
+CPDF_Dictionary* CPDFDictionaryFromFPDFLink(FPDF_LINK link);
+
 CFX_FloatRect CFXFloatRectFromFSRECTF(const FS_RECTF& rect);
 void FSRECTFFromCFXFloatRect(const CFX_FloatRect& rect, FS_RECTF* out_rect);
 
