diff --git a/core/fpdfapi/font/cpdf_tounicodemap.cpp b/core/fpdfapi/font/cpdf_tounicodemap.cpp
index bdebc19..b4831fd 100644
--- a/core/fpdfapi/font/cpdf_tounicodemap.cpp
+++ b/core/fpdfapi/font/cpdf_tounicodemap.cpp
@@ -130,60 +130,18 @@
     if (word.IsEmpty())
       break;
 
-    if (word == "beginbfchar") {
-      while (1) {
-        word = parser.GetWord();
-        if (word.IsEmpty() || word == "endbfchar")
-          break;
-
-        SetCode(StringToCode(word), StringToWideString(parser.GetWord()));
-      }
-    } else if (word == "beginbfrange") {
-      while (1) {
-        ByteStringView low = parser.GetWord();
-        if (low.IsEmpty() || low == "endbfrange")
-          break;
-
-        ByteStringView high = parser.GetWord();
-        uint32_t lowcode = StringToCode(low);
-        uint32_t highcode =
-            (lowcode & 0xffffff00) | (StringToCode(high) & 0xff);
-        if (highcode == 0xffffffff)
-          break;
-
-        ByteStringView start = parser.GetWord();
-        if (start == "[") {
-          for (uint32_t code = lowcode; code <= highcode; code++)
-            SetCode(code, StringToWideString(parser.GetWord()));
-          parser.GetWord();
-          continue;
-        }
-
-        WideString destcode = StringToWideString(start);
-        if (destcode.GetLength() == 1) {
-          uint32_t value = StringToCode(start);
-          for (uint32_t code = lowcode; code <= highcode; code++)
-            m_Map[code] = value++;
-        } else {
-          for (uint32_t code = lowcode; code <= highcode; code++) {
-            WideString retcode =
-                code == lowcode ? destcode : StringDataAdd(destcode);
-            m_Map[code] = GetUnicode();
-            m_MultiCharBuf.AppendChar(retcode.GetLength());
-            m_MultiCharBuf << retcode;
-            destcode = std::move(retcode);
-          }
-        }
-      }
-    } else if (word == "/Adobe-Korea1-UCS2") {
+    if (word == "beginbfchar")
+      HandleBeginBFChar(&parser);
+    else if (word == "beginbfrange")
+      HandleBeginBFRange(&parser);
+    else if (word == "/Adobe-Korea1-UCS2")
       cid_set = CIDSET_KOREA1;
-    } else if (word == "/Adobe-Japan1-UCS2") {
+    else if (word == "/Adobe-Japan1-UCS2")
       cid_set = CIDSET_JAPAN1;
-    } else if (word == "/Adobe-CNS1-UCS2") {
+    else if (word == "/Adobe-CNS1-UCS2")
       cid_set = CIDSET_CNS1;
-    } else if (word == "/Adobe-GB1-UCS2") {
+    else if (word == "/Adobe-GB1-UCS2")
       cid_set = CIDSET_GB1;
-    }
   }
   if (cid_set) {
     auto* manager = CPDF_FontGlobals::GetInstance()->GetCMapManager();
@@ -191,6 +149,54 @@
   }
 }
 
+void CPDF_ToUnicodeMap::HandleBeginBFChar(CPDF_SimpleParser* pParser) {
+  while (1) {
+    ByteStringView word = pParser->GetWord();
+    if (word.IsEmpty() || word == "endbfchar")
+      return;
+
+    SetCode(StringToCode(word), StringToWideString(pParser->GetWord()));
+  }
+}
+
+void CPDF_ToUnicodeMap::HandleBeginBFRange(CPDF_SimpleParser* pParser) {
+  while (1) {
+    ByteStringView low = pParser->GetWord();
+    if (low.IsEmpty() || low == "endbfrange")
+      return;
+
+    ByteStringView high = pParser->GetWord();
+    uint32_t lowcode = StringToCode(low);
+    uint32_t highcode = (lowcode & 0xffffff00) | (StringToCode(high) & 0xff);
+    if (highcode == 0xffffffff)
+      return;
+
+    ByteStringView start = pParser->GetWord();
+    if (start == "[") {
+      for (uint32_t code = lowcode; code <= highcode; code++)
+        SetCode(code, StringToWideString(pParser->GetWord()));
+      pParser->GetWord();
+      continue;
+    }
+
+    WideString destcode = StringToWideString(start);
+    if (destcode.GetLength() == 1) {
+      uint32_t value = StringToCode(start);
+      for (uint32_t code = lowcode; code <= highcode; code++)
+        m_Map[code] = value++;
+    } else {
+      for (uint32_t code = lowcode; code <= highcode; code++) {
+        WideString retcode =
+            code == lowcode ? destcode : StringDataAdd(destcode);
+        m_Map[code] = GetUnicode();
+        m_MultiCharBuf.AppendChar(retcode.GetLength());
+        m_MultiCharBuf << retcode;
+        destcode = std::move(retcode);
+      }
+    }
+  }
+}
+
 uint32_t CPDF_ToUnicodeMap::GetUnicode() const {
   FX_SAFE_UINT32 uni = m_MultiCharBuf.GetLength();
   uni = uni * 0x10000 + 0xffff;
diff --git a/core/fpdfapi/font/cpdf_tounicodemap.h b/core/fpdfapi/font/cpdf_tounicodemap.h
index 71f4381..e3d04ed 100644
--- a/core/fpdfapi/font/cpdf_tounicodemap.h
+++ b/core/fpdfapi/font/cpdf_tounicodemap.h
@@ -13,6 +13,7 @@
 #include "core/fxcrt/unowned_ptr.h"
 
 class CPDF_CID2UnicodeMap;
+class CPDF_SimpleParser;
 class CPDF_Stream;
 
 class CPDF_ToUnicodeMap {
@@ -31,6 +32,8 @@
   static WideString StringToWideString(ByteStringView str);
 
   void Load(const CPDF_Stream* pStream);
+  void HandleBeginBFChar(CPDF_SimpleParser* pParser);
+  void HandleBeginBFRange(CPDF_SimpleParser* pParser);
   uint32_t GetUnicode() const;
   void SetCode(uint32_t srccode, WideString destcode);
 
