diff --git a/core/fpdfapi/font/cpdf_type3char.cpp b/core/fpdfapi/font/cpdf_type3char.cpp
index 77e5bc6..5e04065 100644
--- a/core/fpdfapi/font/cpdf_type3char.cpp
+++ b/core/fpdfapi/font/cpdf_type3char.cpp
@@ -14,6 +14,7 @@
 #include "core/fpdfapi/page/cpdf_pageobject.h"
 #include "core/fxge/dib/cfx_dibitmap.h"
 #include "core/fxge/fx_dib.h"
+#include "third_party/base/ptr_util.h"
 
 namespace {
 
@@ -21,10 +22,14 @@
 
 }  // namespace
 
-CPDF_Type3Char::CPDF_Type3Char(std::unique_ptr<CPDF_Form> pForm)
-    : m_pForm(std::move(pForm)) {}
+CPDF_Type3Char::CPDF_Type3Char(CPDF_Document* pDocument,
+                               CPDF_Dictionary* pPageResources,
+                               CPDF_Stream* pFormStream)
+    : m_pForm(pdfium::MakeUnique<CPDF_Form>(pDocument,
+                                            pPageResources,
+                                            pFormStream)) {}
 
-CPDF_Type3Char::~CPDF_Type3Char() {}
+CPDF_Type3Char::~CPDF_Type3Char() = default;
 
 // static
 float CPDF_Type3Char::TextUnitToGlyphUnit(float fTextUnit) {
@@ -95,6 +100,14 @@
   m_pForm.reset();
 }
 
+void CPDF_Type3Char::ParseContent() {
+  m_pForm->ParseContent(nullptr, nullptr, this, nullptr);
+}
+
+bool CPDF_Type3Char::HasPageObjects() const {
+  return !!m_pForm->GetPageObjectCount();
+}
+
 RetainPtr<CFX_DIBitmap> CPDF_Type3Char::GetBitmap() {
   return m_pBitmap;
 }
diff --git a/core/fpdfapi/font/cpdf_type3char.h b/core/fpdfapi/font/cpdf_type3char.h
index 28baffe..9edd6cd 100644
--- a/core/fpdfapi/font/cpdf_type3char.h
+++ b/core/fpdfapi/font/cpdf_type3char.h
@@ -14,35 +14,43 @@
 #include "core/fxcrt/retain_ptr.h"
 
 class CFX_DIBitmap;
+class CPDF_Dictionary;
+class CPDF_Document;
 class CPDF_Form;
 class CPDF_RenderContext;
+class CPDF_Stream;
 
 class CPDF_Type3Char {
  public:
-  explicit CPDF_Type3Char(std::unique_ptr<CPDF_Form> pForm);
+  CPDF_Type3Char(CPDF_Document* pDocument,
+                 CPDF_Dictionary* pPageResources,
+                 CPDF_Stream* pFormStream);
   ~CPDF_Type3Char();
 
   static float TextUnitToGlyphUnit(float fTextUnit);
   static void TextUnitRectToGlyphUnitRect(CFX_FloatRect* pRect);
 
   bool LoadBitmap(CPDF_RenderContext* pContext);
-
   void InitializeFromStreamData(bool bColored, const float* pData);
   void Transform(const CFX_Matrix& matrix);
   void ResetForm();
+  void ParseContent();
+  bool HasPageObjects() const;
 
   RetainPtr<CFX_DIBitmap> GetBitmap();
   const RetainPtr<CFX_DIBitmap>& GetBitmap() const;
 
-  const CPDF_Form* form() const { return m_pForm.get(); }
-  CPDF_Form* form() { return m_pForm.get(); }
-
   bool colored() const { return m_bColored; }
   uint32_t width() const { return m_Width; }
   const CFX_Matrix& matrix() const { return m_ImageMatrix; }
   const FX_RECT& bbox() const { return m_BBox; }
 
  private:
+  friend class CPDF_RenderStatus;
+
+  const CPDF_Form* form() const { return m_pForm.get(); }
+  CPDF_Form* form() { return m_pForm.get(); }
+
   std::unique_ptr<CPDF_Form> m_pForm;
   RetainPtr<CFX_DIBitmap> m_pBitmap;
   bool m_bColored = false;
diff --git a/core/fpdfapi/font/cpdf_type3font.cpp b/core/fpdfapi/font/cpdf_type3font.cpp
index df9bec7..85b9ea3 100644
--- a/core/fpdfapi/font/cpdf_type3font.cpp
+++ b/core/fpdfapi/font/cpdf_type3font.cpp
@@ -10,7 +10,6 @@
 #include <utility>
 
 #include "core/fpdfapi/font/cpdf_type3char.h"
-#include "core/fpdfapi/page/cpdf_form.h"
 #include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fpdfapi/parser/cpdf_stream.h"
@@ -107,17 +106,16 @@
   if (!pStream)
     return nullptr;
 
-  auto pNewChar =
-      pdfium::MakeUnique<CPDF_Type3Char>(pdfium::MakeUnique<CPDF_Form>(
-          m_pDocument.Get(),
-          m_pFontResources ? m_pFontResources.Get() : m_pPageResources.Get(),
-          pStream, nullptr));
+  auto pNewChar = pdfium::MakeUnique<CPDF_Type3Char>(
+      m_pDocument.Get(),
+      m_pFontResources ? m_pFontResources.Get() : m_pPageResources.Get(),
+      pStream);
 
   // This can trigger recursion into this method. The content of |m_CacheMap|
   // can change as a result. Thus after it returns, check the cache again for
   // a cache hit.
   m_CharLoadingDepth++;
-  pNewChar->form()->ParseContent(nullptr, nullptr, pNewChar.get(), nullptr);
+  pNewChar->ParseContent();
   m_CharLoadingDepth--;
   it = m_CacheMap.find(charcode);
   if (it != m_CacheMap.end())
@@ -126,7 +124,7 @@
   pNewChar->Transform(m_FontMatrix);
   m_CacheMap[charcode] = std::move(pNewChar);
   CPDF_Type3Char* pCachedChar = m_CacheMap[charcode].get();
-  if (pCachedChar->form()->GetPageObjectCount() == 0)
+  if (!pCachedChar->HasPageObjects())
     pCachedChar->ResetForm();
   return pCachedChar;
 }
