diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
index a8e9e60..f21d51d 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
@@ -513,7 +513,7 @@
 
 ByteString CPDF_PageContentGenerator::RealizeResource(
     const CPDF_Object* pResource,
-    const ByteString& bsType) const {
+    ByteStringView type) const {
   DCHECK(pResource);
   if (!obj_holder_->GetResources()) {
     obj_holder_->SetResources(document_->NewIndirect<CPDF_Dictionary>());
@@ -523,16 +523,16 @@
   }
 
   RetainPtr<CPDF_Dictionary> resource_dict =
-      obj_holder_->GetMutableResources()->GetOrCreateDictFor(bsType);
+      obj_holder_->GetMutableResources()->GetOrCreateDictFor(type);
   const auto& all_removed_resources_map =
       obj_holder_->all_removed_resources_map();
-  auto it = all_removed_resources_map.find(bsType);
+  auto it = all_removed_resources_map.find(type);
   const CPDF_PageObjectHolder::RemovedResourceMap* removed_resource_map =
       it != all_removed_resources_map.end() ? &it->second : nullptr;
   ByteString name;
   int idnum = 1;
   while (true) {
-    name = ByteString::Format("FX%c%d", bsType[0], idnum);
+    name = ByteString::Format("FX%c%d", type[0], idnum);
     // Avoid name collisions with existing `resource_dict` entries.
     if (resource_dict->KeyExist(name.AsStringView())) {
       idnum++;
diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator.h b/core/fpdfapi/edit/cpdf_pagecontentgenerator.h
index 8d99401..b37d06b 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentgenerator.h
+++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator.h
@@ -48,7 +48,7 @@
   void ProcessText(fxcrt::ostringstream* buf, CPDF_TextObject* pTextObj);
   ByteString GetOrCreateDefaultGraphics() const;
   ByteString RealizeResource(const CPDF_Object* pResource,
-                             const ByteString& bsType) const;
+                             ByteStringView type) const;
   const CPDF_ContentMarks* ProcessContentMarks(fxcrt::ostringstream* buf,
                                                const CPDF_PageObject* pPageObj,
                                                const CPDF_ContentMarks* pPrev);
diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp
index 9669f83..f276a24 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp
@@ -38,8 +38,8 @@
 
   RetainPtr<const CPDF_Dictionary> TestGetResource(
       CPDF_PageContentGenerator* pGen,
-      const ByteString& type,
-      const ByteString& name) {
+      ByteStringView type,
+      ByteStringView name) {
     RetainPtr<const CPDF_Dictionary> pResources =
         pGen->obj_holder_->GetResources();
     return pResources->GetDictFor(type)->GetDictFor(name);
@@ -225,10 +225,11 @@
   EXPECT_EQ(kExpectedStringEnd,
             path_string.Last(kExpectedStringEnd.GetLength()));
   ASSERT_GT(path_string.GetLength(), kExpectedStringMinLength);
-  RetainPtr<const CPDF_Dictionary> external_gs = TestGetResource(
-      &generator, "ExtGState",
-      path_string.Substr(kExpectedStringStart.GetLength(),
-                         path_string.GetLength() - kExpectedStringMinLength));
+  RetainPtr<const CPDF_Dictionary> external_gs =
+      TestGetResource(&generator, "ExtGState",
+                      path_string.AsStringView().Substr(
+                          kExpectedStringStart.GetLength(),
+                          path_string.GetLength() - kExpectedStringMinLength));
   ASSERT_TRUE(external_gs);
   EXPECT_EQ(0.5f, external_gs->GetFloatFor("ca"));
   EXPECT_EQ(0.8f, external_gs->GetFloatFor("CA"));
@@ -312,13 +313,15 @@
   EXPECT_EQ(kCompareString3, last_string.Last(kCompareString3.GetLength()));
   RetainPtr<const CPDF_Dictionary> external_gs = TestGetResource(
       &generator, "ExtGState",
-      mid_string.First(mid_string.GetLength() - kCompareString2.GetLength()));
+      mid_string.AsStringView().First(mid_string.GetLength() -
+                                      kCompareString2.GetLength()));
   ASSERT_TRUE(external_gs);
   EXPECT_EQ(0.5f, external_gs->GetFloatFor("ca"));
   EXPECT_EQ(0.8f, external_gs->GetFloatFor("CA"));
   RetainPtr<const CPDF_Dictionary> font_dict = TestGetResource(
       &generator, "Font",
-      last_string.First(last_string.GetLength() - kCompareString3.GetLength()));
+      last_string.AsStringView().First(last_string.GetLength() -
+                                       kCompareString3.GetLength()));
   ASSERT_TRUE(font_dict);
   EXPECT_EQ("Font", font_dict->GetNameFor("Type"));
   EXPECT_EQ("Type1", font_dict->GetNameFor("Subtype"));
@@ -387,9 +390,10 @@
   EXPECT_EQ(compare_string2, text_string.Last(compare_string2.GetLength()));
   RetainPtr<const CPDF_Dictionary> font_dict = TestGetResource(
       &generator, "Font",
-      text_string.Substr(compare_string1.GetLength(),
-                         text_string.GetLength() - compare_string1.GetLength() -
-                             compare_string2.GetLength()));
+      text_string.AsStringView().Substr(compare_string1.GetLength(),
+                                        text_string.GetLength() -
+                                            compare_string1.GetLength() -
+                                            compare_string2.GetLength()));
   ASSERT_TRUE(font_dict);
   EXPECT_TRUE(font_dict->GetObjNum());
   EXPECT_EQ("Font", font_dict->GetNameFor("Type"));
diff --git a/core/fpdfapi/edit/cpdf_pageorganizer.cpp b/core/fpdfapi/edit/cpdf_pageorganizer.cpp
index 9fd7aba..a1810cd 100644
--- a/core/fpdfapi/edit/cpdf_pageorganizer.cpp
+++ b/core/fpdfapi/edit/cpdf_pageorganizer.cpp
@@ -46,7 +46,7 @@
     info->SetNewFor<CPDF_String>("Producer", "PDFium");
   }
 
-  if (root->GetByteStringFor("Type", ByteString()).IsEmpty()) {
+  if (root->GetByteStringFor("Type", ByteStringView()).IsEmpty()) {
     root->SetNewFor<CPDF_Name>("Type", "Catalog");
   }
 
@@ -59,7 +59,7 @@
     pages = dest()->NewIndirect<CPDF_Dictionary>();
     root->SetNewFor<CPDF_Reference>("Pages", dest(), pages->GetObjNum());
   }
-  if (pages->GetByteStringFor("Type", ByteString()).IsEmpty()) {
+  if (pages->GetByteStringFor("Type", ByteStringView()).IsEmpty()) {
     pages->SetNewFor<CPDF_Name>("Type", "Pages");
   }
 
@@ -165,8 +165,8 @@
 bool CPDF_PageOrganizer::CopyInheritable(
     RetainPtr<CPDF_Dictionary> dest_page_dict,
     RetainPtr<const CPDF_Dictionary> src_page_dict,
-    const ByteString& key) {
-  if (dest_page_dict->KeyExist(key.AsStringView())) {
+    ByteStringView key) {
+  if (dest_page_dict->KeyExist(key)) {
     return true;
   }
 
@@ -176,14 +176,14 @@
     return false;
   }
 
-  dest_page_dict->SetFor(key, inheritable->Clone());
+  dest_page_dict->SetFor(ByteString(key), inheritable->Clone());
   return true;
 }
 
 // static
 RetainPtr<const CPDF_Object> CPDF_PageOrganizer::PageDictGetInheritableTag(
     RetainPtr<const CPDF_Dictionary> dict,
-    const ByteString& src_tag) {
+    ByteStringView src_tag) {
   if (!dict || src_tag.IsEmpty()) {
     return nullptr;
   }
@@ -204,12 +204,12 @@
     return nullptr;
   }
 
-  if (dict->KeyExist(src_tag.AsStringView())) {
+  if (dict->KeyExist(src_tag)) {
     return dict->GetObjectFor(src_tag);
   }
 
   while (pp) {
-    if (pp->KeyExist(src_tag.AsStringView())) {
+    if (pp->KeyExist(src_tag)) {
       return pp->GetObjectFor(src_tag);
     }
     if (!pp->KeyExist(pdfium::page_object::kParent)) {
diff --git a/core/fpdfapi/edit/cpdf_pageorganizer.h b/core/fpdfapi/edit/cpdf_pageorganizer.h
index c3fa370..e9623a4 100644
--- a/core/fpdfapi/edit/cpdf_pageorganizer.h
+++ b/core/fpdfapi/edit/cpdf_pageorganizer.h
@@ -44,11 +44,11 @@
 
   static bool CopyInheritable(RetainPtr<CPDF_Dictionary> dest_page_dict,
                               RetainPtr<const CPDF_Dictionary> src_page_dict,
-                              const ByteString& key);
+                              ByteStringView key);
 
   static RetainPtr<const CPDF_Object> PageDictGetInheritableTag(
       RetainPtr<const CPDF_Dictionary> dict,
-      const ByteString& src_tag);
+      ByteStringView src_tag);
 
  private:
   bool InitDestDoc();
diff --git a/core/fpdfapi/page/cpdf_contentmarkitem.cpp b/core/fpdfapi/page/cpdf_contentmarkitem.cpp
index ed2bf6a..021e521 100644
--- a/core/fpdfapi/page/cpdf_contentmarkitem.cpp
+++ b/core/fpdfapi/page/cpdf_contentmarkitem.cpp
@@ -18,7 +18,7 @@
 RetainPtr<const CPDF_Dictionary> CPDF_ContentMarkItem::GetParam() const {
   switch (param_type_) {
     case kPropertiesDict:
-      return properties_holder_->GetDictFor(property_name_);
+      return properties_holder_->GetDictFor(property_name_.AsStringView());
     case kDirectDict:
       return direct_dict_;
     case kNone:
diff --git a/core/fpdfapi/page/cpdf_docpagedata.cpp b/core/fpdfapi/page/cpdf_docpagedata.cpp
index a27fcc9..e465333 100644
--- a/core/fpdfapi/page/cpdf_docpagedata.cpp
+++ b/core/fpdfapi/page/cpdf_docpagedata.cpp
@@ -319,8 +319,9 @@
       RetainPtr<const CPDF_Dictionary> pList =
           pResources->GetDictFor("ColorSpace");
       if (pList) {
-        return GetColorSpaceInternal(pList->GetDirectObjectFor(name).Get(),
-                                     nullptr, pVisited, pVisitedInternal);
+        return GetColorSpaceInternal(
+            pList->GetDirectObjectFor(name.AsStringView()).Get(), nullptr,
+            pVisited, pVisitedInternal);
       }
     }
     if (!pCS || !pResources) {
diff --git a/core/fpdfapi/page/cpdf_occontext.cpp b/core/fpdfapi/page/cpdf_occontext.cpp
index 0659232..21d662f 100644
--- a/core/fpdfapi/page/cpdf_occontext.cpp
+++ b/core/fpdfapi/page/cpdf_occontext.cpp
@@ -70,23 +70,17 @@
   return pConfig;
 }
 
-ByteString GetUsageTypeString(CPDF_OCContext::UsageType eType) {
-  ByteString csState;
+ByteStringView GetUsageTypeString(CPDF_OCContext::UsageType eType) {
   switch (eType) {
     case CPDF_OCContext::kDesign:
-      csState = "Design";
-      break;
+      return "Design";
     case CPDF_OCContext::kPrint:
-      csState = "Print";
-      break;
+      return "Print";
     case CPDF_OCContext::kExport:
-      csState = "Export";
-      break;
+      return "Export";
     default:
-      csState = "View";
-      break;
+      return "View";
   }
-  return csState;
 }
 
 }  // namespace
@@ -99,7 +93,7 @@
 CPDF_OCContext::~CPDF_OCContext() = default;
 
 bool CPDF_OCContext::LoadOCGStateFromConfig(
-    const ByteString& csConfig,
+    ByteStringView config,
     const CPDF_Dictionary* pOCGDict) const {
   RetainPtr<const CPDF_Dictionary> pConfig = GetConfig(document_, pOCGDict);
   if (!pConfig) {
@@ -122,14 +116,14 @@
     return bState;
   }
 
-  ByteString csFind = csConfig + "State";
+  ByteString csFind({config, "State"});
   for (size_t i = 0; i < pArray->size(); i++) {
     RetainPtr<const CPDF_Dictionary> pUsage = pArray->GetDictAt(i);
     if (!pUsage) {
       continue;
     }
 
-    if (pUsage->GetByteStringFor("Event", "View") != csConfig) {
+    if (pUsage->GetByteStringFor("Event", "View") != config) {
       continue;
     }
 
@@ -142,12 +136,12 @@
       continue;
     }
 
-    RetainPtr<const CPDF_Dictionary> pState = pUsage->GetDictFor(csConfig);
+    RetainPtr<const CPDF_Dictionary> pState = pUsage->GetDictFor(config);
     if (!pState) {
       continue;
     }
 
-    bState = pState->GetByteStringFor(csFind) != "OFF";
+    bState = pState->GetByteStringFor(csFind.AsStringView()) != "OFF";
   }
   return bState;
 }
@@ -157,24 +151,24 @@
     return true;
   }
 
-  ByteString csState = GetUsageTypeString(usage_type_);
+  ByteStringView state = GetUsageTypeString(usage_type_);
   RetainPtr<const CPDF_Dictionary> pUsage = pOCGDict->GetDictFor("Usage");
   if (pUsage) {
-    RetainPtr<const CPDF_Dictionary> pState = pUsage->GetDictFor(csState);
+    RetainPtr<const CPDF_Dictionary> pState = pUsage->GetDictFor(state);
     if (pState) {
-      ByteString csFind = csState + "State";
+      ByteString csFind({state, "State"});
       if (pState->KeyExist(csFind.AsStringView())) {
-        return pState->GetByteStringFor(csFind) != "OFF";
+        return pState->GetByteStringFor(csFind.AsStringView()) != "OFF";
       }
     }
-    if (csState != "View") {
+    if (state != "View") {
       pState = pUsage->GetDictFor("View");
       if (pState && pState->KeyExist("ViewState")) {
         return pState->GetByteStringFor("ViewState") != "OFF";
       }
     }
   }
-  return LoadOCGStateFromConfig(csState, pOCGDict);
+  return LoadOCGStateFromConfig(state, pOCGDict);
 }
 
 bool CPDF_OCContext::GetOCGVisible(const CPDF_Dictionary* pOCGDict) const {
diff --git a/core/fpdfapi/page/cpdf_occontext.h b/core/fpdfapi/page/cpdf_occontext.h
index cf6fb66..7985d54 100644
--- a/core/fpdfapi/page/cpdf_occontext.h
+++ b/core/fpdfapi/page/cpdf_occontext.h
@@ -32,7 +32,7 @@
   CPDF_OCContext(CPDF_Document* pDoc, UsageType eUsageType);
   ~CPDF_OCContext() override;
 
-  bool LoadOCGStateFromConfig(const ByteString& csConfig,
+  bool LoadOCGStateFromConfig(ByteStringView config,
                               const CPDF_Dictionary* pOCGDict) const;
   bool LoadOCGState(const CPDF_Dictionary* pOCGDict) const;
   bool GetOCGVisible(const CPDF_Dictionary* pOCGDict) const;
diff --git a/core/fpdfapi/page/cpdf_page.cpp b/core/fpdfapi/page/cpdf_page.cpp
index 5e1dbe2..d2cd7a5 100644
--- a/core/fpdfapi/page/cpdf_page.cpp
+++ b/core/fpdfapi/page/cpdf_page.cpp
@@ -85,8 +85,10 @@
     const ByteString& name) const {
   std::set<RetainPtr<const CPDF_Dictionary>> visited;
   RetainPtr<const CPDF_Dictionary> pPageDict = GetDict();
+  ByteStringView name_view = name.AsStringView();
   while (pPageDict && !pdfium::Contains(visited, pPageDict)) {
-    RetainPtr<const CPDF_Object> pObj = pPageDict->GetDirectObjectFor(name);
+    RetainPtr<const CPDF_Object> pObj =
+        pPageDict->GetDirectObjectFor(name_view);
     if (pObj) {
       return pObj;
     }
diff --git a/core/fpdfapi/page/cpdf_pageobjectholder.h b/core/fpdfapi/page/cpdf_pageobjectholder.h
index 04df989..e6a4fe9 100644
--- a/core/fpdfapi/page/cpdf_pageobjectholder.h
+++ b/core/fpdfapi/page/cpdf_pageobjectholder.h
@@ -11,6 +11,7 @@
 #include <stdint.h>
 
 #include <deque>
+#include <functional>
 #include <map>
 #include <memory>
 #include <optional>
@@ -62,7 +63,8 @@
 
   // Key: The resource dictionary name.
   // Value: The entries removed from that dictionary.
-  using AllRemovedResourcesMap = std::map<ByteString, RemovedResourceMap>;
+  using AllRemovedResourcesMap =
+      std::map<ByteString, RemovedResourceMap, std::less<>>;
 
   using iterator = std::deque<std::unique_ptr<CPDF_PageObject>>::iterator;
   using const_iterator =
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 3ad222b..5bd02e8 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -626,7 +626,7 @@
   if (pProperty->IsName()) {
     ByteString property_name = pProperty->GetString();
     RetainPtr<CPDF_Dictionary> pHolder = FindResourceHolder("Properties");
-    if (!pHolder || !pHolder->GetDictFor(property_name)) {
+    if (!pHolder || !pHolder->GetDictFor(property_name.AsStringView())) {
       return;
     }
     new_marks->AddMarkWithPropertiesHolder(tag, std::move(pHolder),
@@ -1203,7 +1203,8 @@
     return nullptr;
   }
 
-  RetainPtr<CPDF_Dictionary> pDict = resources_->GetMutableDictFor(type);
+  RetainPtr<CPDF_Dictionary> pDict =
+      resources_->GetMutableDictFor(type.AsStringView());
   if (pDict) {
     return pDict;
   }
@@ -1212,14 +1213,15 @@
     return nullptr;
   }
 
-  return page_resources_->GetMutableDictFor(type);
+  return page_resources_->GetMutableDictFor(type.AsStringView());
 }
 
 RetainPtr<CPDF_Object> CPDF_StreamContentParser::FindResourceObj(
     const ByteString& type,
     const ByteString& name) {
   RetainPtr<CPDF_Dictionary> pHolder = FindResourceHolder(type);
-  return pHolder ? pHolder->GetMutableDirectObjectFor(name) : nullptr;
+  return pHolder ? pHolder->GetMutableDirectObjectFor(name.AsStringView())
+                 : nullptr;
 }
 
 RetainPtr<CPDF_Font> CPDF_StreamContentParser::FindFont(
diff --git a/core/fpdfapi/parser/cpdf_dictionary.cpp b/core/fpdfapi/parser/cpdf_dictionary.cpp
index 9d1e008..20744f7 100644
--- a/core/fpdfapi/parser/cpdf_dictionary.cpp
+++ b/core/fpdfapi/parser/cpdf_dictionary.cpp
@@ -70,51 +70,51 @@
 }
 
 const CPDF_Object* CPDF_Dictionary::GetObjectForInternal(
-    const ByteString& key) const {
+    ByteStringView key) const {
   auto it = map_.find(key);
   return it != map_.end() ? it->second.Get() : nullptr;
 }
 
 RetainPtr<const CPDF_Object> CPDF_Dictionary::GetObjectFor(
-    const ByteString& key) const {
+    ByteStringView key) const {
   return pdfium::WrapRetain(GetObjectForInternal(key));
 }
 
 RetainPtr<CPDF_Object> CPDF_Dictionary::GetMutableObjectFor(
-    const ByteString& key) {
+    ByteStringView key) {
   return pdfium::WrapRetain(
       const_cast<CPDF_Object*>(GetObjectForInternal(key)));
 }
 
 const CPDF_Object* CPDF_Dictionary::GetDirectObjectForInternal(
-    const ByteString& key) const {
+    ByteStringView key) const {
   const CPDF_Object* p = GetObjectForInternal(key);
   return p ? p->GetDirectInternal() : nullptr;
 }
 
 RetainPtr<const CPDF_Object> CPDF_Dictionary::GetDirectObjectFor(
-    const ByteString& key) const {
+    ByteStringView key) const {
   return pdfium::WrapRetain(GetDirectObjectForInternal(key));
 }
 
 RetainPtr<CPDF_Object> CPDF_Dictionary::GetMutableDirectObjectFor(
-    const ByteString& key) {
+    ByteStringView key) {
   return pdfium::WrapRetain(
       const_cast<CPDF_Object*>(GetDirectObjectForInternal(key)));
 }
 
-ByteString CPDF_Dictionary::GetByteStringFor(const ByteString& key) const {
+ByteString CPDF_Dictionary::GetByteStringFor(ByteStringView key) const {
   const CPDF_Object* p = GetObjectForInternal(key);
   return p ? p->GetString() : ByteString();
 }
 
-ByteString CPDF_Dictionary::GetByteStringFor(const ByteString& key,
-                                             const ByteString& def) const {
+ByteString CPDF_Dictionary::GetByteStringFor(ByteStringView key,
+                                             ByteStringView def) const {
   const CPDF_Object* p = GetObjectForInternal(key);
   return p ? p->GetString() : ByteString(def);
 }
 
-WideString CPDF_Dictionary::GetUnicodeTextFor(const ByteString& key) const {
+WideString CPDF_Dictionary::GetUnicodeTextFor(ByteStringView key) const {
   const CPDF_Object* p = GetObjectForInternal(key);
   if (const CPDF_Reference* pRef = ToReference(p)) {
     p = pRef->GetDirectInternal();
@@ -122,33 +122,32 @@
   return p ? p->GetUnicodeText() : WideString();
 }
 
-ByteString CPDF_Dictionary::GetNameFor(const ByteString& key) const {
+ByteString CPDF_Dictionary::GetNameFor(ByteStringView key) const {
   const CPDF_Name* p = ToName(GetObjectForInternal(key));
   return p ? p->GetString() : ByteString();
 }
 
-bool CPDF_Dictionary::GetBooleanFor(const ByteString& key,
-                                    bool bDefault) const {
+bool CPDF_Dictionary::GetBooleanFor(ByteStringView key, bool bDefault) const {
   const CPDF_Object* p = GetObjectForInternal(key);
   return ToBoolean(p) ? p->GetInteger() != 0 : bDefault;
 }
 
-int CPDF_Dictionary::GetIntegerFor(const ByteString& key) const {
+int CPDF_Dictionary::GetIntegerFor(ByteStringView key) const {
   const CPDF_Object* p = GetObjectForInternal(key);
   return p ? p->GetInteger() : 0;
 }
 
-int CPDF_Dictionary::GetIntegerFor(const ByteString& key, int def) const {
+int CPDF_Dictionary::GetIntegerFor(ByteStringView key, int def) const {
   const CPDF_Object* p = GetObjectForInternal(key);
   return p ? p->GetInteger() : def;
 }
 
-int CPDF_Dictionary::GetDirectIntegerFor(const ByteString& key) const {
+int CPDF_Dictionary::GetDirectIntegerFor(ByteStringView key) const {
   const CPDF_Number* p = ToNumber(GetObjectForInternal(key));
   return p ? p->GetInteger() : 0;
 }
 
-float CPDF_Dictionary::GetFloatFor(const ByteString& key) const {
+float CPDF_Dictionary::GetFloatFor(ByteStringView key) const {
   const CPDF_Object* p = GetObjectForInternal(key);
   return p ? p->GetNumber() : 0;
 }
@@ -158,92 +157,90 @@
 }
 
 const CPDF_Dictionary* CPDF_Dictionary::GetDictForInternal(
-    const ByteString& key) const {
+    ByteStringView key) const {
   const CPDF_Object* p = GetDirectObjectForInternal(key);
   return p ? p->GetDictInternal() : nullptr;
 }
 
 RetainPtr<const CPDF_Dictionary> CPDF_Dictionary::GetDictFor(
-    const ByteString& key) const {
+    ByteStringView key) const {
   return pdfium::WrapRetain(GetDictForInternal(key));
 }
 
 RetainPtr<CPDF_Dictionary> CPDF_Dictionary::GetMutableDictFor(
-    const ByteString& key) {
+    ByteStringView key) {
   return pdfium::WrapRetain(
       const_cast<CPDF_Dictionary*>(GetDictForInternal(key)));
 }
 
 RetainPtr<CPDF_Dictionary> CPDF_Dictionary::GetOrCreateDictFor(
-    const ByteString& key) {
+    ByteStringView key) {
   RetainPtr<CPDF_Dictionary> result = GetMutableDictFor(key);
   if (result) {
     return result;
   }
-  return SetNewFor<CPDF_Dictionary>(key);
+  return SetNewFor<CPDF_Dictionary>(ByteString(key));
 }
 
 const CPDF_Array* CPDF_Dictionary::GetArrayForInternal(
-    const ByteString& key) const {
+    ByteStringView key) const {
   return ToArray(GetDirectObjectForInternal(key));
 }
 
 RetainPtr<const CPDF_Array> CPDF_Dictionary::GetArrayFor(
-    const ByteString& key) const {
+    ByteStringView key) const {
   return pdfium::WrapRetain(GetArrayForInternal(key));
 }
 
-RetainPtr<CPDF_Array> CPDF_Dictionary::GetMutableArrayFor(
-    const ByteString& key) {
+RetainPtr<CPDF_Array> CPDF_Dictionary::GetMutableArrayFor(ByteStringView key) {
   return pdfium::WrapRetain(const_cast<CPDF_Array*>(GetArrayForInternal(key)));
 }
 
-RetainPtr<CPDF_Array> CPDF_Dictionary::GetOrCreateArrayFor(
-    const ByteString& key) {
+RetainPtr<CPDF_Array> CPDF_Dictionary::GetOrCreateArrayFor(ByteStringView key) {
   RetainPtr<CPDF_Array> result = GetMutableArrayFor(key);
   if (result) {
     return result;
   }
-  return SetNewFor<CPDF_Array>(key);
+  return SetNewFor<CPDF_Array>(ByteString(key));
 }
 
 const CPDF_Stream* CPDF_Dictionary::GetStreamForInternal(
-    const ByteString& key) const {
+    ByteStringView key) const {
   return ToStream(GetDirectObjectForInternal(key));
 }
 
 RetainPtr<const CPDF_Stream> CPDF_Dictionary::GetStreamFor(
-    const ByteString& key) const {
+    ByteStringView key) const {
   return pdfium::WrapRetain(GetStreamForInternal(key));
 }
 
 RetainPtr<CPDF_Stream> CPDF_Dictionary::GetMutableStreamFor(
-    const ByteString& key) {
+    ByteStringView key) {
   return pdfium::WrapRetain(
       const_cast<CPDF_Stream*>(GetStreamForInternal(key)));
 }
 
 const CPDF_Number* CPDF_Dictionary::GetNumberForInternal(
-    const ByteString& key) const {
+    ByteStringView key) const {
   return ToNumber(GetObjectForInternal(key));
 }
 
 RetainPtr<const CPDF_Number> CPDF_Dictionary::GetNumberFor(
-    const ByteString& key) const {
+    ByteStringView key) const {
   return pdfium::WrapRetain(GetNumberForInternal(key));
 }
 
 const CPDF_String* CPDF_Dictionary::GetStringForInternal(
-    const ByteString& key) const {
+    ByteStringView key) const {
   return ToString(GetObjectForInternal(key));
 }
 
 RetainPtr<const CPDF_String> CPDF_Dictionary::GetStringFor(
-    const ByteString& key) const {
+    ByteStringView key) const {
   return pdfium::WrapRetain(GetStringForInternal(key));
 }
 
-CFX_FloatRect CPDF_Dictionary::GetRectFor(const ByteString& key) const {
+CFX_FloatRect CPDF_Dictionary::GetRectFor(ByteStringView key) const {
   const CPDF_Array* pArray = GetArrayForInternal(key);
   if (pArray) {
     return pArray->GetRect();
@@ -251,7 +248,7 @@
   return CFX_FloatRect();
 }
 
-CFX_Matrix CPDF_Dictionary::GetMatrixFor(const ByteString& key) const {
+CFX_Matrix CPDF_Dictionary::GetMatrixFor(ByteStringView key) const {
   const CPDF_Array* pArray = GetArrayForInternal(key);
   if (pArray) {
     return pArray->GetMatrix();
diff --git a/core/fpdfapi/parser/cpdf_dictionary.h b/core/fpdfapi/parser/cpdf_dictionary.h
index 0e47729..cc143e0 100644
--- a/core/fpdfapi/parser/cpdf_dictionary.h
+++ b/core/fpdfapi/parser/cpdf_dictionary.h
@@ -43,41 +43,41 @@
   bool IsLocked() const { return !!lock_count_; }
 
   size_t size() const { return map_.size(); }
-  RetainPtr<const CPDF_Object> GetObjectFor(const ByteString& key) const;
-  RetainPtr<CPDF_Object> GetMutableObjectFor(const ByteString& key);
+  RetainPtr<const CPDF_Object> GetObjectFor(ByteStringView key) const;
+  RetainPtr<CPDF_Object> GetMutableObjectFor(ByteStringView key);
 
-  RetainPtr<const CPDF_Object> GetDirectObjectFor(const ByteString& key) const;
-  RetainPtr<CPDF_Object> GetMutableDirectObjectFor(const ByteString& key);
+  RetainPtr<const CPDF_Object> GetDirectObjectFor(ByteStringView key) const;
+  RetainPtr<CPDF_Object> GetMutableDirectObjectFor(ByteStringView key);
 
   // These will return the string representation of the object specified by
   // |key|, for any object type that has a string representation.
-  ByteString GetByteStringFor(const ByteString& key) const;
-  ByteString GetByteStringFor(const ByteString& key,
-                              const ByteString& default_str) const;
-  WideString GetUnicodeTextFor(const ByteString& key) const;
+  ByteString GetByteStringFor(ByteStringView key) const;
+  ByteString GetByteStringFor(ByteStringView key,
+                              ByteStringView default_str) const;
+  WideString GetUnicodeTextFor(ByteStringView key) const;
 
   // This will only return the string representation of a name object specified
   // by |key|. Useful when the PDF spec requires the value to be an object of
   // type name. i.e. /Foo and not (Foo).
-  ByteString GetNameFor(const ByteString& key) const;
+  ByteString GetNameFor(ByteStringView key) const;
 
-  bool GetBooleanFor(const ByteString& key, bool bDefault) const;
-  int GetIntegerFor(const ByteString& key) const;
-  int GetIntegerFor(const ByteString& key, int default_int) const;
-  int GetDirectIntegerFor(const ByteString& key) const;
-  float GetFloatFor(const ByteString& key) const;
-  RetainPtr<const CPDF_Dictionary> GetDictFor(const ByteString& key) const;
-  RetainPtr<CPDF_Dictionary> GetMutableDictFor(const ByteString& key);
-  RetainPtr<CPDF_Dictionary> GetOrCreateDictFor(const ByteString& key);
-  RetainPtr<const CPDF_Array> GetArrayFor(const ByteString& key) const;
-  RetainPtr<CPDF_Array> GetMutableArrayFor(const ByteString& key);
-  RetainPtr<CPDF_Array> GetOrCreateArrayFor(const ByteString& key);
-  RetainPtr<const CPDF_Stream> GetStreamFor(const ByteString& key) const;
-  RetainPtr<CPDF_Stream> GetMutableStreamFor(const ByteString& key);
-  RetainPtr<const CPDF_Number> GetNumberFor(const ByteString& key) const;
-  RetainPtr<const CPDF_String> GetStringFor(const ByteString& key) const;
-  CFX_FloatRect GetRectFor(const ByteString& key) const;
-  CFX_Matrix GetMatrixFor(const ByteString& key) const;
+  bool GetBooleanFor(ByteStringView key, bool bDefault) const;
+  int GetIntegerFor(ByteStringView key) const;
+  int GetIntegerFor(ByteStringView key, int default_int) const;
+  int GetDirectIntegerFor(ByteStringView key) const;
+  float GetFloatFor(ByteStringView key) const;
+  RetainPtr<const CPDF_Dictionary> GetDictFor(ByteStringView key) const;
+  RetainPtr<CPDF_Dictionary> GetMutableDictFor(ByteStringView key);
+  RetainPtr<CPDF_Dictionary> GetOrCreateDictFor(ByteStringView key);
+  RetainPtr<const CPDF_Array> GetArrayFor(ByteStringView key) const;
+  RetainPtr<CPDF_Array> GetMutableArrayFor(ByteStringView key);
+  RetainPtr<CPDF_Array> GetOrCreateArrayFor(ByteStringView key);
+  RetainPtr<const CPDF_Stream> GetStreamFor(ByteStringView key) const;
+  RetainPtr<CPDF_Stream> GetMutableStreamFor(ByteStringView key);
+  RetainPtr<const CPDF_Number> GetNumberFor(ByteStringView key) const;
+  RetainPtr<const CPDF_String> GetStringFor(ByteStringView key) const;
+  CFX_FloatRect GetRectFor(ByteStringView key) const;
+  CFX_Matrix GetMatrixFor(ByteStringView key) const;
 
   bool KeyExist(ByteStringView key) const;
   std::vector<ByteString> GetKeys() const;
@@ -133,13 +133,13 @@
   ~CPDF_Dictionary() override;
 
   // No guarantees about result lifetime, use with caution.
-  const CPDF_Object* GetObjectForInternal(const ByteString& key) const;
-  const CPDF_Object* GetDirectObjectForInternal(const ByteString& key) const;
-  const CPDF_Array* GetArrayForInternal(const ByteString& key) const;
-  const CPDF_Dictionary* GetDictForInternal(const ByteString& key) const;
-  const CPDF_Number* GetNumberForInternal(const ByteString& key) const;
-  const CPDF_Stream* GetStreamForInternal(const ByteString& key) const;
-  const CPDF_String* GetStringForInternal(const ByteString& key) const;
+  const CPDF_Object* GetObjectForInternal(ByteStringView key) const;
+  const CPDF_Object* GetDirectObjectForInternal(ByteStringView key) const;
+  const CPDF_Array* GetArrayForInternal(ByteStringView key) const;
+  const CPDF_Dictionary* GetDictForInternal(ByteStringView key) const;
+  const CPDF_Number* GetNumberForInternal(ByteStringView key) const;
+  const CPDF_Stream* GetStreamForInternal(ByteStringView key) const;
+  const CPDF_String* GetStringForInternal(ByteStringView key) const;
   CPDF_Object* SetForInternal(const ByteString& key,
                               RetainPtr<CPDF_Object> pObj);
 
diff --git a/core/fpdfapi/parser/cpdf_linearized_header.cpp b/core/fpdfapi/parser/cpdf_linearized_header.cpp
index d984e5f..81ad7d1 100644
--- a/core/fpdfapi/parser/cpdf_linearized_header.cpp
+++ b/core/fpdfapi/parser/cpdf_linearized_header.cpp
@@ -32,8 +32,7 @@
   if (!pDict->KeyExist(key)) {
     return !must_exist;
   }
-  // TODO(thestig): Avoid ByteString creation.
-  RetainPtr<const CPDF_Number> pNum = pDict->GetNumberFor(ByteString(key));
+  RetainPtr<const CPDF_Number> pNum = pDict->GetNumberFor(key);
   if (!pNum || !pNum->IsInteger()) {
     return false;
   }
diff --git a/core/fpdfapi/parser/cpdf_object_unittest.cpp b/core/fpdfapi/parser/cpdf_object_unittest.cpp
index 9e710ec..34e2972 100644
--- a/core/fpdfapi/parser/cpdf_object_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_object_unittest.cpp
@@ -154,7 +154,7 @@
         CPDF_DictionaryLocker locker1(dict1);
         for (const auto& item : locker1) {
           if (!Equal(item.second.Get(),
-                     dict2->GetObjectFor(item.first).Get())) {
+                     dict2->GetObjectFor(item.first.AsStringView()).Get())) {
             return false;
           }
         }
diff --git a/core/fpdfapi/parser/cpdf_object_walker_unittest.cpp b/core/fpdfapi/parser/cpdf_object_walker_unittest.cpp
index 761da82..3fe6b10 100644
--- a/core/fpdfapi/parser/cpdf_object_walker_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_object_walker_unittest.cpp
@@ -151,7 +151,7 @@
     }
     // Test that, dictionary key is correct.
     EXPECT_EQ(walker.GetParent()->AsDictionary()->GetObjectFor(
-                  walker.dictionary_key()),
+                  walker.dictionary_key().AsStringView()),
               obj);
   }
 }
diff --git a/core/fpdfapi/parser/cpdf_security_handler.cpp b/core/fpdfapi/parser/cpdf_security_handler.cpp
index efd63c6..2b7616d 100644
--- a/core/fpdfapi/parser/cpdf_security_handler.cpp
+++ b/core/fpdfapi/parser/cpdf_security_handler.cpp
@@ -247,7 +247,7 @@
       *cipher = CPDF_CryptoHandler::Cipher::kNone;
     } else {
       RetainPtr<const CPDF_Dictionary> pDefFilter =
-          pCryptFilters->GetDictFor(name);
+          pCryptFilters->GetDictFor(name.AsStringView());
       if (!pDefFilter) {
         return false;
       }
diff --git a/core/fpdfdoc/cpdf_annot.cpp b/core/fpdfdoc/cpdf_annot.cpp
index 73aed4a..5a0e186 100644
--- a/core/fpdfdoc/cpdf_annot.cpp
+++ b/core/fpdfdoc/cpdf_annot.cpp
@@ -120,7 +120,7 @@
     as = (!value.IsEmpty() && pDict->KeyExist(value.AsStringView())) ? value
                                                                      : "Off";
   }
-  return pDict->GetMutableStreamFor(as);
+  return pDict->GetMutableStreamFor(as.AsStringView());
 }
 
 }  // namespace
diff --git a/core/fpdfdoc/cpdf_apsettings.cpp b/core/fpdfdoc/cpdf_apsettings.cpp
index 458a31f..f3bff09 100644
--- a/core/fpdfdoc/cpdf_apsettings.cpp
+++ b/core/fpdfdoc/cpdf_apsettings.cpp
@@ -35,7 +35,8 @@
     return {CFX_Color::Type::kTransparent, 0};
   }
 
-  RetainPtr<const CPDF_Array> pEntry = dict_->GetArrayFor(csEntry);
+  RetainPtr<const CPDF_Array> pEntry =
+      dict_->GetArrayFor(csEntry.AsStringView());
   if (!pEntry) {
     return {CFX_Color::Type::kTransparent, 0};
   }
@@ -71,7 +72,8 @@
     return 0;
   }
 
-  RetainPtr<const CPDF_Array> pEntry = dict_->GetArrayFor(csEntry);
+  RetainPtr<const CPDF_Array> pEntry =
+      dict_->GetArrayFor(csEntry.AsStringView());
   return pEntry ? pEntry->GetFloatAt(index) : 0;
 }
 
@@ -80,7 +82,8 @@
     return CFX_Color();
   }
 
-  RetainPtr<const CPDF_Array> pEntry = dict_->GetArrayFor(csEntry);
+  RetainPtr<const CPDF_Array> pEntry =
+      dict_->GetArrayFor(csEntry.AsStringView());
   if (!pEntry) {
     return CFX_Color();
   }
@@ -102,12 +105,13 @@
 }
 
 WideString CPDF_ApSettings::GetCaption(const ByteString& csEntry) const {
-  return dict_ ? dict_->GetUnicodeTextFor(csEntry) : WideString();
+  return dict_ ? dict_->GetUnicodeTextFor(csEntry.AsStringView())
+               : WideString();
 }
 
 RetainPtr<CPDF_Stream> CPDF_ApSettings::GetIcon(
     const ByteString& csEntry) const {
-  return dict_ ? dict_->GetMutableStreamFor(csEntry) : nullptr;
+  return dict_ ? dict_->GetMutableStreamFor(csEntry.AsStringView()) : nullptr;
 }
 
 CPDF_IconFit CPDF_ApSettings::GetIconFit() const {
diff --git a/core/fpdfdoc/cpdf_bafontmap.cpp b/core/fpdfdoc/cpdf_bafontmap.cpp
index be71841..217a198 100644
--- a/core/fpdfdoc/cpdf_bafontmap.cpp
+++ b/core/fpdfdoc/cpdf_bafontmap.cpp
@@ -292,7 +292,7 @@
               pNormalDict->GetMutableDictFor("Resources")) {
         if (RetainPtr<CPDF_Dictionary> pResFontDict =
                 pNormalResDict->GetMutableDictFor("Font")) {
-          pFontDict = pResFontDict->GetMutableDictFor(*sAlias);
+          pFontDict = pResFontDict->GetMutableDictFor(sAlias->AsStringView());
         }
       }
     }
@@ -302,7 +302,7 @@
             pAcroFormDict->GetMutableDictFor("DR")) {
       if (RetainPtr<CPDF_Dictionary> pDRFontDict =
               pDRDict->GetMutableDictFor("Font")) {
-        pFontDict = pDRFontDict->GetMutableDictFor(*sAlias);
+        pFontDict = pDRFontDict->GetMutableDictFor(sAlias->AsStringView());
       }
     }
   }
@@ -323,11 +323,12 @@
       annot_dict_->GetOrCreateDictFor(pdfium::annotation::kAP);
 
   // to avoid checkbox and radiobutton
-  if (ToDictionary(pAPDict->GetObjectFor(ap_type_))) {
+  if (ToDictionary(pAPDict->GetObjectFor(ap_type_.AsStringView()))) {
     return;
   }
 
-  RetainPtr<CPDF_Stream> stream = pAPDict->GetMutableStreamFor(ap_type_);
+  RetainPtr<CPDF_Stream> stream =
+      pAPDict->GetMutableStreamFor(ap_type_.AsStringView());
   if (!stream) {
     stream =
         document_->NewIndirect<CPDF_Stream>(document_->New<CPDF_Dictionary>());
diff --git a/core/fpdfdoc/cpdf_filespec.cpp b/core/fpdfdoc/cpdf_filespec.cpp
index e3eca22..5f33b8e 100644
--- a/core/fpdfdoc/cpdf_filespec.cpp
+++ b/core/fpdfdoc/cpdf_filespec.cpp
@@ -152,7 +152,7 @@
       {"UF", "F", "DOS", "Mac", "Unix"}};
   size_t end = pDict->GetByteStringFor("FS") == "URL" ? 2 : std::size(kKeys);
   for (size_t i = 0; i < end; ++i) {
-    ByteString key = kKeys[i];
+    ByteStringView key = kKeys[i];
     if (!pDict->GetUnicodeTextFor(key).IsEmpty()) {
       RetainPtr<const CPDF_Stream> pStream = pFiles->GetStreamFor(key);
       if (pStream) {
diff --git a/core/fpdfdoc/cpdf_formcontrol.cpp b/core/fpdfdoc/cpdf_formcontrol.cpp
index 2f51e68..77e50d3 100644
--- a/core/fpdfdoc/cpdf_formcontrol.cpp
+++ b/core/fpdfdoc/cpdf_formcontrol.cpp
@@ -229,7 +229,7 @@
     RetainPtr<CPDF_Dictionary> pFonts = pDRDict->GetMutableDictFor("Font");
     if (ValidateFontResourceDict(pFonts.Get())) {
       RetainPtr<CPDF_Dictionary> pElement =
-          pFonts->GetMutableDictFor(font_name);
+          pFonts->GetMutableDictFor(font_name.AsStringView());
       if (pElement) {
         RetainPtr<CPDF_Font> pFont =
             form_->GetFontForElement(std::move(pElement));
@@ -256,7 +256,8 @@
     return nullptr;
   }
 
-  RetainPtr<CPDF_Dictionary> pElement = pFonts->GetMutableDictFor(font_name);
+  RetainPtr<CPDF_Dictionary> pElement =
+      pFonts->GetMutableDictFor(font_name.AsStringView());
   if (!pElement) {
     return nullptr;
   }
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index 887234d..93619ee 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -35,7 +35,7 @@
 
 RetainPtr<const CPDF_Object> GetFieldAttrRecursive(
     const CPDF_Dictionary* pFieldDict,
-    const ByteString& name,
+    ByteStringView name,
     int nLevel) {
   static constexpr int kGetFieldMaxRecursion = 32;
   if (!pFieldDict || nLevel > kGetFieldMaxRecursion) {
@@ -77,7 +77,7 @@
 RetainPtr<const CPDF_Object> CPDF_FormField::GetFieldAttrForDict(
     const CPDF_Dictionary* pFieldDict,
     const ByteString& name) {
-  return GetFieldAttrRecursive(pFieldDict, name, 0);
+  return GetFieldAttrRecursive(pFieldDict, name.AsStringView(), 0);
 }
 
 // static
@@ -85,7 +85,7 @@
     CPDF_Dictionary* pFieldDict,
     const ByteString& name) {
   return pdfium::WrapRetain(const_cast<CPDF_Object*>(
-      GetFieldAttrRecursive(pFieldDict, name, 0).Get()));
+      GetFieldAttrRecursive(pFieldDict, name.AsStringView(), 0).Get()));
 }
 
 // static
@@ -403,7 +403,7 @@
       if (iIndex < 0) {
         if (type_ == kRichText && !bDefault) {
           dict_->SetFor(pdfium::form_fields::kRV,
-                        dict_->GetObjectFor(key)->Clone());
+                        dict_->GetObjectFor(key.AsStringView())->Clone());
         }
         dict_->RemoveFor("I");
       } else {
@@ -975,7 +975,7 @@
 
 RetainPtr<const CPDF_Object> CPDF_FormField::GetFieldAttrInternal(
     const ByteString& name) const {
-  return GetFieldAttrRecursive(dict_.Get(), name, 0);
+  return GetFieldAttrRecursive(dict_.Get(), name.AsStringView(), 0);
 }
 
 const CPDF_Dictionary* CPDF_FormField::GetFieldDictInternal() const {
diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp
index e921bd3..03077e2 100644
--- a/core/fpdfdoc/cpdf_generateap.cpp
+++ b/core/fpdfdoc/cpdf_generateap.cpp
@@ -620,7 +620,7 @@
     CPDF_Dictionary* dr_font_dict,
     const ByteString& font_name) {
   RetainPtr<CPDF_Dictionary> font_dict =
-      dr_font_dict->GetMutableDictFor(font_name);
+      dr_font_dict->GetMutableDictFor(font_name.AsStringView());
   if (font_dict) {
     return font_dict;
   }
diff --git a/core/fpdfdoc/cpdf_interactiveform.cpp b/core/fpdfdoc/cpdf_interactiveform.cpp
index aec0dcc..1586adc 100644
--- a/core/fpdfdoc/cpdf_interactiveform.cpp
+++ b/core/fpdfdoc/cpdf_interactiveform.cpp
@@ -799,7 +799,8 @@
     return nullptr;
   }
 
-  RetainPtr<CPDF_Dictionary> element = font_dict->GetMutableDictFor(alias);
+  RetainPtr<CPDF_Dictionary> element =
+      font_dict->GetMutableDictFor(alias.AsStringView());
   if (!ValidateDictType(element.Get(), "Font")) {
     return nullptr;
   }
diff --git a/core/fpdfdoc/cpdf_nametree.cpp b/core/fpdfdoc/cpdf_nametree.cpp
index 47fae4b..2daad61 100644
--- a/core/fpdfdoc/cpdf_nametree.cpp
+++ b/core/fpdfdoc/cpdf_nametree.cpp
@@ -450,7 +450,8 @@
   if (!pDests) {
     return nullptr;
   }
-  return GetNamedDestFromObject(pDests->GetDirectObjectFor(name));
+  return GetNamedDestFromObject(
+      pDests->GetDirectObjectFor(name.AsStringView()));
 }
 
 }  // namespace
@@ -476,7 +477,8 @@
     return nullptr;
   }
 
-  RetainPtr<CPDF_Dictionary> pCategory = pNames->GetMutableDictFor(category);
+  RetainPtr<CPDF_Dictionary> pCategory =
+      pNames->GetMutableDictFor(category.AsStringView());
   if (!pCategory) {
     return nullptr;
   }
@@ -502,7 +504,8 @@
   }
 
   // Create the |category| dictionary if missing.
-  RetainPtr<CPDF_Dictionary> pCategory = pNames->GetMutableDictFor(category);
+  RetainPtr<CPDF_Dictionary> pCategory =
+      pNames->GetMutableDictFor(category.AsStringView());
   if (!pCategory) {
     pCategory = pDoc->NewIndirect<CPDF_Dictionary>();
     pCategory->SetNewFor<CPDF_Array>("Names");
diff --git a/core/fpdfdoc/cpdf_pagelabel.cpp b/core/fpdfdoc/cpdf_pagelabel.cpp
index 38cb2b8..74adad1 100644
--- a/core/fpdfdoc/cpdf_pagelabel.cpp
+++ b/core/fpdfdoc/cpdf_pagelabel.cpp
@@ -131,7 +131,7 @@
     label = label_dict->GetUnicodeTextFor("P");
   }
 
-  ByteString style = label_dict->GetByteStringFor("S", ByteString());
+  ByteString style = label_dict->GetByteStringFor("S", ByteStringView());
   int label_number =
       page_index - lower_bound.value().key + label_dict->GetIntegerFor("St", 1);
   label += GetLabelNumPortion(label_number, style);
diff --git a/core/fpdfdoc/cpdf_structtree.cpp b/core/fpdfdoc/cpdf_structtree.cpp
index eddd907..3b0e410 100644
--- a/core/fpdfdoc/cpdf_structtree.cpp
+++ b/core/fpdfdoc/cpdf_structtree.cpp
@@ -47,7 +47,7 @@
 
 ByteString CPDF_StructTree::GetRoleMapNameFor(const ByteString& type) const {
   if (role_map_) {
-    ByteString mapped = role_map_->GetNameFor(type);
+    ByteString mapped = role_map_->GetNameFor(type.AsStringView());
     if (!mapped.IsEmpty()) {
       return mapped;
     }
diff --git a/core/fpdfdoc/cpdf_viewerpreferences.cpp b/core/fpdfdoc/cpdf_viewerpreferences.cpp
index f6255fa..1cb8a62 100644
--- a/core/fpdfdoc/cpdf_viewerpreferences.cpp
+++ b/core/fpdfdoc/cpdf_viewerpreferences.cpp
@@ -48,7 +48,8 @@
     return std::nullopt;
   }
 
-  RetainPtr<const CPDF_Name> pName = ToName(pDict->GetObjectFor(bsKey));
+  RetainPtr<const CPDF_Name> pName =
+      ToName(pDict->GetObjectFor(bsKey.AsStringView()));
   if (!pName) {
     return std::nullopt;
   }
diff --git a/fpdfsdk/cpdfsdk_appstream.cpp b/fpdfsdk/cpdfsdk_appstream.cpp
index a6b4516..cddd133 100644
--- a/fpdfsdk/cpdfsdk_appstream.cpp
+++ b/fpdfsdk/cpdfsdk_appstream.cpp
@@ -1826,7 +1826,8 @@
 
 void CPDFSDK_AppStream::AddImage(const ByteString& sAPType,
                                  const CPDF_Stream* pImage) {
-  RetainPtr<CPDF_Stream> pStream = dict_->GetMutableStreamFor(sAPType);
+  RetainPtr<CPDF_Stream> pStream =
+      dict_->GetMutableStreamFor(sAPType.AsStringView());
   RetainPtr<CPDF_Dictionary> pStreamDict = pStream->GetMutableDict();
 
   const ByteString sImageAlias = pImage->GetDict()->GetByteStringFor("Name");
@@ -1848,13 +1849,14 @@
     parent_dict = dict_;
     key = sAPType;
   } else {
-    parent_dict = dict_->GetOrCreateDictFor(sAPType);
+    parent_dict = dict_->GetOrCreateDictFor(sAPType.AsStringView());
     key = sAPState;
   }
 
   // If `stream` is created by CreateModifiedAPStream(), then it is safe to
   // edit, as it is not shared.
-  RetainPtr<CPDF_Stream> stream = parent_dict->GetMutableStreamFor(key);
+  RetainPtr<CPDF_Stream> stream =
+      parent_dict->GetMutableStreamFor(key.AsStringView());
   CPDF_Document* doc = widget_->GetPageView()->GetPDFDocument();
   if (!doc->IsModifiedAPStream(stream.Get())) {
     auto new_stream_dict = doc->New<CPDF_Dictionary>();
diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp
index c232fe6..adb2813 100644
--- a/fpdfsdk/cpdfsdk_widget.cpp
+++ b/fpdfsdk/cpdfsdk_widget.cpp
@@ -396,7 +396,7 @@
     case FormFieldType::kCheckBox:
     case FormFieldType::kRadioButton:
       if (const CPDF_Dictionary* pSubDict = pSub->AsDictionary()) {
-        return !!pSubDict->GetStreamFor(GetAppState());
+        return !!pSubDict->GetStreamFor(GetAppState().AsStringView());
       }
       return false;
     default:
diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp
index 3ee31a6..d259908 100644
--- a/fpdfsdk/fpdf_annot.cpp
+++ b/fpdfsdk/fpdf_annot.cpp
@@ -724,12 +724,12 @@
   pAnnotDict->SetNewFor<CPDF_Number>("CA", A / 255.f);
 
   // Set the color of the annotation.
-  ByteString key = type == FPDFANNOT_COLORTYPE_InteriorColor ? "IC" : "C";
+  ByteStringView key = type == FPDFANNOT_COLORTYPE_InteriorColor ? "IC" : "C";
   RetainPtr<CPDF_Array> pColor = pAnnotDict->GetMutableArrayFor(key);
   if (pColor) {
     pColor->Clear();
   } else {
-    pColor = pAnnotDict->SetNewFor<CPDF_Array>(key);
+    pColor = pAnnotDict->SetNewFor<CPDF_Array>(ByteString(key));
   }
 
   pColor->AppendNew<CPDF_Number>(R / 255.f);
diff --git a/fpdfsdk/fpdf_attachment.cpp b/fpdfsdk/fpdf_attachment.cpp
index 4c0ea55..d468056 100644
--- a/fpdfsdk/fpdf_attachment.cpp
+++ b/fpdfsdk/fpdf_attachment.cpp
@@ -201,14 +201,14 @@
   // SAFETY: required from caller.
   auto buffer_span = UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen));
 
-  ByteString key_str = key;
-  RetainPtr<const CPDF_Object> object = params->GetObjectFor(key_str);
+  ByteStringView key_view(key);
+  RetainPtr<const CPDF_Object> object = params->GetObjectFor(key_view);
   if (!object || (!object->IsString() && !object->IsName())) {
     // Per API description, return an empty string in these cases.
     return Utf16EncodeMaybeCopyAndReturnLength(WideString(), buffer_span);
   }
 
-  if (key_str == kChecksumKey) {
+  if (key_view == kChecksumKey) {
     RetainPtr<const CPDF_String> string_object = ToString(object);
     if (string_object && string_object->IsHex()) {
       ByteString encoded =
diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp
index 30f8a54..eee23cb 100644
--- a/fpdfsdk/fpdf_edit_embeddertest.cpp
+++ b/fpdfsdk/fpdf_edit_embeddertest.cpp
@@ -234,9 +234,8 @@
     EXPECT_TRUE(font_desc->KeyExist(present));
     EXPECT_FALSE(font_desc->KeyExist(absent));
 
-    // TODO(thestig): Avoid ByteString creation.
-    auto streamAcc = pdfium::MakeRetain<CPDF_StreamAcc>(
-        font_desc->GetStreamFor(ByteString(present)));
+    auto streamAcc =
+        pdfium::MakeRetain<CPDF_StreamAcc>(font_desc->GetStreamFor(present));
     streamAcc->LoadAllDataRaw();
 
     // Check that the font stream is the one that was provided
diff --git a/fpdfsdk/fpdf_flatten.cpp b/fpdfsdk/fpdf_flatten.cpp
index dea1505..4518aba 100644
--- a/fpdfsdk/fpdf_flatten.cpp
+++ b/fpdfsdk/fpdf_flatten.cpp
@@ -426,7 +426,8 @@
       }
 
       if (!sAnnotState.IsEmpty()) {
-        original_ap_stream = original_ap_dict->GetMutableStreamFor(sAnnotState);
+        original_ap_stream =
+            original_ap_dict->GetMutableStreamFor(sAnnotState.AsStringView());
       } else {
         if (original_ap_dict->size() > 0) {
           CPDF_DictionaryLocker locker(original_ap_dict);
diff --git a/fpdfsdk/fpdf_transformpage.cpp b/fpdfsdk/fpdf_transformpage.cpp
index 41cc204..bcaa18b 100644
--- a/fpdfsdk/fpdf_transformpage.cpp
+++ b/fpdfsdk/fpdf_transformpage.cpp
@@ -43,7 +43,7 @@
 }
 
 bool GetBoundingBox(const CPDF_Page* page,
-                    const ByteString& key,
+                    ByteStringView key,
                     float* left,
                     float* bottom,
                     float* right,
diff --git a/fxjs/cjs_document.cpp b/fxjs/cjs_document.cpp
index 7c7eb13..852e2c8 100644
--- a/fxjs/cjs_document.cpp
+++ b/fxjs/cjs_document.cpp
@@ -774,7 +774,7 @@
 }
 
 CJS_Result CJS_Document::getPropertyInternal(CJS_Runtime* pRuntime,
-                                             const ByteString& propName) {
+                                             ByteStringView property_name) {
   if (!form_fill_env_) {
     return CJS_Result::Failure(JSMessage::kBadObjectError);
   }
@@ -786,7 +786,7 @@
   }
 
   return CJS_Result::Success(pRuntime->NewString(
-      pDictionary->GetUnicodeTextFor(propName).AsStringView()));
+      pDictionary->GetUnicodeTextFor(property_name).AsStringView()));
 }
 
 CJS_Result CJS_Document::get_creation_date(CJS_Runtime* pRuntime) {
diff --git a/fxjs/cjs_document.h b/fxjs/cjs_document.h
index 5a95059..87585de 100644
--- a/fxjs/cjs_document.h
+++ b/fxjs/cjs_document.h
@@ -300,7 +300,7 @@
                         pdfium::span<v8::Local<v8::Value>> params);
 
   CJS_Result getPropertyInternal(CJS_Runtime* pRuntime,
-                                 const ByteString& propName);
+                                 ByteStringView property_name);
 
   CPDF_InteractiveForm* GetCoreInteractiveForm();
   CPDFSDK_InteractiveForm* GetSDKInteractiveForm();
