Introduce CPDF_Document::{Page,Render}DataIface interfaces.

Another step closer to separating the Page, Render, and Parser
layers.  Allows the document to manage objects about which it
otherwise need not have much knowledge.

Change-Id: Icf105c7fda61d0427ca319160a5763155ff1b2aa
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/55670
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
index 2ccd0c9..7eb1012 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
@@ -345,8 +345,8 @@
 
   ByteString name = RealizeResource(pStream, "XObject");
   if (bWasInline) {
-    pImageObj->SetImage(
-        m_pDocument->GetPageData()->GetImage(pStream->GetObjNum()));
+    auto* pPageData = CPDF_DocPageData::FromDocument(m_pDocument.Get());
+    pImageObj->SetImage(pPageData->GetImage(pStream->GetObjNum()));
   }
 
   *buf << "/" << PDF_NameEncode(name) << " Do Q\n";
diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp
index 789656c..af712af 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp
@@ -318,7 +318,8 @@
     pDict->SetNewFor<CPDF_Reference>("FontDescriptor", pDoc.get(),
                                      pDesc->GetObjNum());
 
-    CPDF_Font* loadedFont = pDoc->GetPageData()->GetFont(pDict);
+    CPDF_Font* loadedFont =
+        CPDF_DocPageData::FromDocument(pDoc.get())->GetFont(pDict);
     pTextObj->m_TextState.SetFont(loadedFont);
     pTextObj->m_TextState.SetFontSize(15.5f);
     pTextObj->SetText("I am indirect");
diff --git a/core/fpdfapi/font/cpdf_font.cpp b/core/fpdfapi/font/cpdf_font.cpp
index fa68614..3bcc522 100644
--- a/core/fpdfapi/font/cpdf_font.cpp
+++ b/core/fpdfapi/font/cpdf_font.cpp
@@ -53,7 +53,7 @@
 
 CPDF_Font::~CPDF_Font() {
   if (m_pFontFile) {
-    auto* pPageData = m_pDocument->GetPageData();
+    auto* pPageData = CPDF_DocPageData::FromDocument(m_pDocument.Get());
     if (pPageData) {
       pPageData->MaybePurgeFontFileStreamAcc(
           m_pFontFile->GetStream()->AsStream());
@@ -209,13 +209,13 @@
   if (!pFontFile)
     return;
 
-  m_pFontFile = m_pDocument->LoadFontFile(pFontFile);
+  auto* pData = CPDF_DocPageData::FromDocument(m_pDocument.Get());
+  m_pFontFile = pData->GetFontFileStreamAcc(pFontFile);
   if (!m_pFontFile)
     return;
 
   if (!m_Font.LoadEmbedded(m_pFontFile->GetSpan())) {
-    m_pDocument->GetPageData()->MaybePurgeFontFileStreamAcc(
-        m_pFontFile->GetStream()->AsStream());
+    pData->MaybePurgeFontFileStreamAcc(m_pFontFile->GetStream()->AsStream());
     m_pFontFile = nullptr;
   }
 }
diff --git a/core/fpdfapi/page/cpdf_color.cpp b/core/fpdfapi/page/cpdf_color.cpp
index 6fbfae4..96804dc 100644
--- a/core/fpdfapi/page/cpdf_color.cpp
+++ b/core/fpdfapi/page/cpdf_color.cpp
@@ -35,7 +35,7 @@
     CPDF_Pattern* pPattern =
         pvalue->m_pCountedPattern ? pvalue->m_pCountedPattern->get() : nullptr;
     if (pPattern) {
-      CPDF_DocPageData* pPageData = pPattern->document()->GetPageData();
+      auto* pPageData = CPDF_DocPageData::FromDocument(pPattern->document());
       if (pPageData)
         pPageData->ReleasePattern(pPattern->pattern_obj());
     }
@@ -85,7 +85,8 @@
   CPDF_DocPageData* pDocPageData = nullptr;
   PatternValue* pvalue = reinterpret_cast<PatternValue*>(m_pBuffer);
   if (pvalue->m_pPattern) {
-    pDocPageData = pvalue->m_pPattern->document()->GetPageData();
+    pDocPageData =
+        CPDF_DocPageData::FromDocument(pvalue->m_pPattern->document());
     pDocPageData->ReleasePattern(pvalue->m_pPattern->pattern_obj());
   }
   pvalue->m_nComps = values.size();
@@ -96,7 +97,7 @@
   pvalue->m_pCountedPattern = nullptr;
   if (pPattern) {
     if (!pDocPageData)
-      pDocPageData = pPattern->document()->GetPageData();
+      pDocPageData = CPDF_DocPageData::FromDocument(pPattern->document());
 
     pvalue->m_pCountedPattern =
         pDocPageData->FindPatternPtr(pPattern->pattern_obj());
@@ -115,7 +116,7 @@
   CPDF_Document* pDoc = m_pCS->GetDocument();
   const CPDF_Array* pArray = m_pCS->GetArray();
   if (pDoc && pArray) {
-    m_pCS = pDoc->GetPageData()->GetCopiedColorSpace(pArray);
+    m_pCS = CPDF_DocPageData::FromDocument(pDoc)->GetCopiedColorSpace(pArray);
     if (!m_pCS)
       return *this;
   }
@@ -129,8 +130,9 @@
   if (!pPattern)
     return *this;
 
-  pValue->m_pPattern = pPattern->document()->GetPageData()->GetPattern(
-      pPattern->pattern_obj(), false, pPattern->parent_matrix());
+  pValue->m_pPattern = CPDF_DocPageData::FromDocument(pPattern->document())
+                           ->GetPattern(pPattern->pattern_obj(), false,
+                                        pPattern->parent_matrix());
 
   return *this;
 }
diff --git a/core/fpdfapi/page/cpdf_colorspace.cpp b/core/fpdfapi/page/cpdf_colorspace.cpp
index dcfd59d..a1497bd 100644
--- a/core/fpdfapi/page/cpdf_colorspace.cpp
+++ b/core/fpdfapi/page/cpdf_colorspace.cpp
@@ -854,7 +854,7 @@
   if (m_pProfile && m_pDocument) {
     const CPDF_Stream* pStream = m_pProfile->GetStream();
     m_pProfile.Reset();  // Give up our reference first.
-    auto* pPageData = m_pDocument->GetPageData();
+    auto* pPageData = CPDF_DocPageData::FromDocument(m_pDocument.Get());
     if (pPageData)
       pPageData->MaybePurgeIccProfile(pStream);
   }
@@ -876,7 +876,7 @@
     return 0;
 
   uint32_t nComponents = static_cast<uint32_t>(nDictComponents);
-  m_pProfile = pDoc->GetPageData()->GetIccProfile(pStream);
+  m_pProfile = CPDF_DocPageData::FromDocument(pDoc)->GetIccProfile(pStream);
   if (!m_pProfile)
     return 0;
 
@@ -1090,7 +1090,7 @@
   if (pBaseObj == m_pArray)
     return 0;
 
-  CPDF_DocPageData* pDocPageData = pDoc->GetPageData();
+  auto* pDocPageData = CPDF_DocPageData::FromDocument(pDoc);
   m_pBaseCS = pDocPageData->GetColorSpaceGuarded(pBaseObj, nullptr, pVisited);
   if (!m_pBaseCS)
     return 0;
diff --git a/core/fpdfapi/page/cpdf_docpagedata.cpp b/core/fpdfapi/page/cpdf_docpagedata.cpp
index eb67fe1..8fe9250 100644
--- a/core/fpdfapi/page/cpdf_docpagedata.cpp
+++ b/core/fpdfapi/page/cpdf_docpagedata.cpp
@@ -23,7 +23,6 @@
 #include "core/fpdfapi/page/cpdf_tilingpattern.h"
 #include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
-#include "core/fpdfapi/parser/cpdf_document.h"
 #include "core/fpdfapi/parser/cpdf_name.h"
 #include "core/fpdfapi/parser/cpdf_number.h"
 #include "core/fpdfapi/parser/cpdf_reference.h"
@@ -157,11 +156,13 @@
 
 }  // namespace
 
-CPDF_DocPageData::CPDF_DocPageData(CPDF_Document* pPDFDoc)
-    : m_bForceClear(false), m_pPDFDoc(pPDFDoc) {
-  ASSERT(m_pPDFDoc);
+// static
+CPDF_DocPageData* CPDF_DocPageData::FromDocument(const CPDF_Document* pDoc) {
+  return static_cast<CPDF_DocPageData*>(pDoc->GetPageData());
 }
 
+CPDF_DocPageData::CPDF_DocPageData() = default;
+
 CPDF_DocPageData::~CPDF_DocPageData() {
   Clear(false);
   Clear(true);
@@ -249,7 +250,7 @@
     }
   }
   std::unique_ptr<CPDF_Font> pFont =
-      CPDF_Font::Create(m_pPDFDoc.Get(), pFontDict);
+      CPDF_Font::Create(GetDocument(), pFontDict);
   if (!pFont)
     return nullptr;
 
@@ -289,16 +290,16 @@
     return fontData->AddRef();
   }
 
-  CPDF_Dictionary* pDict = m_pPDFDoc->NewIndirect<CPDF_Dictionary>();
+  CPDF_Dictionary* pDict = GetDocument()->NewIndirect<CPDF_Dictionary>();
   pDict->SetNewFor<CPDF_Name>("Type", "Font");
   pDict->SetNewFor<CPDF_Name>("Subtype", "Type1");
   pDict->SetNewFor<CPDF_Name>("BaseFont", fontName);
   if (pEncoding) {
     pDict->SetFor("Encoding",
-                  pEncoding->Realize(m_pPDFDoc->GetByteStringPool()));
+                  pEncoding->Realize(GetDocument()->GetByteStringPool()));
   }
 
-  std::unique_ptr<CPDF_Font> pFont = CPDF_Font::Create(m_pPDFDoc.Get(), pDict);
+  std::unique_ptr<CPDF_Font> pFont = CPDF_Font::Create(GetDocument(), pDict);
   if (!pFont)
     return nullptr;
 
@@ -406,7 +407,7 @@
     return pdfium::WrapRetain(it->second.Get());
 
   RetainPtr<CPDF_ColorSpace> pCS =
-      CPDF_ColorSpace::Load(m_pPDFDoc.Get(), pArray, pVisited);
+      CPDF_ColorSpace::Load(GetDocument(), pArray, pVisited);
   if (!pCS)
     return nullptr;
 
@@ -443,7 +444,7 @@
   std::unique_ptr<CPDF_Pattern> pPattern;
   if (bShading) {
     pPattern = pdfium::MakeUnique<CPDF_ShadingPattern>(
-        m_pPDFDoc.Get(), pPatternObj, true, matrix);
+        GetDocument(), pPatternObj, true, matrix);
   } else {
     CPDF_Dictionary* pDict = pPatternObj->GetDict();
     if (!pDict)
@@ -451,11 +452,11 @@
 
     int type = pDict->GetIntegerFor("PatternType");
     if (type == CPDF_Pattern::kTiling) {
-      pPattern = pdfium::MakeUnique<CPDF_TilingPattern>(m_pPDFDoc.Get(),
+      pPattern = pdfium::MakeUnique<CPDF_TilingPattern>(GetDocument(),
                                                         pPatternObj, matrix);
     } else if (type == CPDF_Pattern::kShading) {
       pPattern = pdfium::MakeUnique<CPDF_ShadingPattern>(
-          m_pPDFDoc.Get(), pPatternObj, false, matrix);
+          GetDocument(), pPatternObj, false, matrix);
     } else {
       return nullptr;
     }
@@ -496,7 +497,7 @@
   if (it != m_ImageMap.end())
     return it->second;
 
-  auto pImage = pdfium::MakeRetain<CPDF_Image>(m_pPDFDoc.Get(), dwStreamObjNum);
+  auto pImage = pdfium::MakeRetain<CPDF_Image>(GetDocument(), dwStreamObjNum);
   m_ImageMap[dwStreamObjNum] = pImage;
   return pImage;
 }
@@ -620,7 +621,7 @@
       CalculateFlags(pFont->IsBold(), pFont->IsItalic(), pFont->IsFixedWidth(),
                      false, false, charset == FX_CHARSET_Symbol);
 
-  CPDF_Dictionary* pBaseDict = m_pPDFDoc->NewIndirect<CPDF_Dictionary>();
+  CPDF_Dictionary* pBaseDict = GetDocument()->NewIndirect<CPDF_Dictionary>();
   pBaseDict->SetNewFor<CPDF_Name>("Type", "Font");
   auto pEncoding = pdfium::MakeUnique<CFX_UnicodeEncoding>(pFont);
   CPDF_Dictionary* pFontDict = pBaseDict;
@@ -684,10 +685,10 @@
     }
   }
   CPDF_Dictionary* pFontDesc =
-      ToDictionary(m_pPDFDoc->AddIndirectObject(CalculateFontDesc(
-          m_pPDFDoc.Get(), basefont, flags, italicangle, pFont->GetAscent(),
+      ToDictionary(GetDocument()->AddIndirectObject(CalculateFontDesc(
+          GetDocument(), basefont, flags, italicangle, pFont->GetAscent(),
           pFont->GetDescent(), std::move(pBBox), nStemV)));
-  pFontDict->SetNewFor<CPDF_Reference>("FontDescriptor", m_pPDFDoc.Get(),
+  pFontDict->SetNewFor<CPDF_Reference>("FontDescriptor", GetDocument(),
                                        pFontDesc->GetObjNum());
   return GetFont(pBaseDict);
 }
@@ -732,7 +733,7 @@
                  ptm->otmrcFontBox.right, ptm->otmrcFontBox.top};
   FX_Free(tm_buf);
   basefont.Replace(" ", "");
-  CPDF_Dictionary* pBaseDict = m_pPDFDoc->NewIndirect<CPDF_Dictionary>();
+  CPDF_Dictionary* pBaseDict = GetDocument()->NewIndirect<CPDF_Dictionary>();
   pBaseDict->SetNewFor<CPDF_Name>("Type", "Font");
   CPDF_Dictionary* pFontDict = pBaseDict;
   if (!bCJK) {
@@ -761,12 +762,13 @@
   for (int i = 0; i < 4; i++)
     pBBox->AddNew<CPDF_Number>(bbox[i]);
   RetainPtr<CPDF_Dictionary> pFontDesc =
-      CalculateFontDesc(m_pPDFDoc.Get(), basefont, flags, italicangle, ascend,
+      CalculateFontDesc(GetDocument(), basefont, flags, italicangle, ascend,
                         descend, std::move(pBBox), pLogFont->lfWeight / 5);
   pFontDesc->SetNewFor<CPDF_Number>("CapHeight", capheight);
   pFontDict->SetFor("FontDescriptor",
-                    m_pPDFDoc->AddIndirectObject(std::move(pFontDesc))
-                        ->MakeReference(m_pPDFDoc.Get()));
+                    GetDocument()
+                        ->AddIndirectObject(std::move(pFontDesc))
+                        ->MakeReference(GetDocument()));
   hFont = SelectObject(hDC, hFont);
   DeleteObject(hFont);
   DeleteDC(hDC);
@@ -784,7 +786,8 @@
   if (i == FX_ArraySize(g_FX_CharsetUnicodes))
     return i;
 
-  CPDF_Dictionary* pEncodingDict = m_pPDFDoc->NewIndirect<CPDF_Dictionary>();
+  CPDF_Dictionary* pEncodingDict =
+      GetDocument()->NewIndirect<CPDF_Dictionary>();
   pEncodingDict->SetNewFor<CPDF_Name>("BaseEncoding", "WinAnsiEncoding");
 
   CPDF_Array* pArray = pEncodingDict->SetNewFor<CPDF_Array>("Differences");
@@ -795,7 +798,7 @@
     ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);
     pArray->AddNew<CPDF_Name>(name.IsEmpty() ? ".notdef" : name);
   }
-  pBaseDict->SetNewFor<CPDF_Reference>("Encoding", m_pPDFDoc.Get(),
+  pBaseDict->SetNewFor<CPDF_Reference>("Encoding", GetDocument(),
                                        pEncodingDict->GetObjNum());
   return i;
 }
@@ -805,7 +808,7 @@
     int charset,
     ByteString basefont,
     std::function<void(wchar_t, wchar_t, CPDF_Array*)> Insert) {
-  CPDF_Dictionary* pFontDict = m_pPDFDoc->NewIndirect<CPDF_Dictionary>();
+  CPDF_Dictionary* pFontDict = GetDocument()->NewIndirect<CPDF_Dictionary>();
   ByteString cmap;
   ByteString ordering;
   int supplement = 0;
@@ -862,6 +865,6 @@
   pCIDSysInfo->SetNewFor<CPDF_Number>("Supplement", supplement);
 
   CPDF_Array* pArray = pBaseDict->SetNewFor<CPDF_Array>("DescendantFonts");
-  pArray->AddNew<CPDF_Reference>(m_pPDFDoc.Get(), pFontDict->GetObjNum());
+  pArray->AddNew<CPDF_Reference>(GetDocument(), pFontDict->GetObjNum());
   return pFontDict;
 }
diff --git a/core/fpdfapi/page/cpdf_docpagedata.h b/core/fpdfapi/page/cpdf_docpagedata.h
index ff4b88b..674aa1f 100644
--- a/core/fpdfapi/page/cpdf_docpagedata.h
+++ b/core/fpdfapi/page/cpdf_docpagedata.h
@@ -11,6 +11,7 @@
 #include <set>
 
 #include "core/fpdfapi/page/cpdf_colorspace.h"
+#include "core/fpdfapi/parser/cpdf_document.h"
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_string.h"
 #include "core/fxcrt/retain_ptr.h"
@@ -18,7 +19,6 @@
 
 class CFX_Font;
 class CPDF_Dictionary;
-class CPDF_Document;
 class CPDF_Font;
 class CPDF_FontEncoding;
 class CPDF_IccProfile;
@@ -28,10 +28,12 @@
 class CPDF_Stream;
 class CPDF_StreamAcc;
 
-class CPDF_DocPageData {
+class CPDF_DocPageData : public CPDF_Document::PageDataIface {
  public:
-  explicit CPDF_DocPageData(CPDF_Document* pPDFDoc);
-  ~CPDF_DocPageData();
+  static CPDF_DocPageData* FromDocument(const CPDF_Document* pDoc);
+
+  CPDF_DocPageData();
+  ~CPDF_DocPageData() override;
 
   void Clear(bool bRelease);
   bool IsForceClear() const { return m_bForceClear; }
@@ -101,8 +103,7 @@
       ByteString basefont,
       std::function<void(wchar_t, wchar_t, CPDF_Array*)> Insert);
 
-  bool m_bForceClear;
-  UnownedPtr<CPDF_Document> const m_pPDFDoc;
+  bool m_bForceClear = false;
   std::map<ByteString, const CPDF_Stream*> m_HashProfileMap;
   std::map<const CPDF_Object*, CPDF_ColorSpace::ObservedPtr> m_ColorSpaceMap;
   std::map<const CPDF_Stream*, RetainPtr<CPDF_StreamAcc>> m_FontFileMap;
diff --git a/core/fpdfapi/page/cpdf_generalstate.cpp b/core/fpdfapi/page/cpdf_generalstate.cpp
index 7b9ea36..8d3bb7e 100644
--- a/core/fpdfapi/page/cpdf_generalstate.cpp
+++ b/core/fpdfapi/page/cpdf_generalstate.cpp
@@ -284,8 +284,8 @@
   m_SMaskMatrix = that.m_SMaskMatrix;
 
   if (that.m_pTransferFunc && that.m_pTransferFunc->GetDocument()) {
-    CPDF_DocRenderData* pDocCache =
-        that.m_pTransferFunc->GetDocument()->GetRenderData();
+    auto* pDocCache =
+        CPDF_DocRenderData::FromDocument(that.m_pTransferFunc->GetDocument());
     if (pDocCache)
       m_pTransferFunc = pDocCache->GetTransferFunc(m_pTR.Get());
   }
@@ -293,8 +293,8 @@
 
 CPDF_GeneralState::StateData::~StateData() {
   if (m_pTransferFunc && m_pTransferFunc->GetDocument()) {
-    CPDF_DocRenderData* pDocCache =
-        m_pTransferFunc->GetDocument()->GetRenderData();
+    auto* pDocCache =
+        CPDF_DocRenderData::FromDocument(m_pTransferFunc->GetDocument());
     if (pDocCache) {
       m_pTransferFunc.Reset();  // Give up our reference first.
       pDocCache->MaybePurgeTransferFunc(m_pTR.Get());
diff --git a/core/fpdfapi/page/cpdf_imageobject.cpp b/core/fpdfapi/page/cpdf_imageobject.cpp
index 2e98afc..ed12465 100644
--- a/core/fpdfapi/page/cpdf_imageobject.cpp
+++ b/core/fpdfapi/page/cpdf_imageobject.cpp
@@ -58,7 +58,7 @@
   if (!m_pImage)
     return;
 
-  CPDF_DocPageData* pPageData = m_pImage->GetDocument()->GetPageData();
+  auto* pPageData = CPDF_DocPageData::FromDocument(m_pImage->GetDocument());
   if (!pPageData)
     return;
 
diff --git a/core/fpdfapi/page/cpdf_patterncs.cpp b/core/fpdfapi/page/cpdf_patterncs.cpp
index 312c9e9..cd8a921 100644
--- a/core/fpdfapi/page/cpdf_patterncs.cpp
+++ b/core/fpdfapi/page/cpdf_patterncs.cpp
@@ -26,7 +26,7 @@
   if (pBaseCS == m_pArray)
     return 0;
 
-  CPDF_DocPageData* pDocPageData = pDoc->GetPageData();
+  auto* pDocPageData = CPDF_DocPageData::FromDocument(pDoc);
   m_pBaseCS = pDocPageData->GetColorSpaceGuarded(pBaseCS, nullptr, pVisited);
   if (!m_pBaseCS)
     return 1;
diff --git a/core/fpdfapi/page/cpdf_shadingpattern.cpp b/core/fpdfapi/page/cpdf_shadingpattern.cpp
index b2d3957..f3da1ac 100644
--- a/core/fpdfapi/page/cpdf_shadingpattern.cpp
+++ b/core/fpdfapi/page/cpdf_shadingpattern.cpp
@@ -71,7 +71,7 @@
   if (!pCSObj)
     return false;
 
-  CPDF_DocPageData* pDocPageData = document()->GetPageData();
+  auto* pDocPageData = CPDF_DocPageData::FromDocument(document());
   m_pCS = pDocPageData->GetColorSpace(pCSObj, nullptr);
 
   // The color space is required and cannot be a Pattern space, according to the
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 9d6f5c4..b3f36af 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -807,13 +807,16 @@
       pdfium::MakeUnique<CPDF_ImageObject>(GetCurrentStreamIndex());
   pImageObj->SetImage(
       pdfium::MakeRetain<CPDF_Image>(m_pDocument.Get(), std::move(pStream)));
+
   return AddImageObject(std::move(pImageObj));
 }
 
 CPDF_ImageObject* CPDF_StreamContentParser::AddImage(uint32_t streamObjNum) {
   auto pImageObj =
       pdfium::MakeUnique<CPDF_ImageObject>(GetCurrentStreamIndex());
-  pImageObj->SetImage(m_pDocument->GetPageData()->GetImage(streamObjNum));
+  pImageObj->SetImage(CPDF_DocPageData::FromDocument(m_pDocument.Get())
+                          ->GetImage(streamObjNum));
+
   return AddImageObject(std::move(pImageObj));
 }
 
@@ -824,8 +827,8 @@
 
   auto pImageObj =
       pdfium::MakeUnique<CPDF_ImageObject>(GetCurrentStreamIndex());
-  pImageObj->SetImage(
-      m_pDocument->GetPageData()->GetImage(pImage->GetStream()->GetObjNum()));
+  pImageObj->SetImage(CPDF_DocPageData::FromDocument(m_pDocument.Get())
+                          ->GetImage(pImage->GetStream()->GetObjNum()));
 
   return AddImageObject(std::move(pImageObj));
 }
@@ -1159,8 +1162,8 @@
     return CPDF_Font::GetStockFont(m_pDocument.Get(),
                                    CFX_Font::kDefaultAnsiFontName);
   }
-
-  CPDF_Font* pFont = m_pDocument->GetPageData()->GetFont(pFontDict);
+  CPDF_Font* pFont =
+      CPDF_DocPageData::FromDocument(m_pDocument.Get())->GetFont(pFontDict);
   if (pFont && pFont->IsType3Font()) {
     pFont->AsType3Font()->SetPageResources(m_pResources.Get());
     pFont->AsType3Font()->CheckType3FontMetrics();
@@ -1186,14 +1189,16 @@
 
       return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
     }
-    return m_pDocument->GetPageData()->GetColorSpace(pDefObj, nullptr);
+    return CPDF_DocPageData::FromDocument(m_pDocument.Get())
+        ->GetColorSpace(pDefObj, nullptr);
   }
   const CPDF_Object* pCSObj = FindResourceObj("ColorSpace", name);
   if (!pCSObj) {
     m_bResourceMissing = true;
     return nullptr;
   }
-  return m_pDocument->GetPageData()->GetColorSpace(pCSObj, nullptr);
+  return CPDF_DocPageData::FromDocument(m_pDocument.Get())
+      ->GetColorSpace(pCSObj, nullptr);
 }
 
 CPDF_Pattern* CPDF_StreamContentParser::FindPattern(const ByteString& name,
@@ -1204,8 +1209,8 @@
     m_bResourceMissing = true;
     return nullptr;
   }
-  return m_pDocument->GetPageData()->GetPattern(pPattern, bShading,
-                                                m_pCurStates->m_ParentMatrix);
+  return CPDF_DocPageData::FromDocument(m_pDocument.Get())
+      ->GetPattern(pPattern, bShading, m_pCurStates->m_ParentMatrix);
 }
 
 void CPDF_StreamContentParser::AddTextObject(const ByteString* pStrs,
diff --git a/core/fpdfapi/page/cpdf_streamparser.cpp b/core/fpdfapi/page/cpdf_streamparser.cpp
index a949a44..590020a 100644
--- a/core/fpdfapi/page/cpdf_streamparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamparser.cpp
@@ -156,7 +156,7 @@
   uint32_t nComponents = 1;
   if (pCSObj) {
     RetainPtr<CPDF_ColorSpace> pCS =
-        pDoc->GetPageData()->GetColorSpace(pCSObj, nullptr);
+        CPDF_DocPageData::FromDocument(pDoc)->GetColorSpace(pCSObj, nullptr);
     nComponents = pCS ? pCS->CountComponents() : 3;
     bpc = pDict->GetIntegerFor("BitsPerComponent");
   }
diff --git a/core/fpdfapi/page/cpdf_textstate.cpp b/core/fpdfapi/page/cpdf_textstate.cpp
index bd236a2..2810659 100644
--- a/core/fpdfapi/page/cpdf_textstate.cpp
+++ b/core/fpdfapi/page/cpdf_textstate.cpp
@@ -115,8 +115,10 @@
   for (int i = 0; i < 4; ++i)
     m_CTM[i] = that.m_CTM[i];
 
-  if (m_pDocument && m_pFont)
-    m_pFont = m_pDocument->GetPageData()->GetFont(m_pFont->GetFontDict());
+  if (m_pDocument && m_pFont) {
+    auto* pPageData = CPDF_DocPageData::FromDocument(m_pDocument.Get());
+    m_pFont = pPageData->GetFont(m_pFont->GetFontDict());
+  }
 }
 
 CPDF_TextState::TextData::~TextData() {
@@ -149,7 +151,7 @@
   if (!m_pDocument || !m_pFont)
     return;
 
-  CPDF_DocPageData* pPageData = m_pDocument->GetPageData();
+  auto* pPageData = CPDF_DocPageData::FromDocument(m_pDocument.Get());
   if (pPageData && !pPageData->IsForceClear())
     pPageData->ReleaseFont(m_pFont->GetFontDict());
 }
diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp
index 5b0314d..3200884 100644
--- a/core/fpdfapi/parser/cpdf_document.cpp
+++ b/core/fpdfapi/parser/cpdf_document.cpp
@@ -66,9 +66,12 @@
 }  // namespace
 
 CPDF_Document::CPDF_Document()
-    : m_pDocRender(pdfium::MakeUnique<CPDF_DocRenderData>(this)),
-      m_pDocPage(pdfium::MakeUnique<CPDF_DocPageData>(this)),
-      m_StockFontClearer(this) {}
+    : m_pDocRender(pdfium::MakeUnique<CPDF_DocRenderData>()),
+      m_pDocPage(pdfium::MakeUnique<CPDF_DocPageData>()),
+      m_StockFontClearer(this) {
+  m_pDocRender->SetDocument(this);
+  m_pDocPage->SetDocument(this);
+}
 
 CPDF_Document::~CPDF_Document() = default;
 
@@ -346,12 +349,6 @@
   return m_pExtension ? m_pExtension->GetUserPermissions() : 0;
 }
 
-RetainPtr<CPDF_StreamAcc> CPDF_Document::LoadFontFile(
-    const CPDF_Stream* pStream) {
-  return m_pDocPage->GetFontFileStreamAcc(pStream);
-}
-
-
 void CPDF_Document::CreateNewDoc() {
   ASSERT(!m_pRootDict);
   ASSERT(!m_pInfoDict);
@@ -486,3 +483,11 @@
 CPDF_Document::StockFontClearer::~StockFontClearer() {
   CPDF_PageModule::GetInstance()->ClearStockFont(m_pDoc.Get());
 }
+
+CPDF_Document::PageDataIface::PageDataIface() = default;
+
+CPDF_Document::PageDataIface::~PageDataIface() = default;
+
+CPDF_Document::RenderDataIface::RenderDataIface() = default;
+
+CPDF_Document::RenderDataIface::~RenderDataIface() = default;
diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h
index 97c75f6..3d9196c 100644
--- a/core/fpdfapi/parser/cpdf_document.h
+++ b/core/fpdfapi/parser/cpdf_document.h
@@ -18,11 +18,10 @@
 #include "core/fpdfapi/parser/cpdf_parser.h"
 #include "core/fxcrt/observable.h"
 #include "core/fxcrt/retain_ptr.h"
+#include "core/fxcrt/unowned_ptr.h"
 
 class CFX_Font;
 class CFX_Matrix;
-class CPDF_DocPageData;
-class CPDF_DocRenderData;
 class CPDF_LinearizedHeader;
 class CPDF_Object;
 class CPDF_ReadValidator;
@@ -54,6 +53,30 @@
     virtual ~LinkListIface() = default;
   };
 
+  class PageDataIface {
+   public:
+    PageDataIface();
+    virtual ~PageDataIface();
+
+    void SetDocument(CPDF_Document* pDoc) { m_pDoc = pDoc; }
+    CPDF_Document* GetDocument() const { return m_pDoc.Get(); }
+
+   private:
+    UnownedPtr<CPDF_Document> m_pDoc;
+  };
+
+  class RenderDataIface {
+   public:
+    RenderDataIface();
+    virtual ~RenderDataIface();
+
+    void SetDocument(CPDF_Document* pDoc) { m_pDoc = pDoc; }
+    CPDF_Document* GetDocument() const { return m_pDoc.Get(); }
+
+   private:
+    UnownedPtr<CPDF_Document> m_pDoc;
+  };
+
   static const int kPageMaxNum = 0xFFFFF;
 
   CPDF_Document();
@@ -76,7 +99,8 @@
   uint32_t GetUserPermissions() const;
 
   // Returns a valid pointer, unless it is called during destruction.
-  CPDF_DocPageData* GetPageData() const { return m_pDocPage.get(); }
+  PageDataIface* GetPageData() const { return m_pDocPage.get(); }
+  RenderDataIface* GetRenderData() const { return m_pDocRender.get(); }
 
   void SetPageObjNum(int iPage, uint32_t objNum);
 
@@ -88,10 +112,6 @@
     m_pLinksContext = std::move(pContext);
   }
 
-  CPDF_DocRenderData* GetRenderData() const { return m_pDocRender.get(); }
-
-  RetainPtr<CPDF_StreamAcc> LoadFontFile(const CPDF_Stream* pStream);
-
   //  CPDF_Parser::ParsedObjectsHolder overrides:
   bool TryInit() override;
 
@@ -163,10 +183,8 @@
   int m_iNextPageToTraverse = 0;
   uint32_t m_ParsedPageCount = 0;
 
-  std::unique_ptr<CPDF_DocRenderData> m_pDocRender;
-  // Must be after |m_pDocRender|.
-  std::unique_ptr<CPDF_DocPageData> m_pDocPage;
-
+  std::unique_ptr<RenderDataIface> m_pDocRender;
+  std::unique_ptr<PageDataIface> m_pDocPage;  // Must be after |m_pDocRender|.
   std::unique_ptr<JBig2_DocumentContext> m_pCodecContext;
   std::unique_ptr<LinkListIface> m_pLinksContext;
   std::vector<uint32_t> m_PageList;  // Page number to page's dict objnum.
diff --git a/core/fpdfapi/render/cpdf_dibbase.cpp b/core/fpdfapi/render/cpdf_dibbase.cpp
index 72d7ad9..101580d 100644
--- a/core/fpdfapi/render/cpdf_dibbase.cpp
+++ b/core/fpdfapi/render/cpdf_dibbase.cpp
@@ -379,7 +379,7 @@
   if (!pCSObj)
     return false;
 
-  CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData();
+  auto* pDocPageData = CPDF_DocPageData::FromDocument(m_pDocument.Get());
   if (pFormResources)
     m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pFormResources);
   if (!m_pColorSpace)
diff --git a/core/fpdfapi/render/cpdf_docrenderdata.cpp b/core/fpdfapi/render/cpdf_docrenderdata.cpp
index ce4085a..483ad87 100644
--- a/core/fpdfapi/render/cpdf_docrenderdata.cpp
+++ b/core/fpdfapi/render/cpdf_docrenderdata.cpp
@@ -25,8 +25,13 @@
 
 }  // namespace
 
-CPDF_DocRenderData::CPDF_DocRenderData(CPDF_Document* pPDFDoc)
-    : m_pPDFDoc(pPDFDoc) {}
+// static
+CPDF_DocRenderData* CPDF_DocRenderData::FromDocument(
+    const CPDF_Document* pDoc) {
+  return static_cast<CPDF_DocRenderData*>(pDoc->GetRenderData());
+}
+
+CPDF_DocRenderData::CPDF_DocRenderData() = default;
 
 CPDF_DocRenderData::~CPDF_DocRenderData() = default;
 
@@ -121,6 +126,6 @@
   }
 
   return pdfium::MakeRetain<CPDF_TransferFunc>(
-      m_pPDFDoc.Get(), bIdentity, std::move(samples_r), std::move(samples_g),
+      GetDocument(), bIdentity, std::move(samples_r), std::move(samples_g),
       std::move(samples_b));
 }
diff --git a/core/fpdfapi/render/cpdf_docrenderdata.h b/core/fpdfapi/render/cpdf_docrenderdata.h
index de127f8..696b758 100644
--- a/core/fpdfapi/render/cpdf_docrenderdata.h
+++ b/core/fpdfapi/render/cpdf_docrenderdata.h
@@ -10,21 +10,23 @@
 #include <map>
 
 #include "core/fpdfapi/page/cpdf_countedobject.h"
+#include "core/fpdfapi/parser/cpdf_document.h"
 #include "core/fxcrt/fx_system.h"
 #include "core/fxcrt/retain_ptr.h"
 #include "core/fxcrt/unowned_ptr.h"
 
-class CPDF_Document;
 class CPDF_Font;
 class CPDF_Object;
 class CPDF_TransferFunc;
 class CPDF_Type3Cache;
 class CPDF_Type3Font;
 
-class CPDF_DocRenderData {
+class CPDF_DocRenderData : public CPDF_Document::RenderDataIface {
  public:
-  explicit CPDF_DocRenderData(CPDF_Document* pPDFDoc);
-  ~CPDF_DocRenderData();
+  static CPDF_DocRenderData* FromDocument(const CPDF_Document* pDoc);
+
+  CPDF_DocRenderData();
+  ~CPDF_DocRenderData() override;
 
   CPDF_DocRenderData(const CPDF_DocRenderData&) = delete;
   CPDF_DocRenderData& operator=(const CPDF_DocRenderData&) = delete;
@@ -41,7 +43,6 @@
       const CPDF_Object* pObj) const;
 
  private:
-  UnownedPtr<CPDF_Document> const m_pPDFDoc;
   std::map<CPDF_Font*, RetainPtr<CPDF_Type3Cache>> m_Type3FaceMap;
   std::map<const CPDF_Object*, RetainPtr<CPDF_TransferFunc>> m_TransferFuncMap;
 };
diff --git a/core/fpdfapi/render/cpdf_docrenderdata_unittest.cpp b/core/fpdfapi/render/cpdf_docrenderdata_unittest.cpp
index 69162f0..2f24785 100644
--- a/core/fpdfapi/render/cpdf_docrenderdata_unittest.cpp
+++ b/core/fpdfapi/render/cpdf_docrenderdata_unittest.cpp
@@ -158,7 +158,7 @@
 
 class TestDocRenderData : public CPDF_DocRenderData {
  public:
-  TestDocRenderData() : CPDF_DocRenderData(nullptr) {}
+  TestDocRenderData() : CPDF_DocRenderData() {}
 
   RetainPtr<CPDF_TransferFunc> CreateTransferFuncForTesting(
       const CPDF_Object* pObj) const {
diff --git a/core/fpdfapi/render/cpdf_imagerenderer.cpp b/core/fpdfapi/render/cpdf_imagerenderer.cpp
index 1f7e4d9..2355068 100644
--- a/core/fpdfapi/render/cpdf_imagerenderer.cpp
+++ b/core/fpdfapi/render/cpdf_imagerenderer.cpp
@@ -147,8 +147,9 @@
   CPDF_Object* pCSObj =
       m_pImageObject->GetImage()->GetStream()->GetDict()->GetDirectObjectFor(
           "ColorSpace");
+  auto* pData = CPDF_DocPageData::FromDocument(pDocument);
   RetainPtr<CPDF_ColorSpace> pColorSpace =
-      pDocument->GetPageData()->GetColorSpace(pCSObj, pPageResources);
+      pData->GetColorSpace(pCSObj, pPageResources);
   if (pColorSpace) {
     int format = pColorSpace->GetFamily();
     if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION ||
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index ee2a9d1..6ec26f1 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -82,21 +82,21 @@
 
 void ReleaseCachedType3(CPDF_Type3Font* pFont) {
   CPDF_Document* pDoc = pFont->GetDocument();
-  pDoc->GetRenderData()->MaybePurgeCachedType3(pFont);
-  pDoc->GetPageData()->ReleaseFont(pFont->GetFontDict());
+  CPDF_DocRenderData::FromDocument(pDoc)->MaybePurgeCachedType3(pFont);
+  CPDF_DocPageData::FromDocument(pDoc)->ReleaseFont(pFont->GetFontDict());
 }
 
 class CPDF_RefType3Cache {
  public:
   explicit CPDF_RefType3Cache(CPDF_Type3Font* pType3Font)
-      : m_dwCount(0), m_pType3Font(pType3Font) {}
+      : m_pType3Font(pType3Font) {}
 
   ~CPDF_RefType3Cache() {
     while (m_dwCount--)
       ReleaseCachedType3(m_pType3Font.Get());
   }
 
-  uint32_t m_dwCount;
+  uint32_t m_dwCount = 0;
   UnownedPtr<CPDF_Type3Font> const m_pType3Font;
 };
 
@@ -1284,7 +1284,7 @@
 RetainPtr<CPDF_TransferFunc> CPDF_RenderStatus::GetTransferFunc(
     const CPDF_Object* pObj) const {
   ASSERT(pObj);
-  CPDF_DocRenderData* pDocCache = m_pContext->GetDocument()->GetRenderData();
+  auto* pDocCache = CPDF_DocRenderData::FromDocument(m_pContext->GetDocument());
   return pDocCache ? pDocCache->GetTransferFunc(pObj) : nullptr;
 }
 
@@ -1483,7 +1483,8 @@
                                     ->GetDict()
                                     ->GetDirectObjectFor("ColorSpace");
     RetainPtr<CPDF_ColorSpace> pColorSpace =
-        pDocument->GetPageData()->GetColorSpace(pCSObj, pPageResources);
+        CPDF_DocPageData::FromDocument(pDocument)->GetColorSpace(
+            pCSObj, pPageResources);
     if (pColorSpace) {
       int format = pColorSpace->GetFamily();
       if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION ||
@@ -1781,8 +1782,8 @@
 RetainPtr<CPDF_Type3Cache> CPDF_RenderStatus::GetCachedType3(
     CPDF_Type3Font* pFont) {
   CPDF_Document* pDoc = pFont->GetDocument();
-  pDoc->GetPageData()->GetFont(pFont->GetFontDict());
-  return pDoc->GetRenderData()->GetCachedType3(pFont);
+  CPDF_DocPageData::FromDocument(pDoc)->GetFont(pFont->GetFontDict());
+  return CPDF_DocRenderData::FromDocument(pDoc)->GetCachedType3(pFont);
 }
 
 // TODO(npm): Font fallback for type 3 fonts? (Completely separate code!!)
@@ -2622,7 +2623,8 @@
   if (pGroup)
     pCSObj = pGroup->GetDirectObjectFor(pdfium::transparency::kCS);
   RetainPtr<CPDF_ColorSpace> pCS =
-      m_pContext->GetDocument()->GetPageData()->GetColorSpace(pCSObj, nullptr);
+      CPDF_DocPageData::FromDocument(m_pContext->GetDocument())
+          ->GetColorSpace(pCSObj, nullptr);
   if (!pCS)
     return kDefaultColor;
 
diff --git a/core/fpdfdoc/cba_fontmap.cpp b/core/fpdfdoc/cba_fontmap.cpp
index 994648f..de12ca3 100644
--- a/core/fpdfdoc/cba_fontmap.cpp
+++ b/core/fpdfdoc/cba_fontmap.cpp
@@ -62,7 +62,7 @@
   auto pFXFont = pdfium::MakeUnique<CFX_Font>();
   pFXFont->LoadSubst(sFontFaceName, true, 0, 0, 0,
                      FX_GetCodePageFromCharset(nCharset), false);
-  return pDoc->GetPageData()->AddFont(pFXFont.get(), nCharset);
+  return CPDF_DocPageData::FromDocument(pDoc)->AddFont(pFXFont.get(), nCharset);
 }
 
 }  // namespace
@@ -243,17 +243,18 @@
       continue;
 
     CPDF_Dictionary* pElement = ToDictionary(it.second->GetDirect());
-    if (!pElement)
-      continue;
-    if (pElement->GetStringFor("Type") != "Font")
+    if (!pElement || pElement->GetStringFor("Type") != "Font")
       continue;
 
-    CPDF_Font* pFont = m_pDocument->GetPageData()->GetFont(pElement);
+    auto* pData = CPDF_DocPageData::FromDocument(m_pDocument.Get());
+    CPDF_Font* pFont = pData->GetFont(pElement);
     if (!pFont)
       continue;
+
     const CFX_SubstFont* pSubst = pFont->GetSubstFont();
     if (!pSubst)
       continue;
+
     if (pSubst->m_Charset == nCharset) {
       *sFontAlias = csKey;
       pFind = pFont;
@@ -308,7 +309,10 @@
         pFontDict = pDRFontDict->GetDictFor(*sAlias);
     }
   }
-  return pFontDict ? m_pDocument->GetPageData()->GetFont(pFontDict) : nullptr;
+  if (!pFontDict)
+    return nullptr;
+
+  return CPDF_DocPageData::FromDocument(m_pDocument.Get())->GetFont(pFontDict);
 }
 
 void CBA_FontMap::AddFontToAnnotDict(CPDF_Font* pFont,
@@ -484,7 +488,7 @@
     return nullptr;
 
   CPDF_Font* pFont = nullptr;
-  CPDF_DocPageData* pPageData = pDoc->GetPageData();
+  auto* pPageData = CPDF_DocPageData::FromDocument(pDoc);
   if (sFontName == "ZapfDingbats") {
     pFont = pPageData->AddStandardFont(sFontName.c_str(), nullptr);
   } else {
diff --git a/core/fpdfdoc/cpdf_formcontrol.cpp b/core/fpdfdoc/cpdf_formcontrol.cpp
index be6b732..6ecd0bc 100644
--- a/core/fpdfdoc/cpdf_formcontrol.cpp
+++ b/core/fpdfdoc/cpdf_formcontrol.cpp
@@ -214,8 +214,8 @@
     if (pFonts) {
       CPDF_Dictionary* pElement = pFonts->GetDictFor(*csFontNameTag);
       if (pElement) {
-        CPDF_Font* pFont =
-            m_pForm->GetDocument()->GetPageData()->GetFont(pElement);
+        auto* pData = CPDF_DocPageData::FromDocument(m_pForm->GetDocument());
+        CPDF_Font* pFont = pData->GetFont(pElement);
         if (pFont)
           return pFont;
       }
@@ -231,8 +231,8 @@
     if (pFonts) {
       CPDF_Dictionary* pElement = pFonts->GetDictFor(*csFontNameTag);
       if (pElement) {
-        CPDF_Font* pFont =
-            m_pForm->GetDocument()->GetPageData()->GetFont(pElement);
+        auto* pData = CPDF_DocPageData::FromDocument(m_pForm->GetDocument());
+        CPDF_Font* pFont = pData->GetFont(pElement);
         if (pFont)
           return pFont;
       }
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index 666d502..cb43042 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -912,7 +912,8 @@
   if (!pFontDict)
     return;
 
-  m_pFont = m_pForm->GetDocument()->GetPageData()->GetFont(pFontDict);
+  auto* pData = CPDF_DocPageData::FromDocument(m_pForm->GetDocument());
+  m_pFont = pData->GetFont(pFontDict);
 }
 
 bool CPDF_FormField::NotifyBeforeSelectionChange(const WideString& value) {
diff --git a/core/fpdfdoc/cpdf_interactiveform.cpp b/core/fpdfdoc/cpdf_interactiveform.cpp
index 175bf00..4b03b51 100644
--- a/core/fpdfdoc/cpdf_interactiveform.cpp
+++ b/core/fpdfdoc/cpdf_interactiveform.cpp
@@ -134,13 +134,10 @@
     return nullptr;
 
   CPDF_Dictionary* pElement = pFonts->GetDictFor(csAlias);
-  if (!pElement)
+  if (!pElement || pElement->GetStringFor("Type") != "Font")
     return nullptr;
 
-  if (pElement->GetStringFor("Type") != "Font")
-    return nullptr;
-
-  return pDocument->GetPageData()->GetFont(pElement);
+  return CPDF_DocPageData::FromDocument(pDocument)->GetFont(pElement);
 }
 
 CPDF_Font* GetNativeFont(CPDF_Dictionary* pFormDict,
@@ -165,11 +162,11 @@
       continue;
 
     CPDF_Dictionary* pElement = ToDictionary(it.second->GetDirect());
-    if (!pElement)
+    if (!pElement || pElement->GetStringFor("Type") != "Font")
       continue;
-    if (pElement->GetStringFor("Type") != "Font")
-      continue;
-    CPDF_Font* pFind = pDocument->GetPageData()->GetFont(pElement);
+
+    auto* pData = CPDF_DocPageData::FromDocument(pDocument);
+    CPDF_Font* pFind = pData->GetFont(pElement);
     if (!pFind)
       continue;
 
@@ -243,11 +240,10 @@
       continue;
 
     CPDF_Dictionary* pElement = ToDictionary(it.second->GetDirect());
-    if (!pElement)
+    if (!pElement || pElement->GetStringFor("Type") != "Font")
       continue;
-    if (pElement->GetStringFor("Type") != "Font")
-      continue;
-    pFont = pDocument->GetPageData()->GetFont(pElement);
+
+    pFont = CPDF_DocPageData::FromDocument(pDocument)->GetFont(pElement);
     if (!pFont)
       continue;
 
@@ -620,7 +616,7 @@
   if (!pDocument || csFontName.IsEmpty())
     return nullptr;
 
-  CPDF_DocPageData* pPageData = pDocument->GetPageData();
+  auto* pPageData = CPDF_DocPageData::FromDocument(pDocument);
   if (csFontName == "ZapfDingbats")
     return pPageData->AddStandardFont(csFontName.c_str(), nullptr);
 
@@ -678,7 +674,7 @@
   if (!csFontName.IsEmpty()) {
     if (csFontName == CFX_Font::kDefaultAnsiFontName)
       return AddStandardFont(pDocument, csFontName);
-    return pDocument->GetPageData()->AddWindowsFont(&lf);
+    return CPDF_DocPageData::FromDocument(pDocument)->AddWindowsFont(&lf);
   }
 #endif
   return nullptr;
diff --git a/core/fpdfdoc/cpvt_generateap.cpp b/core/fpdfdoc/cpvt_generateap.cpp
index af1685e..81f4e08 100644
--- a/core/fpdfdoc/cpvt_generateap.cpp
+++ b/core/fpdfdoc/cpvt_generateap.cpp
@@ -764,7 +764,8 @@
 
   ByteString sFontName = "FONT";
   auto pResourceFontDict = GenerateResourceFontDict(pDoc, sFontName);
-  CPDF_Font* pDefFont = pDoc->GetPageData()->GetFont(pResourceFontDict.Get());
+  auto* pData = CPDF_DocPageData::FromDocument(pDoc);
+  CPDF_Font* pDefFont = pData->GetFont(pResourceFontDict.Get());
   if (!pDefFont)
     return false;
 
@@ -956,7 +957,8 @@
     pDRFontDict->SetNewFor<CPDF_Reference>(font_name, pDoc,
                                            pFontDict->GetObjNum());
   }
-  CPDF_Font* pDefFont = pDoc->GetPageData()->GetFont(pFontDict);
+  auto* pData = CPDF_DocPageData::FromDocument(pDoc);
+  CPDF_Font* pDefFont = pData->GetFont(pFontDict);
   if (!pDefFont)
     return;
 
diff --git a/fpdfsdk/fpdf_edittext.cpp b/fpdfsdk/fpdf_edittext.cpp
index f8fb78c..5d9841a 100644
--- a/fpdfsdk/fpdf_edittext.cpp
+++ b/fpdfsdk/fpdf_edittext.cpp
@@ -305,7 +305,7 @@
 
   pFontDict->SetNewFor<CPDF_Reference>("FontDescriptor", pDoc,
                                        pFontDesc->GetObjNum());
-  return pDoc->GetPageData()->GetFont(pFontDict);
+  return CPDF_DocPageData::FromDocument(pDoc)->GetFont(pFontDict);
 }
 
 CPDF_Font* LoadCompositeFont(CPDF_Document* pDoc,
@@ -424,7 +424,7 @@
   CPDF_Stream* toUnicodeStream = LoadUnicode(pDoc, to_unicode);
   pFontDict->SetNewFor<CPDF_Reference>("ToUnicode", pDoc,
                                        toUnicodeStream->GetObjNum());
-  return pDoc->GetPageData()->GetFont(pFontDict);
+  return CPDF_DocPageData::FromDocument(pDoc)->GetFont(pFontDict);
 }
 
 CPDF_TextObject* CPDFTextObjectFromFPDFPageObject(FPDF_PAGEOBJECT page_object) {
@@ -577,7 +577,7 @@
   if (!pDoc)
     return;
 
-  CPDF_DocPageData* pPageData = pDoc->GetPageData();
+  auto* pPageData = CPDF_DocPageData::FromDocument(pDoc);
   if (!pPageData->IsForceClear())
     pPageData->ReleaseFont(pFont->GetFontDict());
 }
@@ -593,7 +593,7 @@
 
   auto pTextObj = pdfium::MakeUnique<CPDF_TextObject>();
   pTextObj->m_TextState.SetFont(
-      pDoc->GetPageData()->GetFont(pFont->GetFontDict()));
+      CPDF_DocPageData::FromDocument(pDoc)->GetFont(pFont->GetFontDict()));
   pTextObj->m_TextState.SetFontSize(font_size);
   pTextObj->DefaultStates();
   return FPDFPageObjectFromCPDFPageObject(pTextObj.release());
diff --git a/xfa/fgas/font/cfgas_pdffontmgr.cpp b/xfa/fgas/font/cfgas_pdffontmgr.cpp
index 2704cb3..1b2a09e 100644
--- a/xfa/fgas/font/cfgas_pdffontmgr.cpp
+++ b/xfa/fgas/font/cfgas_pdffontmgr.cpp
@@ -63,7 +63,8 @@
     if (!pFontDict || pFontDict->GetStringFor("Type") != "Font")
       return nullptr;
 
-    CPDF_Font* pPDFFont = m_pDoc->GetPageData()->GetFont(pFontDict);
+    auto* pData = CPDF_DocPageData::FromDocument(m_pDoc.Get());
+    CPDF_Font* pPDFFont = pData->GetFont(pFontDict);
     if (!pPDFFont)
       return nullptr;