diff --git a/core/fpdfapi/parser/cpdf_name.cpp b/core/fpdfapi/parser/cpdf_name.cpp
index 721c58a..46c1a1a 100644
--- a/core/fpdfapi/parser/cpdf_name.cpp
+++ b/core/fpdfapi/parser/cpdf_name.cpp
@@ -48,7 +48,7 @@
 }
 
 WideString CPDF_Name::GetUnicodeText() const {
-  return PDF_DecodeText(m_Name);
+  return PDF_DecodeText(m_Name.AsRawSpan());
 }
 
 bool CPDF_Name::WriteTo(IFX_ArchiveStream* archive,
diff --git a/core/fpdfapi/parser/cpdf_stream.cpp b/core/fpdfapi/parser/cpdf_stream.cpp
index 6ebca95..0c6b5c4 100644
--- a/core/fpdfapi/parser/cpdf_stream.cpp
+++ b/core/fpdfapi/parser/cpdf_stream.cpp
@@ -176,7 +176,7 @@
 WideString CPDF_Stream::GetUnicodeText() const {
   auto pAcc = pdfium::MakeRetain<CPDF_StreamAcc>(this);
   pAcc->LoadAllDataFiltered();
-  return PDF_DecodeText(pAcc->GetData(), pAcc->GetSize());
+  return PDF_DecodeText(pAcc->GetSpan());
 }
 
 bool CPDF_Stream::WriteTo(IFX_ArchiveStream* archive,
diff --git a/core/fpdfapi/parser/cpdf_string.cpp b/core/fpdfapi/parser/cpdf_string.cpp
index 08f3db3..5a6222e 100644
--- a/core/fpdfapi/parser/cpdf_string.cpp
+++ b/core/fpdfapi/parser/cpdf_string.cpp
@@ -64,7 +64,7 @@
 }
 
 WideString CPDF_String::GetUnicodeText() const {
-  return PDF_DecodeText(m_String);
+  return PDF_DecodeText(m_String.AsRawSpan());
 }
 
 bool CPDF_String::WriteTo(IFX_ArchiveStream* archive,
diff --git a/core/fpdfapi/parser/fpdf_parser_decode.cpp b/core/fpdfapi/parser/fpdf_parser_decode.cpp
index 5e496fd..a2529c5 100644
--- a/core/fpdfapi/parser/fpdf_parser_decode.cpp
+++ b/core/fpdfapi/parser/fpdf_parser_decode.cpp
@@ -454,20 +454,20 @@
   return true;
 }
 
-WideString PDF_DecodeText(const uint8_t* src_data, uint32_t src_len) {
+WideString PDF_DecodeText(pdfium::span<const uint8_t> span) {
   int dest_pos = 0;
   WideString result;
-  if (src_len >= 2 && ((src_data[0] == 0xfe && src_data[1] == 0xff) ||
-                       (src_data[0] == 0xff && src_data[1] == 0xfe))) {
-    uint32_t max_chars = (src_len - 2) / 2;
+  if (span.size() >= 2 && ((span[0] == 0xfe && span[1] == 0xff) ||
+                           (span[0] == 0xff && span[1] == 0xfe))) {
+    uint32_t max_chars = (span.size() - 2) / 2;
     if (!max_chars)
       return result;
 
     pdfium::span<wchar_t> dest_buf = result.GetBuffer(max_chars);
     uint16_t (*GetUnicodeFromBytes)(const uint8_t*) =
-        src_data[0] == 0xfe ? GetUnicodeFromBigEndianBytes
-                            : GetUnicodeFromLittleEndianBytes;
-    const uint8_t* unicode_str = src_data + 2;
+        span[0] == 0xfe ? GetUnicodeFromBigEndianBytes
+                        : GetUnicodeFromLittleEndianBytes;
+    const uint8_t* unicode_str = &span[2];
     for (uint32_t i = 0; i < max_chars * 2; i += 2) {
       uint16_t unicode = GetUnicodeFromBytes(unicode_str + i);
 
@@ -490,20 +490,15 @@
       dest_buf[dest_pos++] = unicode;
     }
   } else {
-    pdfium::span<wchar_t> dest_buf = result.GetBuffer(src_len);
-    for (uint32_t i = 0; i < src_len; ++i)
-      dest_buf[i] = PDFDocEncoding[src_data[i]];
-    dest_pos = src_len;
+    pdfium::span<wchar_t> dest_buf = result.GetBuffer(span.size());
+    for (uint32_t i = 0; i < span.size(); ++i)
+      dest_buf[i] = PDFDocEncoding[span[i]];
+    dest_pos = span.size();
   }
   result.ReleaseBuffer(dest_pos);
   return result;
 }
 
-WideString PDF_DecodeText(const ByteString& bstr) {
-  return PDF_DecodeText(reinterpret_cast<const uint8_t*>(bstr.c_str()),
-                        bstr.GetLength());
-}
-
 ByteString PDF_EncodeText(const WideString& str) {
   size_t i = 0;
   size_t len = str.GetLength();
diff --git a/core/fpdfapi/parser/fpdf_parser_decode.h b/core/fpdfapi/parser/fpdf_parser_decode.h
index 2652630..25213c5 100644
--- a/core/fpdfapi/parser/fpdf_parser_decode.h
+++ b/core/fpdfapi/parser/fpdf_parser_decode.h
@@ -24,8 +24,7 @@
 bool ValidateDecoderPipeline(const CPDF_Array* pDecoders);
 
 ByteString PDF_EncodeString(const ByteString& src, bool bHex);
-WideString PDF_DecodeText(const uint8_t* pData, uint32_t size);
-WideString PDF_DecodeText(const ByteString& bstr);
+WideString PDF_DecodeText(pdfium::span<const uint8_t> span);
 ByteString PDF_EncodeText(const WideString& str);
 
 std::unique_ptr<CCodec_ScanlineDecoder> CreateFaxDecoder(
diff --git a/core/fpdfdoc/cpdf_formcontrol.cpp b/core/fpdfdoc/cpdf_formcontrol.cpp
index 7ff0914..7044606 100644
--- a/core/fpdfdoc/cpdf_formcontrol.cpp
+++ b/core/fpdfdoc/cpdf_formcontrol.cpp
@@ -76,7 +76,7 @@
     csOn = pArray->GetStringAt(m_pField->GetControlIndex(this));
   if (csOn.IsEmpty())
     csOn = "Yes";
-  return PDF_DecodeText(csOn);
+  return PDF_DecodeText(csOn.AsRawSpan());
 }
 
 bool CPDF_FormControl::IsChecked() const {
diff --git a/fpdfsdk/cpdfsdk_interactiveform.cpp b/fpdfsdk/cpdfsdk_interactiveform.cpp
index c48ff70..1e761cf 100644
--- a/fpdfsdk/cpdfsdk_interactiveform.cpp
+++ b/fpdfsdk/cpdfsdk_interactiveform.cpp
@@ -101,7 +101,7 @@
     name = pField->GetUnicodeTextFor("T");
     ByteString name_b = name.ToDefANSI();
     ByteString csBValue = pField->GetStringFor("V");
-    WideString csWValue = PDF_DecodeText(csBValue);
+    WideString csWValue = PDF_DecodeText(csBValue.AsRawSpan());
     ByteString csValue_b = csWValue.ToDefANSI();
     fdfEncodedData << name_b << "=" << csValue_b;
     if (i != pFields->size() - 1)
diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp
index 571f6eb..e46c3db 100644
--- a/fpdfsdk/fpdf_view.cpp
+++ b/fpdfsdk/fpdf_view.cpp
@@ -1052,8 +1052,9 @@
     return nullptr;
 
   CPDF_NameTree name_tree(pDoc, "Dests");
+  ByteStringView name_view(name);
   return FPDFDestFromCPDFArray(
-      name_tree.LookupNamedDest(pDoc, PDF_DecodeText(ByteString(name))));
+      name_tree.LookupNamedDest(pDoc, PDF_DecodeText(name_view.span())));
 }
 
 #ifdef PDF_ENABLE_V8
@@ -1145,10 +1146,10 @@
 
     index -= count;
     int i = 0;
-    ByteString bsName;
+    ByteStringView bsName;
     CPDF_DictionaryLocker locker(pDest);
     for (const auto& it : locker) {
-      bsName = it.first;
+      bsName = it.first.AsStringView();
       pDestObj = it.second.get();
       if (!pDestObj)
         continue;
@@ -1156,7 +1157,7 @@
         break;
       i++;
     }
-    wsName = PDF_DecodeText(bsName);
+    wsName = PDF_DecodeText(bsName.span());
   } else {
     pDestObj = nameTree.LookupValueAndName(index, &wsName);
   }
