diff --git a/core/fpdftext/cpdf_linkextract.cpp b/core/fpdftext/cpdf_linkextract.cpp
index 84bb415..b3be585 100644
--- a/core/fpdftext/cpdf_linkextract.cpp
+++ b/core/fpdftext/cpdf_linkextract.cpp
@@ -120,11 +120,12 @@
   const WideString page_text = m_pTextPage->GetAllPageText();
   while (pos < nTotalChar) {
     const CPDF_TextPage::CharInfo& char_info = m_pTextPage->GetCharInfo(pos);
-    if (char_info.m_Flag != FPDFTEXT_CHAR_GENERATED &&
+    if (char_info.m_CharType != CPDF_TextPage::CharType::kGenerated &&
         char_info.m_Unicode != TEXT_SPACE_CHAR && pos != nTotalChar - 1) {
-      bAfterHyphen = (char_info.m_Flag == FPDFTEXT_CHAR_HYPHEN ||
-                      (char_info.m_Flag == FPDFTEXT_CHAR_NORMAL &&
-                       char_info.m_Unicode == TEXT_HYPHEN_CHAR));
+      bAfterHyphen =
+          (char_info.m_CharType == CPDF_TextPage::CharType::kHyphen ||
+           (char_info.m_CharType == CPDF_TextPage::CharType::kNormal &&
+            char_info.m_Unicode == TEXT_HYPHEN_CHAR));
       ++pos;
       continue;
     }
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index 39807b2..37de028 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -122,7 +122,7 @@
     case 0x97:
     case 0x98:
     case 0xfffe:
-      return char_info.m_Flag != FPDFTEXT_CHAR_HYPHEN;
+      return char_info.m_CharType != CPDF_TextPage::CharType::kHyphen;
     default:
       return false;
   }
@@ -257,7 +257,7 @@
 
   for (int i = 0; i < nCount; ++i) {
     const CharInfo& charinfo = m_CharList[i];
-    if (charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED ||
+    if (charinfo.m_CharType == CPDF_TextPage::CharType::kGenerated ||
         (charinfo.m_Unicode != 0 && !IsControlChar(charinfo)) ||
         (charinfo.m_Unicode == 0 && charinfo.m_CharCode != 0)) {
       if (m_CharIndices.size() % 2) {
@@ -327,7 +327,7 @@
   bool bFlagNewRect = true;
   while (nCount--) {
     const CharInfo& info_curchar = m_CharList[curPos++];
-    if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED)
+    if (info_curchar.m_CharType == CPDF_TextPage::CharType::kGenerated)
       continue;
     if (info_curchar.m_CharBox.Width() < kSizeEpsilon ||
         info_curchar.m_CharBox.Height() < kSizeEpsilon) {
@@ -640,7 +640,7 @@
   Unicode_GetNormalization(wChar, pDst.get());
   for (size_t nIndex = 0; nIndex < nCount; ++nIndex) {
     info2.m_Unicode = pDst.get()[nIndex];
-    info2.m_Flag = FPDFTEXT_CHAR_PIECE;
+    info2.m_CharType = CPDF_TextPage::CharType::kPiece;
     m_TextBuf.AppendChar(info2.m_Unicode);
     m_CharList.push_back(info2);
   }
@@ -669,7 +669,7 @@
   Unicode_GetNormalization(wChar, pDst.get());
   for (size_t nIndex = 0; nIndex < nCount; ++nIndex) {
     info2.m_Unicode = pDst.get()[nIndex];
-    info2.m_Flag = FPDFTEXT_CHAR_PIECE;
+    info2.m_CharType = CPDF_TextPage::CharType::kPiece;
     m_TextBuf.AppendChar(info2.m_Unicode);
     m_CharList.push_back(info2);
   }
@@ -874,7 +874,7 @@
     charinfo.m_Index = m_TextBuf.GetLength();
     charinfo.m_Unicode = wChar;
     charinfo.m_CharCode = pFont->CharCodeFromUnicode(wChar);
-    charinfo.m_Flag = FPDFTEXT_CHAR_PIECE;
+    charinfo.m_CharType = CPDF_TextPage::CharType::kPiece;
     charinfo.m_pTextObj = pTextObj;
     charinfo.m_CharBox = pTextObj->GetRect();
     charinfo.m_Matrix = matrix;
@@ -970,7 +970,7 @@
         CharInfo* charinfo = &m_TempCharList.back();
         m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);
         charinfo->m_Unicode = 0x2;
-        charinfo->m_Flag = FPDFTEXT_CHAR_HYPHEN;
+        charinfo->m_CharType = CPDF_TextPage::CharType::kHyphen;
         m_TempTextBuf.AppendChar(0xfffe);
         break;
     }
@@ -1035,7 +1035,7 @@
       }
       if (threshold && (spacing && spacing >= threshold)) {
         charinfo.m_Unicode = TEXT_SPACE_CHAR;
-        charinfo.m_Flag = FPDFTEXT_CHAR_GENERATED;
+        charinfo.m_CharType = CPDF_TextPage::CharType::kGenerated;
         charinfo.m_pTextObj = pTextObj;
         charinfo.m_Index = m_TextBuf.GetLength();
         m_TempTextBuf.AppendChar(TEXT_SPACE_CHAR);
@@ -1059,8 +1059,8 @@
     }
     charinfo.m_Index = -1;
     charinfo.m_CharCode = item.m_CharCode;
-    charinfo.m_Flag =
-        bNoUnicode ? FPDFTEXT_CHAR_UNUNICODE : FPDFTEXT_CHAR_NORMAL;
+    charinfo.m_CharType = bNoUnicode ? CPDF_TextPage::CharType::kNotUnicode
+                                     : CPDF_TextPage::CharType::kNormal;
     charinfo.m_pTextObj = pTextObj;
     charinfo.m_Origin = matrix.Transform(item.m_Origin);
 
@@ -1180,7 +1180,8 @@
   }
 
   const CharInfo* pPrevCharInfo = GetPrevCharInfo();
-  return pPrevCharInfo && pPrevCharInfo->m_Flag == FPDFTEXT_CHAR_PIECE &&
+  return pPrevCharInfo &&
+         pPrevCharInfo->m_CharType == CPDF_TextPage::CharType::kPiece &&
          IsHyphenCode(pPrevCharInfo->m_Unicode);
 }
 
@@ -1394,7 +1395,7 @@
   info.m_Index = m_TextBuf.GetLength();
   info.m_CharCode = CPDF_Font::kInvalidCharCode;
   info.m_Unicode = unicode;
-  info.m_Flag = FPDFTEXT_CHAR_GENERATED;
+  info.m_CharType = CPDF_TextPage::CharType::kGenerated;
 
   int preWidth = 0;
   if (pPrevCharInfo->m_pTextObj &&
diff --git a/core/fpdftext/cpdf_textpage.h b/core/fpdftext/cpdf_textpage.h
index ad12976..3ea1380 100644
--- a/core/fpdftext/cpdf_textpage.h
+++ b/core/fpdftext/cpdf_textpage.h
@@ -23,12 +23,6 @@
 class CPDF_Page;
 class CPDF_TextObject;
 
-#define FPDFTEXT_CHAR_NORMAL 0
-#define FPDFTEXT_CHAR_GENERATED 1
-#define FPDFTEXT_CHAR_UNUNICODE 2
-#define FPDFTEXT_CHAR_HYPHEN 3
-#define FPDFTEXT_CHAR_PIECE 4
-
 #define TEXT_SPACE_CHAR L' '
 #define TEXT_LINEFEED_CHAR L'\n'
 #define TEXT_RETURN_CHAR L'\r'
@@ -47,6 +41,14 @@
 
 class CPDF_TextPage {
  public:
+  enum class CharType : uint8_t {
+    kNormal,
+    kGenerated,
+    kNotUnicode,
+    kHyphen,
+    kPiece,
+  };
+
   class CharInfo {
    public:
     CharInfo();
@@ -56,7 +58,7 @@
     int m_Index = 0;
     uint32_t m_CharCode = 0;
     wchar_t m_Unicode = 0;
-    int32_t m_Flag = 0;
+    CharType m_CharType = CharType::kNormal;
     CFX_PointF m_Origin;
     CFX_FloatRect m_CharBox;
     UnownedPtr<CPDF_TextObject> m_pTextObj;
