Add more CPDF_Stream constructors

Instead of using the default CPDF_Stream constructor that creates
uninitialized objects, and then immediately initialize, just initialize
using the appropriate constructor. This will make it easier to get rid
of the default CPDF_Stream constructor in the near future.

Along the way, rename some variables to follow the style guide, and add
more comments to explain how CPDF_Stream constructors behave.

Change-Id: Iecfd106a502f1eb9a0b652c56e5a93977fdff2ef
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/115672
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Thomas Sepez <tsepez@google.com>
diff --git a/core/fpdfapi/edit/cpdf_pagecontentmanager.cpp b/core/fpdfapi/edit/cpdf_pagecontentmanager.cpp
index 4be22e6..f83852b 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentmanager.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentmanager.cpp
@@ -92,8 +92,7 @@
 }
 
 size_t CPDF_PageContentManager::AddStream(fxcrt::ostringstream* buf) {
-  auto new_stream = document_->NewIndirect<CPDF_Stream>();
-  new_stream->SetDataFromStringstream(buf);
+  auto new_stream = document_->NewIndirect<CPDF_Stream>(buf);
 
   // If there is one Content stream (not in an array), now there will be two, so
   // create an array with the old and the new one. The new one's index is 1.
@@ -146,8 +145,7 @@
   }
 
   if (GetContentsStream()) {
-    auto new_stream = document_->NewIndirect<CPDF_Stream>();
-    new_stream->SetDataFromStringstream(buf);
+    auto new_stream = document_->NewIndirect<CPDF_Stream>(buf);
     RetainPtr<CPDF_Dictionary> page_dict = page_obj_holder_->GetMutableDict();
     page_dict->SetNewFor<CPDF_Reference>("Contents", document_,
                                          new_stream->GetObjNum());
@@ -164,8 +162,7 @@
     return;
   }
 
-  auto new_stream = document_->NewIndirect<CPDF_Stream>();
-  new_stream->SetDataFromStringstream(buf);
+  auto new_stream = document_->NewIndirect<CPDF_Stream>(buf);
   stream_reference->SetRef(document_, new_stream->GetObjNum());
 }
 
diff --git a/core/fpdfapi/font/cpdf_tounicodemap_unittest.cpp b/core/fpdfapi/font/cpdf_tounicodemap_unittest.cpp
index 7a3015d..a9441ce 100644
--- a/core/fpdfapi/font/cpdf_tounicodemap_unittest.cpp
+++ b/core/fpdfapi/font/cpdf_tounicodemap_unittest.cpp
@@ -65,24 +65,21 @@
   {
     static constexpr uint8_t kInput1[] =
         "beginbfrange<FFFFFFFF><FFFFFFFF>[<0041>]endbfrange";
-    auto stream = pdfium::MakeRetain<CPDF_Stream>();
-    stream->SetData(pdfium::make_span(kInput1));
+    auto stream = pdfium::MakeRetain<CPDF_Stream>(pdfium::make_span(kInput1));
     CPDF_ToUnicodeMap map(stream);
     EXPECT_STREQ(L"A", map.Lookup(0xffffffff).c_str());
   }
   {
     static constexpr uint8_t kInput2[] =
         "beginbfrange<FFFFFFFF><FFFFFFFF><0042>endbfrange";
-    auto stream = pdfium::MakeRetain<CPDF_Stream>();
-    stream->SetData(pdfium::make_span(kInput2));
+    auto stream = pdfium::MakeRetain<CPDF_Stream>(pdfium::make_span(kInput2));
     CPDF_ToUnicodeMap map(stream);
     EXPECT_STREQ(L"B", map.Lookup(0xffffffff).c_str());
   }
   {
     static constexpr uint8_t kInput3[] =
         "beginbfrange<FFFFFFFF><FFFFFFFF><00410042>endbfrange";
-    auto stream = pdfium::MakeRetain<CPDF_Stream>();
-    stream->SetData(pdfium::make_span(kInput3));
+    auto stream = pdfium::MakeRetain<CPDF_Stream>(pdfium::make_span(kInput3));
     CPDF_ToUnicodeMap map(stream);
     EXPECT_STREQ(L"AB", map.Lookup(0xffffffff).c_str());
   }
@@ -93,8 +90,7 @@
     // Both the CIDs and the unicodes are different.
     static constexpr uint8_t kInput1[] =
         "beginbfchar<1><0041><2><0042>endbfchar";
-    auto stream = pdfium::MakeRetain<CPDF_Stream>();
-    stream->SetData(pdfium::make_span(kInput1));
+    auto stream = pdfium::MakeRetain<CPDF_Stream>(pdfium::make_span(kInput1));
     CPDF_ToUnicodeMap map(stream);
     EXPECT_EQ(1u, map.ReverseLookup(0x0041));
     EXPECT_EQ(2u, map.ReverseLookup(0x0042));
@@ -105,8 +101,7 @@
     // The same CID with different unicodes.
     static constexpr uint8_t kInput2[] =
         "beginbfrange<0><0><0041><0><0><0042>endbfrange";
-    auto stream = pdfium::MakeRetain<CPDF_Stream>();
-    stream->SetData(pdfium::make_span(kInput2));
+    auto stream = pdfium::MakeRetain<CPDF_Stream>(pdfium::make_span(kInput2));
     CPDF_ToUnicodeMap map(stream);
     EXPECT_EQ(0u, map.ReverseLookup(0x0041));
     EXPECT_EQ(0u, map.ReverseLookup(0x0042));
@@ -118,8 +113,7 @@
     static constexpr uint8_t kInput3[] =
         "beginbfrange<0><0>[<0041>]endbfrange\n"
         "beginbfchar<0><0041>endbfchar";
-    auto stream = pdfium::MakeRetain<CPDF_Stream>();
-    stream->SetData(pdfium::make_span(kInput3));
+    auto stream = pdfium::MakeRetain<CPDF_Stream>(pdfium::make_span(kInput3));
     CPDF_ToUnicodeMap map(stream);
     EXPECT_EQ(0u, map.ReverseLookup(0x0041));
     EXPECT_EQ(1u, map.GetUnicodeCountByCharcodeForTesting(0u));
diff --git a/core/fpdfapi/parser/cpdf_seekablemultistream_unittest.cpp b/core/fpdfapi/parser/cpdf_seekablemultistream_unittest.cpp
index 4bd3d85..68fbbe7 100644
--- a/core/fpdfapi/parser/cpdf_seekablemultistream_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_seekablemultistream_unittest.cpp
@@ -9,7 +9,6 @@
 
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fpdfapi/parser/cpdf_stream.h"
-#include "core/fxcrt/data_vector.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 TEST(CPDFSeekableMultiStreamTest, NoStreams) {
@@ -44,15 +43,9 @@
   ByteStringView one_view(kOne);
   ByteStringView two_view(kTwo);
   ByteStringView three_view(kThree);
-  auto stream1 = pdfium::MakeRetain<CPDF_Stream>(
-      DataVector<uint8_t>(one_view.begin(), one_view.end()),
-      pdfium::MakeRetain<CPDF_Dictionary>());
-  auto stream2 = pdfium::MakeRetain<CPDF_Stream>(
-      DataVector<uint8_t>(two_view.begin(), two_view.end()),
-      pdfium::MakeRetain<CPDF_Dictionary>());
-  auto stream3 = pdfium::MakeRetain<CPDF_Stream>(
-      DataVector<uint8_t>(three_view.begin(), three_view.end()),
-      pdfium::MakeRetain<CPDF_Dictionary>());
+  auto stream1 = pdfium::MakeRetain<CPDF_Stream>(one_view.raw_span());
+  auto stream2 = pdfium::MakeRetain<CPDF_Stream>(two_view.raw_span());
+  auto stream3 = pdfium::MakeRetain<CPDF_Stream>(three_view.raw_span());
 
   std::vector<RetainPtr<const CPDF_Stream>> streams;
   streams.push_back(std::move(stream1));
diff --git a/core/fpdfapi/parser/cpdf_stream.cpp b/core/fpdfapi/parser/cpdf_stream.cpp
index fa08ffa..a21d6c6 100644
--- a/core/fpdfapi/parser/cpdf_stream.cpp
+++ b/core/fpdfapi/parser/cpdf_stream.cpp
@@ -38,12 +38,29 @@
 
 CPDF_Stream::CPDF_Stream() = default;
 
-CPDF_Stream::CPDF_Stream(RetainPtr<CPDF_Dictionary> pDict)
-    : CPDF_Stream(DataVector<uint8_t>(), std::move(pDict)) {}
+CPDF_Stream::CPDF_Stream(RetainPtr<CPDF_Dictionary> dict)
+    : CPDF_Stream(DataVector<uint8_t>(), std::move(dict)) {}
 
-CPDF_Stream::CPDF_Stream(DataVector<uint8_t> pData,
-                         RetainPtr<CPDF_Dictionary> pDict)
-    : data_(std::move(pData)), dict_(std::move(pDict)) {
+CPDF_Stream::CPDF_Stream(pdfium::span<const uint8_t> span)
+    : dict_(pdfium::MakeRetain<CPDF_Dictionary>()) {
+  SetData(span);
+}
+
+CPDF_Stream::CPDF_Stream(fxcrt::ostringstream* stream)
+    : dict_(pdfium::MakeRetain<CPDF_Dictionary>()) {
+  SetDataFromStringstream(stream);
+}
+
+CPDF_Stream::CPDF_Stream(RetainPtr<IFX_SeekableReadStream> file,
+                         RetainPtr<CPDF_Dictionary> dict)
+    : data_(std::move(file)), dict_(std::move(dict)) {
+  SetLengthInDict(pdfium::base::checked_cast<int>(
+      absl::get<RetainPtr<IFX_SeekableReadStream>>(data_)->GetSize()));
+}
+
+CPDF_Stream::CPDF_Stream(DataVector<uint8_t> data,
+                         RetainPtr<CPDF_Dictionary> dict)
+    : data_(std::move(data)), dict_(std::move(dict)) {
   SetLengthInDict(pdfium::base::checked_cast<int>(
       absl::get<DataVector<uint8_t>>(data_).size()));
 }
diff --git a/core/fpdfapi/parser/cpdf_stream.h b/core/fpdfapi/parser/cpdf_stream.h
index f1bb78b..314992e 100644
--- a/core/fpdfapi/parser/cpdf_stream.h
+++ b/core/fpdfapi/parser/cpdf_stream.h
@@ -75,10 +75,23 @@
   // Uninitialized.
   CPDF_Stream();
 
-  // Initializes with empty data.
-  explicit CPDF_Stream(RetainPtr<CPDF_Dictionary> pDict);
+  // Initializes with empty data and /Length set to 0 in `dict`.
+  // If `dict` is null, then a new dictionary will be created instead.
+  explicit CPDF_Stream(RetainPtr<CPDF_Dictionary> dict);
 
-  CPDF_Stream(DataVector<uint8_t> pData, RetainPtr<CPDF_Dictionary> pDict);
+  // Copies `span` and `stream`, respectively. Creates a new dictionary with the
+  // /Length set.
+  explicit CPDF_Stream(pdfium::span<const uint8_t> span);
+  explicit CPDF_Stream(fxcrt::ostringstream* stream);
+
+  // Reads data from `file`. `dict` will have its /Length set based on `file`.
+  // If `dict` is null, then a new dictionary will be created instead.
+  CPDF_Stream(RetainPtr<IFX_SeekableReadStream> file,
+              RetainPtr<CPDF_Dictionary> dict);
+
+  // Takes `data`.
+  // If `dict` is null, then a new dictionary will be created instead.
+  CPDF_Stream(DataVector<uint8_t> data, RetainPtr<CPDF_Dictionary> dict);
   ~CPDF_Stream() override;
 
   const CPDF_Dictionary* GetDictInternal() const override;
diff --git a/core/fpdfapi/parser/cpdf_stream_acc_unittest.cpp b/core/fpdfapi/parser/cpdf_stream_acc_unittest.cpp
index 4821dc5..caf7c95 100644
--- a/core/fpdfapi/parser/cpdf_stream_acc_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_stream_acc_unittest.cpp
@@ -14,8 +14,7 @@
 #include "testing/invalid_seekable_read_stream.h"
 
 TEST(StreamAccTest, ReadRawDataFailed) {
-  auto stream = pdfium::MakeRetain<CPDF_Stream>();
-  stream->InitStreamFromFile(
+  auto stream = pdfium::MakeRetain<CPDF_Stream>(
       pdfium::MakeRetain<InvalidSeekableReadStream>(1024),
       pdfium::MakeRetain<CPDF_Dictionary>());
   auto stream_acc = pdfium::MakeRetain<CPDF_StreamAcc>(std::move(stream));
@@ -27,8 +26,7 @@
 // failure with UnownedPtr.
 TEST(StreamAccTest, DataStreamLifeTime) {
   constexpr uint8_t kData[] = {'a', 'b', 'c'};
-  auto stream = pdfium::MakeRetain<CPDF_Stream>();
-  stream->SetData(kData);
+  auto stream = pdfium::MakeRetain<CPDF_Stream>(kData);
   auto stream_acc = pdfium::MakeRetain<CPDF_StreamAcc>(stream);
   stream_acc->LoadAllDataRaw();
   stream.Reset();
diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp
index defaa06..7b35697 100644
--- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp
@@ -785,11 +785,11 @@
     }
   }
 
-  RetainPtr<CPDF_Stream> pStream;
+  RetainPtr<CPDF_Stream> stream;
   if (substream) {
     // It is unclear from CPDF_SyntaxParser's perspective what object
     // `substream` is ultimately holding references to. To avoid unexpectedly
-    // changing object lifetimes by handing `substream` to `pStream`, make a
+    // changing object lifetimes by handing `substream` to `stream`, make a
     // copy of the data here.
     auto data = FixedSizeDataVector<uint8_t>::Uninit(substream->GetSize());
     bool did_read = substream->ReadBlockAtOffset(data.span(), 0);
@@ -797,11 +797,11 @@
     auto data_as_stream =
         pdfium::MakeRetain<CFX_ReadOnlyVectorStream>(std::move(data));
 
-    pStream = pdfium::MakeRetain<CPDF_Stream>();
-    pStream->InitStreamFromFile(std::move(data_as_stream), std::move(pDict));
+    stream = pdfium::MakeRetain<CPDF_Stream>(std::move(data_as_stream),
+                                             std::move(pDict));
   } else {
     DCHECK(!len);
-    pStream = pdfium::MakeRetain<CPDF_Stream>(std::move(pDict));
+    stream = pdfium::MakeRetain<CPDF_Stream>(std::move(pDict));
   }
   const FX_FILESIZE end_stream_offset = GetPos();
   memset(m_WordBuffer, 0, kEndObjStr.GetLength() + 1);
@@ -821,7 +821,7 @@
       memcmp(m_WordBuffer, kEndObjStr.raw_str(), kEndObjStr.GetLength()) == 0) {
     SetPos(end_stream_offset);
   }
-  return pStream;
+  return stream;
 }
 
 uint32_t CPDF_SyntaxParser::GetDirectNum() {
diff --git a/core/fpdfdoc/cpdf_filespec_unittest.cpp b/core/fpdfdoc/cpdf_filespec_unittest.cpp
index e898076..48eaa8a 100644
--- a/core/fpdfdoc/cpdf_filespec_unittest.cpp
+++ b/core/fpdfdoc/cpdf_filespec_unittest.cpp
@@ -16,7 +16,6 @@
 #include "core/fpdfapi/parser/cpdf_reference.h"
 #include "core/fpdfapi/parser/cpdf_stream.h"
 #include "core/fpdfapi/parser/cpdf_string.h"
-#include "core/fxcrt/data_vector.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/test_support.h"
 
@@ -176,10 +175,9 @@
       dict_obj->SetNewFor<CPDF_String>(keys[i], file_name);
 
       // Set the file stream.
-      size_t buf_len = strlen(streams[i]) + 1;
-      auto stream_object = object_holder.NewIndirect<CPDF_Stream>(
-          DataVector<uint8_t>(streams[i], streams[i] + buf_len),
-          pdfium::MakeRetain<CPDF_Dictionary>());
+      auto stream_object =
+          object_holder.NewIndirect<CPDF_Stream>(pdfium::as_bytes(
+              pdfium::make_span(streams[i], strlen(streams[i]) + 1)));
       ASSERT_TRUE(stream_object);
       const uint32_t stream_object_number = stream_object->GetObjNum();
       ASSERT_GT(stream_object_number, 0u);
@@ -219,9 +217,8 @@
     // Add a file stream to the embedded files dictionary.
     RetainPtr<CPDF_Dictionary> file_dict = dict_obj->GetMutableDictFor("EF");
     static constexpr char kHello[] = "hello";
-    auto stream_object = object_holder.NewIndirect<CPDF_Stream>(
-        DataVector<uint8_t>(std::begin(kHello), std::end(kHello)),
-        pdfium::MakeRetain<CPDF_Dictionary>());
+    auto stream_object =
+        object_holder.NewIndirect<CPDF_Stream>(pdfium::as_byte_span(kHello));
     ASSERT_TRUE(stream_object);
     const uint32_t stream_object_number = stream_object->GetObjNum();
     ASSERT_GT(stream_object_number, 0u);
diff --git a/core/fpdfdoc/cpdf_metadata_unittest.cpp b/core/fpdfdoc/cpdf_metadata_unittest.cpp
index 4bd30ed..0618fba 100644
--- a/core/fpdfdoc/cpdf_metadata_unittest.cpp
+++ b/core/fpdfdoc/cpdf_metadata_unittest.cpp
@@ -15,8 +15,8 @@
       "<adhocwf:version>1.1</adhocwf:version>\n"
       "</node>";
 
-  auto stream = pdfium::MakeRetain<CPDF_Stream>();
-  stream->SetData(ByteStringView(data).raw_span());
+  auto stream =
+      pdfium::MakeRetain<CPDF_Stream>(ByteStringView(data).raw_span());
   CPDF_Metadata metadata(stream);
 
   auto results = metadata.CheckForSharedForm();
@@ -32,8 +32,8 @@
       "<adhocwf:version>1.1</adhocwf:version>\n"
       "</node>";
 
-  auto stream = pdfium::MakeRetain<CPDF_Stream>();
-  stream->SetData(ByteStringView(data).raw_span());
+  auto stream =
+      pdfium::MakeRetain<CPDF_Stream>(ByteStringView(data).raw_span());
   CPDF_Metadata metadata(stream);
 
   auto results = metadata.CheckForSharedForm();
@@ -49,8 +49,8 @@
       "<adhocwf:version>1.1</adhocwf:version>\n"
       "</node>";
 
-  auto stream = pdfium::MakeRetain<CPDF_Stream>();
-  stream->SetData(ByteStringView(data).raw_span());
+  auto stream =
+      pdfium::MakeRetain<CPDF_Stream>(ByteStringView(data).raw_span());
   CPDF_Metadata metadata(stream);
 
   auto results = metadata.CheckForSharedForm();
@@ -66,8 +66,8 @@
       "<adhocwf:version>1.1</adhocwf:version>\n"
       "</node>";
 
-  auto stream = pdfium::MakeRetain<CPDF_Stream>();
-  stream->SetData(ByteStringView(data).raw_span());
+  auto stream =
+      pdfium::MakeRetain<CPDF_Stream>(ByteStringView(data).raw_span());
   CPDF_Metadata metadata(stream);
 
   auto results = metadata.CheckForSharedForm();
@@ -84,8 +84,8 @@
       "</node>"
       "</parent></grandparent>";
 
-  auto stream = pdfium::MakeRetain<CPDF_Stream>();
-  stream->SetData(ByteStringView(data).raw_span());
+  auto stream =
+      pdfium::MakeRetain<CPDF_Stream>(ByteStringView(data).raw_span());
   CPDF_Metadata metadata(stream);
 
   auto results = metadata.CheckForSharedForm();
@@ -98,8 +98,8 @@
       "<?xml charset=\"utf-8\"?>\n"
       "<node></node>";
 
-  auto stream = pdfium::MakeRetain<CPDF_Stream>();
-  stream->SetData(ByteStringView(data).raw_span());
+  auto stream =
+      pdfium::MakeRetain<CPDF_Stream>(ByteStringView(data).raw_span());
   CPDF_Metadata metadata(stream);
 
   auto results = metadata.CheckForSharedForm();
@@ -131,8 +131,8 @@
       "</node>"
       "</parent>";
 
-  auto stream = pdfium::MakeRetain<CPDF_Stream>();
-  stream->SetData(ByteStringView(kData).raw_span());
+  auto stream =
+      pdfium::MakeRetain<CPDF_Stream>(ByteStringView(kData).raw_span());
   CPDF_Metadata metadata(stream);
 
   auto results = metadata.CheckForSharedForm();
@@ -147,8 +147,8 @@
       "<adhocwf:version>1.1</adhocwf:version>\n"
       "</node>";
 
-  auto stream = pdfium::MakeRetain<CPDF_Stream>();
-  stream->SetData(ByteStringView(data).raw_span());
+  auto stream =
+      pdfium::MakeRetain<CPDF_Stream>(ByteStringView(data).raw_span());
   CPDF_Metadata metadata(stream);
 
   auto results = metadata.CheckForSharedForm();
@@ -177,8 +177,8 @@
       "</node3>"
       "</grandparent>";
 
-  auto stream = pdfium::MakeRetain<CPDF_Stream>();
-  stream->SetData(ByteStringView(data).raw_span());
+  auto stream =
+      pdfium::MakeRetain<CPDF_Stream>(ByteStringView(data).raw_span());
   CPDF_Metadata metadata(stream);
 
   auto results = metadata.CheckForSharedForm();
diff --git a/fpdfsdk/fpdf_edittext.cpp b/fpdfsdk/fpdf_edittext.cpp
index ee8212a..90476e0 100644
--- a/fpdfsdk/fpdf_edittext.cpp
+++ b/fpdfsdk/fpdf_edittext.cpp
@@ -125,15 +125,14 @@
   pFontDesc->SetNewFor<CPDF_Number>("CapHeight", pFont->GetAscent());
   pFontDesc->SetNewFor<CPDF_Number>("StemV", pFont->IsBold() ? 120 : 70);
 
-  auto pStream = pDoc->NewIndirect<CPDF_Stream>();
-  pStream->SetData(span);
+  auto stream = pDoc->NewIndirect<CPDF_Stream>(span);
   // TODO(npm): Lengths for Type1 fonts.
   if (font_type == FPDF_FONT_TRUETYPE) {
-    pStream->GetMutableDict()->SetNewFor<CPDF_Number>(
+    stream->GetMutableDict()->SetNewFor<CPDF_Number>(
         "Length1", static_cast<int>(span.size()));
   }
   ByteString fontFile = font_type == FPDF_FONT_TYPE1 ? "FontFile" : "FontFile2";
-  pFontDesc->SetNewFor<CPDF_Reference>(fontFile, pDoc, pStream->GetObjNum());
+  pFontDesc->SetNewFor<CPDF_Reference>(fontFile, pDoc, stream->GetObjNum());
   return pFontDesc;
 }
 
@@ -289,8 +288,7 @@
   buffer << "endbfrange\n";
   buffer << ToUnicodeEnd;
   // TODO(npm): Encrypt / Compress?
-  auto stream = pDoc->NewIndirect<CPDF_Stream>();
-  stream->SetDataFromStringstream(&buffer);
+  auto stream = pDoc->NewIndirect<CPDF_Stream>(&buffer);
   return stream;
 }
 
diff --git a/fpdfsdk/fpdf_save.cpp b/fpdfsdk/fpdf_save.cpp
index 37a1905..0d771d2 100644
--- a/fpdfsdk/fpdf_save.cpp
+++ b/fpdfsdk/fpdf_save.cpp
@@ -111,18 +111,18 @@
         pdfium::MakeRetain<CFX_MemoryStream>();
     if (pContext->SaveDatasetsPackage(pFileWrite) &&
         pFileWrite->GetSize() > 0) {
-      auto pDataDict = pPDFDocument->New<CPDF_Dictionary>();
       if (iDataSetsIndex != -1) {
         if (pDataSetsStream) {
-          pDataSetsStream->InitStreamFromFile(pFileWrite, std::move(pDataDict));
+          pDataSetsStream->InitStreamFromFile(
+              pFileWrite, pPDFDocument->New<CPDF_Dictionary>());
         }
       } else {
-        auto pData = pPDFDocument->NewIndirect<CPDF_Stream>();
-        pData->InitStreamFromFile(pFileWrite, std::move(pDataDict));
+        auto data_stream = pPDFDocument->NewIndirect<CPDF_Stream>(
+            pFileWrite, pPDFDocument->New<CPDF_Dictionary>());
         int iLast = fxcrt::CollectionSize<int>(*pArray) - 2;
         pArray->InsertNewAt<CPDF_String>(iLast, "datasets", false);
         pArray->InsertNewAt<CPDF_Reference>(iLast + 1, pPDFDocument,
-                                            pData->GetObjNum());
+                                            data_stream->GetObjNum());
       }
       fileList->push_back(std::move(pFileWrite));
     }
@@ -132,17 +132,18 @@
     RetainPtr<IFX_SeekableStream> pFileWrite =
         pdfium::MakeRetain<CFX_MemoryStream>();
     if (pContext->SaveFormPackage(pFileWrite) && pFileWrite->GetSize() > 0) {
-      auto pDataDict = pPDFDocument->New<CPDF_Dictionary>();
       if (iFormIndex != -1) {
-        if (pFormStream)
-          pFormStream->InitStreamFromFile(pFileWrite, std::move(pDataDict));
+        if (pFormStream) {
+          pFormStream->InitStreamFromFile(pFileWrite,
+                                          pPDFDocument->New<CPDF_Dictionary>());
+        }
       } else {
-        auto pData = pPDFDocument->NewIndirect<CPDF_Stream>();
-        pData->InitStreamFromFile(pFileWrite, std::move(pDataDict));
+        auto data_stream = pPDFDocument->NewIndirect<CPDF_Stream>(
+            pFileWrite, pPDFDocument->New<CPDF_Dictionary>());
         int iLast = fxcrt::CollectionSize<int>(*pArray) - 2;
         pArray->InsertNewAt<CPDF_String>(iLast, "form", false);
         pArray->InsertNewAt<CPDF_Reference>(iLast + 1, pPDFDocument,
-                                            pData->GetObjNum());
+                                            data_stream->GetObjNum());
       }
       fileList->push_back(std::move(pFileWrite));
     }
diff --git a/testing/fuzzers/pdf_cpdf_tounicodemap_fuzzer.cc b/testing/fuzzers/pdf_cpdf_tounicodemap_fuzzer.cc
index 5f18564..9040eff 100644
--- a/testing/fuzzers/pdf_cpdf_tounicodemap_fuzzer.cc
+++ b/testing/fuzzers/pdf_cpdf_tounicodemap_fuzzer.cc
@@ -28,8 +28,7 @@
 
   std::vector<uint8_t> remaining =
       data_provider.ConsumeRemainingBytes<uint8_t>();
-  auto stream = pdfium::MakeRetain<CPDF_Stream>();
-  stream->SetData(remaining);
+  auto stream = pdfium::MakeRetain<CPDF_Stream>(remaining);
 
   auto to_unicode_map = std::make_unique<CPDF_ToUnicodeMap>(std::move(stream));
   to_unicode_map->Lookup(charcode_to_lookup);