diff --git a/BUILD.gn b/BUILD.gn
index 029a8ab..b7b3ff6 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -443,12 +443,8 @@
     "core/fpdfapi/edit/cpdf_encryptor.h",
     "core/fpdfapi/edit/cpdf_flateencoder.cpp",
     "core/fpdfapi/edit/cpdf_flateencoder.h",
-    "core/fpdfapi/edit/cpdf_objectstream.cpp",
-    "core/fpdfapi/edit/cpdf_objectstream.h",
     "core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp",
     "core/fpdfapi/edit/cpdf_pagecontentgenerator.h",
-    "core/fpdfapi/edit/cpdf_xrefstream.cpp",
-    "core/fpdfapi/edit/cpdf_xrefstream.h",
     "core/fpdfapi/font/cpdf_cidfont.cpp",
     "core/fpdfapi/font/cpdf_cidfont.h",
     "core/fpdfapi/font/cpdf_font.cpp",
diff --git a/core/fpdfapi/edit/cpdf_creator.cpp b/core/fpdfapi/edit/cpdf_creator.cpp
index e782de3..b318c7a 100644
--- a/core/fpdfapi/edit/cpdf_creator.cpp
+++ b/core/fpdfapi/edit/cpdf_creator.cpp
@@ -10,8 +10,6 @@
 
 #include "core/fpdfapi/edit/cpdf_encryptor.h"
 #include "core/fpdfapi/edit/cpdf_flateencoder.h"
-#include "core/fpdfapi/edit/cpdf_objectstream.h"
-#include "core/fpdfapi/edit/cpdf_xrefstream.h"
 #include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_crypto_handler.h"
 #include "core/fpdfapi/parser/cpdf_document.h"
@@ -24,7 +22,6 @@
 
 namespace {
 
-const uint32_t kXRefStreamMaxSize = 10000;
 const size_t kArchiveBufferSize = 32768;
 
 class CFX_FileBufferArchive : public IFX_ArchiveStream {
@@ -161,40 +158,6 @@
 
 CPDF_Creator::~CPDF_Creator() {}
 
-bool CPDF_Creator::IsXRefNeedEnd() {
-  if (!IsIncremental())
-    return false;
-  return m_pXRefStream->CountIndexArrayItems() >= kXRefStreamMaxSize;
-}
-
-bool CPDF_Creator::WriteIndirectObjectToStream(uint32_t objnum,
-                                               const uint8_t* pBuffer,
-                                               uint32_t dwSize) {
-  if (!m_pXRefStream)
-    return true;
-
-  m_pXRefStream->AddObjectNumberToIndexArray(objnum);
-  if (!m_pXRefStream->CompressIndirectObject(objnum, pBuffer, dwSize, this))
-    return false;
-  if (!IsXRefNeedEnd())
-    return true;
-  if (!m_pXRefStream->End(this, false) || !m_pXRefStream->Start())
-    return false;
-  return true;
-}
-
-bool CPDF_Creator::AppendObjectNumberToXRef(uint32_t objnum) {
-  if (!m_pXRefStream)
-    return true;
-
-  m_pXRefStream->AddObjectNumberToIndexArray(objnum);
-  if (!IsXRefNeedEnd())
-    return true;
-  if (!m_pXRefStream->End(this, false) || !m_pXRefStream->Start())
-    return false;
-  return true;
-}
-
 bool CPDF_Creator::WriteStream(const CPDF_Object* pStream,
                                uint32_t objnum,
                                CPDF_CryptoHandler* pCrypto) {
@@ -231,41 +194,7 @@
     return false;
   }
 
-  if (!m_Archive->WriteString("\r\nendobj\r\n") ||
-      !AppendObjectNumberToXRef(objnum)) {
-    return false;
-  }
-  return true;
-}
-
-bool CPDF_Creator::WriteIndirectObj(const CPDF_Object* pObj) {
-  uint32_t objnum = pObj->GetObjNum();
-  if (!m_pXRefStream || (m_pParser && m_pParser->GetObjectGenNum(objnum) > 0) ||
-      pObj->IsNumber()) {
-    return WriteIndirectObj(objnum, pObj);
-  }
-
-  CPDF_Dictionary* pDict = pObj->GetDict();
-  if (pObj->IsStream()) {
-    if (pDict && pDict->GetStringFor("Type") == "XRef")
-      return true;
-    return WriteIndirectObj(objnum, pObj);
-  }
-
-  if (pDict &&
-      (pDict == m_pDocument->GetRoot() || pDict == m_pEncryptDict ||
-       pDict->IsSignatureDict() || pDict->GetStringFor("Type") == "Page")) {
-    return WriteIndirectObj(objnum, pObj);
-  }
-
-  m_pXRefStream->AddObjectNumberToIndexArray(objnum);
-  if (!m_pXRefStream->CompressIndirectObject(objnum, pObj, this))
-    return false;
-  if (!IsXRefNeedEnd())
-    return true;
-  if (!m_pXRefStream->End(this, false) || !m_pXRefStream->Start())
-    return false;
-  return true;
+  return m_Archive->WriteString("\r\nendobj\r\n");
 }
 
 bool CPDF_Creator::WriteDirectObj(uint32_t objnum,
@@ -388,13 +317,13 @@
   bool bExistInMap = !!m_pDocument->GetIndirectObject(objnum);
   const uint8_t object_type = m_pParser->GetObjectType(objnum);
   if (m_pParser->IsVersionUpdated() || m_bSecurityChanged || bExistInMap ||
-      (object_type == 2 && m_pEncryptDict && !m_pXRefStream)) {
+      (object_type == 2 && m_pEncryptDict)) {
     CPDF_Object* pObj = m_pDocument->GetOrParseIndirectObject(objnum);
     if (!pObj) {
       m_ObjectOffsets.erase(objnum);
       return true;
     }
-    if (!WriteIndirectObj(pObj))
+    if (!WriteIndirectObj(pObj->GetObjNum(), pObj))
       return false;
     if (!bExistInMap)
       m_pDocument->DeleteIndirectObject(objnum);
@@ -405,24 +334,15 @@
     if (!pBuffer)
       return true;
     if (object_type == 2) {
-      if (m_pXRefStream) {
-        if (!WriteIndirectObjectToStream(objnum, pBuffer, size)) {
-          FX_Free(pBuffer);
-          return false;
-        }
-      } else {
-        if (!m_Archive->WriteDWord(objnum) ||
-            !m_Archive->WriteString(" 0 obj ") ||
-            !m_Archive->WriteBlock(pBuffer, size) ||
-            !m_Archive->WriteString("\r\nendobj\r\n")) {
-          return false;
-        }
-      }
-    } else {
-      if (!m_Archive->WriteBlock(pBuffer, size) ||
-          !AppendObjectNumberToXRef(objnum)) {
+      if (!m_Archive->WriteDWord(objnum) ||
+          !m_Archive->WriteString(" 0 obj ") ||
+          !m_Archive->WriteBlock(pBuffer, size) ||
+          !m_Archive->WriteString("\r\nendobj\r\n")) {
         return false;
       }
+    } else {
+      if (!m_Archive->WriteBlock(pBuffer, size))
+        return false;
     }
     FX_Free(pBuffer);
   }
@@ -449,7 +369,7 @@
       continue;
 
     m_ObjectOffsets[objnum] = m_Archive->CurrentOffset();
-    if (!WriteIndirectObj(pObj))
+    if (!WriteIndirectObj(pObj->GetObjNum(), pObj))
       return false;
   }
   return true;
@@ -503,12 +423,6 @@
 
     CPDF_Dictionary* pDict = m_pDocument->GetRoot();
     m_pMetadata = pDict ? pDict->GetDirectObjectFor("Metadata") : nullptr;
-    if (HasObjectStream()) {
-      m_pXRefStream = pdfium::MakeUnique<CPDF_XRefStream>();
-      m_pXRefStream->Start();
-      if (IsIncremental() && m_pParser)
-        m_pXRefStream->SetPreviousOffset(m_pParser->GetLastXRefOffset());
-    }
     m_iStage = 10;
   }
   if (m_iStage == 10) {
@@ -561,12 +475,6 @@
           continue;
 
         m_ObjectOffsets[num] = m_pParser->GetObjectPositionOrZero(num);
-        if (HasObjectStream())
-          m_pXRefStream->AddObjectNumberToIndexArray(num);
-      }
-      if (HasObjectStream()) {
-        m_pXRefStream->EndXRefStream(this);
-        m_pXRefStream->Start();
       }
     }
     m_iStage = 20;
@@ -624,11 +532,7 @@
   uint32_t dwLastObjNum = m_dwLastObjNum;
   if (m_iStage == 80) {
     m_XrefStart = m_Archive->CurrentOffset();
-    if (HasObjectStream()) {
-      m_pXRefStream->End(this, true);
-      m_XrefStart = m_pXRefStream->GetPreviousOffset();
-      m_iStage = 90;
-    } else if (!IsIncremental() || !m_pParser->IsXRefStream()) {
+    if (!IsIncremental() || !m_pParser->IsXRefStream()) {
       if (!IsIncremental() || m_pParser->GetLastXRefOffset() == 0) {
         CFX_ByteString str;
         str = pdfium::ContainsKey(m_ObjectOffsets, 1)
@@ -722,139 +626,135 @@
 int32_t CPDF_Creator::WriteDoc_Stage4() {
   ASSERT(m_iStage >= 90);
 
-  if (!HasObjectStream()) {
-    bool bXRefStream = IsIncremental() && m_pParser->IsXRefStream();
-    if (!bXRefStream) {
-      if (!m_Archive->WriteString("trailer\r\n<<"))
+  bool bXRefStream = IsIncremental() && m_pParser->IsXRefStream();
+  if (!bXRefStream) {
+    if (!m_Archive->WriteString("trailer\r\n<<"))
+      return -1;
+  } else {
+    if (!m_Archive->WriteDWord(m_pDocument->GetLastObjNum() + 1) ||
+        !m_Archive->WriteString(" 0 obj <<")) {
+      return -1;
+    }
+  }
+
+  if (m_pParser) {
+    CPDF_Dictionary* p = m_pParser->GetTrailer();
+    for (const auto& it : *p) {
+      const CFX_ByteString& key = it.first;
+      CPDF_Object* pValue = it.second.get();
+      if (key == "Encrypt" || key == "Size" || key == "Filter" ||
+          key == "Index" || key == "Length" || key == "Prev" || key == "W" ||
+          key == "XRefStm" || key == "ID") {
+        continue;
+      }
+      if (!m_Archive->WriteString(("/")) ||
+          !m_Archive->WriteString(PDF_NameEncode(key).AsStringC())) {
         return -1;
-    } else {
-      if (!m_Archive->WriteDWord(m_pDocument->GetLastObjNum() + 1) ||
-          !m_Archive->WriteString(" 0 obj <<")) {
+      }
+      if (!pValue->IsInline()) {
+        if (!m_Archive->WriteString(" ") ||
+            !m_Archive->WriteDWord(pValue->GetObjNum()) ||
+            !m_Archive->WriteString(" 0 R ")) {
+          return -1;
+        }
+      } else if (!pValue->WriteTo(m_Archive.get())) {
         return -1;
       }
     }
-
-    if (m_pParser) {
-      CPDF_Dictionary* p = m_pParser->GetTrailer();
-      for (const auto& it : *p) {
-        const CFX_ByteString& key = it.first;
-        CPDF_Object* pValue = it.second.get();
-        // TODO(ochang): Consolidate with similar check in
-        // CPDF_XRefStream::WriteTrailer.
-        if (key == "Encrypt" || key == "Size" || key == "Filter" ||
-            key == "Index" || key == "Length" || key == "Prev" || key == "W" ||
-            key == "XRefStm" || key == "ID") {
-          continue;
-        }
-        if (!m_Archive->WriteString(("/")) ||
-            !m_Archive->WriteString(PDF_NameEncode(key).AsStringC())) {
-          return -1;
-        }
-        if (!pValue->IsInline()) {
-          if (!m_Archive->WriteString(" ") ||
-              !m_Archive->WriteDWord(pValue->GetObjNum()) ||
-              !m_Archive->WriteString(" 0 R ")) {
-            return -1;
-          }
-        } else if (!pValue->WriteTo(m_Archive.get())) {
-          return -1;
-        }
-      }
-    } else {
-      if (!m_Archive->WriteString("\r\n/Root ") ||
-          !m_Archive->WriteDWord(m_pDocument->GetRoot()->GetObjNum()) ||
+  } else {
+    if (!m_Archive->WriteString("\r\n/Root ") ||
+        !m_Archive->WriteDWord(m_pDocument->GetRoot()->GetObjNum()) ||
+        !m_Archive->WriteString(" 0 R\r\n")) {
+      return -1;
+    }
+    if (m_pDocument->GetInfo()) {
+      if (!m_Archive->WriteString("/Info ") ||
+          !m_Archive->WriteDWord(m_pDocument->GetInfo()->GetObjNum()) ||
           !m_Archive->WriteString(" 0 R\r\n")) {
         return -1;
       }
-      if (m_pDocument->GetInfo()) {
-        if (!m_Archive->WriteString("/Info ") ||
-            !m_Archive->WriteDWord(m_pDocument->GetInfo()->GetObjNum()) ||
-            !m_Archive->WriteString(" 0 R\r\n")) {
-          return -1;
-        }
-      }
     }
-    if (m_pEncryptDict) {
-      if (!m_Archive->WriteString("/Encrypt"))
-        return -1;
+  }
+  if (m_pEncryptDict) {
+    if (!m_Archive->WriteString("/Encrypt"))
+      return -1;
 
-      uint32_t dwObjNum = m_pEncryptDict->GetObjNum();
-      if (dwObjNum == 0)
-        dwObjNum = m_pDocument->GetLastObjNum() + 1;
-      if (!m_Archive->WriteString(" ") || !m_Archive->WriteDWord(dwObjNum) ||
-          !m_Archive->WriteString(" 0 R ")) {
-        return -1;
-      }
-    }
-
-    if (!m_Archive->WriteString("/Size ") ||
-        !m_Archive->WriteDWord(m_dwLastObjNum + (bXRefStream ? 2 : 1))) {
+    uint32_t dwObjNum = m_pEncryptDict->GetObjNum();
+    if (dwObjNum == 0)
+      dwObjNum = m_pDocument->GetLastObjNum() + 1;
+    if (!m_Archive->WriteString(" ") || !m_Archive->WriteDWord(dwObjNum) ||
+        !m_Archive->WriteString(" 0 R ")) {
       return -1;
     }
-    if (IsIncremental()) {
-      FX_FILESIZE prev = m_pParser->GetLastXRefOffset();
-      if (prev) {
-        if (!m_Archive->WriteString("/Prev "))
-          return -1;
+  }
 
-        char offset_buf[20];
-        memset(offset_buf, 0, sizeof(offset_buf));
-        FXSYS_i64toa(prev, offset_buf, 10);
-        if (!m_Archive->WriteBlock(offset_buf, FXSYS_strlen(offset_buf)))
+  if (!m_Archive->WriteString("/Size ") ||
+      !m_Archive->WriteDWord(m_dwLastObjNum + (bXRefStream ? 2 : 1))) {
+    return -1;
+  }
+  if (IsIncremental()) {
+    FX_FILESIZE prev = m_pParser->GetLastXRefOffset();
+    if (prev) {
+      if (!m_Archive->WriteString("/Prev "))
+        return -1;
+
+      char offset_buf[20];
+      memset(offset_buf, 0, sizeof(offset_buf));
+      FXSYS_i64toa(prev, offset_buf, 10);
+      if (!m_Archive->WriteBlock(offset_buf, FXSYS_strlen(offset_buf)))
+        return -1;
+    }
+  }
+  if (m_pIDArray) {
+    if (!m_Archive->WriteString(("/ID")) ||
+        !m_pIDArray->WriteTo(m_Archive.get())) {
+      return -1;
+    }
+  }
+  if (!bXRefStream) {
+    if (!m_Archive->WriteString(">>"))
+      return -1;
+  } else {
+    if (!m_Archive->WriteString("/W[0 4 1]/Index["))
+      return -1;
+    if (IsIncremental() && m_pParser && m_pParser->GetLastXRefOffset() == 0) {
+      uint32_t i = 0;
+      for (i = 0; i < m_dwLastObjNum; i++) {
+        if (!pdfium::ContainsKey(m_ObjectOffsets, i))
+          continue;
+        if (!m_Archive->WriteDWord(i) || !m_Archive->WriteString(" 1 "))
           return -1;
       }
-    }
-    if (m_pIDArray) {
-      if (!m_Archive->WriteString(("/ID")) ||
-          !m_pIDArray->WriteTo(m_Archive.get())) {
+      if (!m_Archive->WriteString("]/Length ") ||
+          !m_Archive->WriteDWord(m_dwLastObjNum * 5) ||
+          !m_Archive->WriteString(">>stream\r\n")) {
         return -1;
       }
-    }
-    if (!bXRefStream) {
-      if (!m_Archive->WriteString(">>"))
-        return -1;
+      for (i = 0; i < m_dwLastObjNum; i++) {
+        auto it = m_ObjectOffsets.find(i);
+        if (it == m_ObjectOffsets.end())
+          continue;
+        OutputIndex(m_Archive.get(), it->second);
+      }
     } else {
-      if (!m_Archive->WriteString("/W[0 4 1]/Index["))
-        return -1;
-      if (IsIncremental() && m_pParser && m_pParser->GetLastXRefOffset() == 0) {
-        uint32_t i = 0;
-        for (i = 0; i < m_dwLastObjNum; i++) {
-          if (!pdfium::ContainsKey(m_ObjectOffsets, i))
-            continue;
-          if (!m_Archive->WriteDWord(i) || !m_Archive->WriteString(" 1 "))
-            return -1;
-        }
-        if (!m_Archive->WriteString("]/Length ") ||
-            !m_Archive->WriteDWord(m_dwLastObjNum * 5) ||
-            !m_Archive->WriteString(">>stream\r\n")) {
+      size_t count = m_NewObjNumArray.size();
+      size_t i = 0;
+      for (i = 0; i < count; i++) {
+        if (!m_Archive->WriteDWord(m_NewObjNumArray[i]) ||
+            !m_Archive->WriteString(" 1 ")) {
           return -1;
         }
-        for (i = 0; i < m_dwLastObjNum; i++) {
-          auto it = m_ObjectOffsets.find(i);
-          if (it == m_ObjectOffsets.end())
-            continue;
-          OutputIndex(m_Archive.get(), it->second);
-        }
-      } else {
-        size_t count = m_NewObjNumArray.size();
-        size_t i = 0;
-        for (i = 0; i < count; i++) {
-          if (!m_Archive->WriteDWord(m_NewObjNumArray[i]) ||
-              !m_Archive->WriteString(" 1 ")) {
-            return -1;
-          }
-        }
-        if (!m_Archive->WriteString("]/Length ") ||
-            !m_Archive->WriteDWord(count * 5) ||
-            !m_Archive->WriteString(">>stream\r\n")) {
-          return -1;
-        }
-        for (i = 0; i < count; ++i)
-          OutputIndex(m_Archive.get(), m_ObjectOffsets[m_NewObjNumArray[i]]);
       }
-      if (!m_Archive->WriteString("\r\nendstream"))
+      if (!m_Archive->WriteString("]/Length ") ||
+          !m_Archive->WriteDWord(count * 5) ||
+          !m_Archive->WriteString(">>stream\r\n")) {
         return -1;
+      }
+      for (i = 0; i < count; ++i)
+        OutputIndex(m_Archive.get(), m_ObjectOffsets[m_NewObjNumArray[i]]);
     }
+    if (!m_Archive->WriteString("\r\nendstream"))
+      return -1;
   }
 
   if (!m_Archive->WriteString("\r\nstartxref\r\n"))
@@ -880,8 +780,6 @@
   m_NewObjNumArray.clear();
 
   InitID();
-  if (flags & FPDFCREATE_PROGRESSIVE)
-    return true;
   return Continue() > -1;
 }
 
diff --git a/core/fpdfapi/edit/cpdf_creator.h b/core/fpdfapi/edit/cpdf_creator.h
index 3d85d5e..618fffd 100644
--- a/core/fpdfapi/edit/cpdf_creator.h
+++ b/core/fpdfapi/edit/cpdf_creator.h
@@ -20,12 +20,9 @@
 class CPDF_Document;
 class CPDF_Object;
 class CPDF_Parser;
-class CPDF_XRefStream;
 
 #define FPDFCREATE_INCREMENTAL 1
 #define FPDFCREATE_NO_ORIGINAL 2
-#define FPDFCREATE_PROGRESSIVE 4
-#define FPDFCREATE_OBJECTSTREAM 8
 
 class CPDF_Creator {
  public:
@@ -57,9 +54,6 @@
   }
   bool IsIncremental() const { return !!(m_dwFlags & FPDFCREATE_INCREMENTAL); }
   bool IsOriginal() const { return !(m_dwFlags & FPDFCREATE_NO_ORIGINAL); }
-  bool HasObjectStream() const {
-    return !!(m_dwFlags & FPDFCREATE_OBJECTSTREAM);
-  }
 
  private:
   void Clear();
@@ -68,8 +62,6 @@
   void InitNewObjNumOffsets();
   void InitID();
 
-  bool AppendObjectNumberToXRef(uint32_t objnum);
-
   int32_t WriteDoc_Stage1();
   int32_t WriteDoc_Stage2();
   int32_t WriteDoc_Stage3();
@@ -78,12 +70,8 @@
   bool WriteOldIndirectObject(uint32_t objnum);
   bool WriteOldObjs();
   bool WriteNewObjs();
-  bool WriteIndirectObj(const CPDF_Object* pObj);
   bool WriteDirectObj(uint32_t objnum, const CPDF_Object* pObj, bool bEncrypt);
   bool WriteIndirectObj(uint32_t objnum, const CPDF_Object* pObj);
-  bool WriteIndirectObjectToStream(uint32_t objnum,
-                                   const uint8_t* pBuffer,
-                                   uint32_t dwSize);
 
   bool WriteStream(const CPDF_Object* pStream,
                    uint32_t objnum,
@@ -98,7 +86,6 @@
   uint32_t m_dwEncryptObjNum;
   CFX_RetainPtr<CPDF_CryptoHandler> m_pCryptoHandler;
   CPDF_Object* m_pMetadata;
-  std::unique_ptr<CPDF_XRefStream> m_pXRefStream;
   uint32_t m_dwLastObjNum;
   std::unique_ptr<IFX_ArchiveStream> m_Archive;
   FX_FILESIZE m_SavedOffset;
diff --git a/core/fpdfapi/edit/cpdf_objectstream.cpp b/core/fpdfapi/edit/cpdf_objectstream.cpp
deleted file mode 100644
index 208adac..0000000
--- a/core/fpdfapi/edit/cpdf_objectstream.cpp
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2017 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "core/fpdfapi/edit/cpdf_objectstream.h"
-
-#include "core/fpdfapi/edit/cpdf_creator.h"
-#include "core/fpdfapi/edit/cpdf_encryptor.h"
-#include "core/fpdfapi/edit/cpdf_flateencoder.h"
-#include "core/fpdfapi/parser/fpdf_parser_utility.h"
-
-namespace {
-
-const int kObjectStreamMaxLength = 256 * 1024;
-
-}  // namespace
-
-CPDF_ObjectStream::CPDF_ObjectStream() : m_dwObjNum(0), m_index(0) {}
-
-CPDF_ObjectStream::~CPDF_ObjectStream() {}
-
-bool CPDF_ObjectStream::IsNotFull() const {
-  return m_Buffer.GetLength() < kObjectStreamMaxLength;
-}
-
-void CPDF_ObjectStream::Start() {
-  m_Items.clear();
-  m_Buffer.Clear();
-  m_dwObjNum = 0;
-  m_index = 0;
-}
-
-void CPDF_ObjectStream::CompressIndirectObject(uint32_t dwObjNum,
-                                               const CPDF_Object* pObj) {
-  m_Items.push_back({dwObjNum, m_Buffer.GetLength()});
-  m_Buffer << pObj;
-}
-
-void CPDF_ObjectStream::CompressIndirectObject(uint32_t dwObjNum,
-                                               const uint8_t* pBuffer,
-                                               uint32_t dwSize) {
-  m_Items.push_back({dwObjNum, m_Buffer.GetLength()});
-  m_Buffer.AppendBlock(pBuffer, dwSize);
-}
-
-FX_FILESIZE CPDF_ObjectStream::End(CPDF_Creator* pCreator) {
-  ASSERT(pCreator);
-
-  if (m_Items.empty())
-    return 0;
-
-  IFX_ArchiveStream* archive = pCreator->GetArchive();
-  FX_FILESIZE ObjOffset = archive->CurrentOffset();
-  if (!m_dwObjNum)
-    m_dwObjNum = pCreator->GetNextObjectNumber();
-
-  CFX_ByteTextBuf tempBuffer;
-  for (const auto& pair : m_Items)
-    tempBuffer << pair.objnum << " " << pair.offset << " ";
-
-  if (!archive->WriteDWord(m_dwObjNum) ||
-      !archive->WriteString(" 0 obj\r\n<</Type /ObjStm /N ") ||
-      !archive->WriteDWord(pdfium::CollectionSize<uint32_t>(m_Items)) ||
-      !archive->WriteString("/First ") ||
-      !archive->WriteDWord(static_cast<uint32_t>(tempBuffer.GetLength())) ||
-      !archive->WriteString("/Length ")) {
-    return -1;
-  }
-  tempBuffer << m_Buffer;
-
-  CPDF_FlateEncoder encoder(tempBuffer.GetBuffer(), tempBuffer.GetLength(),
-                            true, false);
-  CPDF_Encryptor encryptor(pCreator->GetCryptoHandler(), m_dwObjNum,
-                           encoder.GetData(), encoder.GetSize());
-
-  if (!archive->WriteDWord(encryptor.GetSize()) ||
-      !archive->WriteString("/Filter /FlateDecode") ||
-      !archive->WriteString(">>stream\r\n") ||
-      !archive->WriteBlock(encryptor.GetData(), encryptor.GetSize()) ||
-      !archive->WriteString("\r\nendstream\r\nendobj\r\n")) {
-    return -1;
-  }
-
-  return ObjOffset;
-}
diff --git a/core/fpdfapi/edit/cpdf_objectstream.h b/core/fpdfapi/edit/cpdf_objectstream.h
deleted file mode 100644
index 5ad6ec8..0000000
--- a/core/fpdfapi/edit/cpdf_objectstream.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2017 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef CORE_FPDFAPI_EDIT_CPDF_OBJECTSTREAM_H_
-#define CORE_FPDFAPI_EDIT_CPDF_OBJECTSTREAM_H_
-
-#include <vector>
-
-#include "core/fxcrt/fx_basic.h"
-#include "third_party/base/stl_util.h"
-
-class CPDF_Creator;
-class CPDF_Object;
-
-class CPDF_ObjectStream {
- public:
-  struct Item {
-    uint32_t objnum;
-    FX_STRSIZE offset;
-  };
-
-  CPDF_ObjectStream();
-  ~CPDF_ObjectStream();
-
-  void Start();
-  FX_FILESIZE End(CPDF_Creator* pCreator);
-  void CompressIndirectObject(uint32_t dwObjNum, const CPDF_Object* pObj);
-  void CompressIndirectObject(uint32_t dwObjNum,
-                              const uint8_t* pBuffer,
-                              uint32_t dwSize);
-
-  bool IsNotFull() const;
-  int32_t ItemCount() const { return pdfium::CollectionSize<int32_t>(m_Items); }
-  void SetObjectNumber(uint32_t num) { m_dwObjNum = num; }
-  uint32_t GetObjectNumber() const { return m_dwObjNum; }
-  int32_t GetIndex() const { return m_index; }
-  void IncrementIndex() { m_index++; }
-
-  uint32_t GetObjectNumberForItem(int index) const {
-    return m_Items[index].objnum;
-  }
-
- private:
-  std::vector<Item> m_Items;
-  CFX_ByteTextBuf m_Buffer;
-  uint32_t m_dwObjNum;
-  int32_t m_index;
-};
-
-#endif  // CORE_FPDFAPI_EDIT_CPDF_OBJECTSTREAM_H_
diff --git a/core/fpdfapi/edit/cpdf_xrefstream.cpp b/core/fpdfapi/edit/cpdf_xrefstream.cpp
deleted file mode 100644
index 67793b2..0000000
--- a/core/fpdfapi/edit/cpdf_xrefstream.cpp
+++ /dev/null
@@ -1,347 +0,0 @@
-// Copyright 2017 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "core/fpdfapi/edit/cpdf_xrefstream.h"
-
-#include "core/fpdfapi/edit/cpdf_creator.h"
-#include "core/fpdfapi/edit/cpdf_flateencoder.h"
-#include "core/fpdfapi/parser/cpdf_array.h"
-#include "core/fpdfapi/parser/cpdf_document.h"
-#include "core/fpdfapi/parser/cpdf_parser.h"
-#include "core/fpdfapi/parser/fpdf_parser_decode.h"
-
-namespace {
-
-const int32_t kObjectStreamMaxSize = 200;
-
-bool WriteTrailer(CPDF_Document* pDocument,
-                  IFX_ArchiveStream* archive,
-                  CPDF_Array* pIDArray) {
-  CPDF_Parser* pParser = pDocument->GetParser();
-  if (pParser) {
-    CPDF_Dictionary* p = pParser->GetTrailer();
-    for (const auto& it : *p) {
-      const CFX_ByteString& key = it.first;
-      CPDF_Object* pValue = it.second.get();
-      if (key == "Encrypt" || key == "Size" || key == "Filter" ||
-          key == "Index" || key == "Length" || key == "Prev" || key == "W" ||
-          key == "XRefStm" || key == "Type" || key == "ID") {
-        continue;
-      }
-      if (key == "DecodeParms")
-        continue;
-      if (!archive->WriteString(("/")) ||
-          !archive->WriteString(PDF_NameEncode(key).AsStringC())) {
-        return false;
-      }
-
-      if (!pValue->IsInline()) {
-        if (!archive->WriteString(" ") ||
-            !archive->WriteDWord(pValue->GetObjNum()) ||
-            !archive->WriteString(" 0 R ")) {
-          return false;
-        }
-      } else if (!pValue->WriteTo(archive)) {
-        return false;
-      }
-    }
-    if (pIDArray) {
-      if (!archive->WriteString(("/ID")) || !pIDArray->WriteTo(archive))
-        return false;
-    }
-    return true;
-  }
-  if (!archive->WriteString("\r\n/Root ") ||
-      !archive->WriteDWord(pDocument->GetRoot()->GetObjNum()) ||
-      !archive->WriteString(" 0 R\r\n")) {
-    return false;
-  }
-
-  if (pDocument->GetInfo()) {
-    if (!archive->WriteString("/Info ") ||
-        !archive->WriteDWord(pDocument->GetInfo()->GetObjNum()) ||
-        !archive->WriteString(" 0 R\r\n")) {
-      return false;
-    }
-  }
-  if (pIDArray) {
-    if (!archive->WriteString(("/ID")) || !pIDArray->WriteTo(archive))
-      return false;
-  }
-  return true;
-}
-
-bool WriteEncryptDictObjectReference(uint32_t dwObjNum,
-                                     IFX_ArchiveStream* archive) {
-  ASSERT(archive);
-
-  if (!archive->WriteString("/Encrypt") || !archive->WriteString(" ") ||
-      !archive->WriteDWord(dwObjNum) || !archive->WriteString(" 0 R ")) {
-    return false;
-  }
-  return true;
-}
-
-void AppendIndex0(CFX_ByteTextBuf& buffer, bool bFirstObject) {
-  buffer.AppendByte(0);
-  buffer.AppendByte(0);
-  buffer.AppendByte(0);
-  buffer.AppendByte(0);
-  buffer.AppendByte(0);
-
-  const uint8_t byte = bFirstObject ? 0xFF : 0;
-  buffer.AppendByte(byte);
-  buffer.AppendByte(byte);
-}
-
-void AppendIndex1(CFX_ByteTextBuf& buffer, FX_FILESIZE offset) {
-  buffer.AppendByte(1);
-  buffer.AppendByte(static_cast<uint8_t>(offset >> 24));
-  buffer.AppendByte(static_cast<uint8_t>(offset >> 16));
-  buffer.AppendByte(static_cast<uint8_t>(offset >> 8));
-  buffer.AppendByte(static_cast<uint8_t>(offset));
-  buffer.AppendByte(0);
-  buffer.AppendByte(0);
-}
-
-void AppendIndex2(CFX_ByteTextBuf& buffer, uint32_t objnum, int32_t index) {
-  buffer.AppendByte(2);
-  buffer.AppendByte(static_cast<uint8_t>(objnum >> 24));
-  buffer.AppendByte(static_cast<uint8_t>(objnum >> 16));
-  buffer.AppendByte(static_cast<uint8_t>(objnum >> 8));
-  buffer.AppendByte(static_cast<uint8_t>(objnum));
-  buffer.AppendByte(static_cast<uint8_t>(index >> 8));
-  buffer.AppendByte(static_cast<uint8_t>(index));
-}
-
-}  // namespace
-
-CPDF_XRefStream::CPDF_XRefStream()
-    : m_PrevOffset(0), m_dwTempObjNum(0), m_iSeg(0) {}
-
-CPDF_XRefStream::~CPDF_XRefStream() {}
-
-bool CPDF_XRefStream::Start() {
-  m_IndexArray.clear();
-  m_Buffer.Clear();
-  m_iSeg = 0;
-  return true;
-}
-
-bool CPDF_XRefStream::CompressIndirectObject(uint32_t dwObjNum,
-                                             const CPDF_Object* pObj,
-                                             CPDF_Creator* pCreator) {
-  ASSERT(pCreator);
-
-  m_ObjStream.CompressIndirectObject(dwObjNum, pObj);
-  if (m_ObjStream.ItemCount() < kObjectStreamMaxSize &&
-      m_ObjStream.IsNotFull()) {
-    return true;
-  }
-  return EndObjectStream(pCreator, true);
-}
-
-bool CPDF_XRefStream::CompressIndirectObject(uint32_t dwObjNum,
-                                             const uint8_t* pBuffer,
-                                             uint32_t dwSize,
-                                             CPDF_Creator* pCreator) {
-  ASSERT(pCreator);
-
-  m_ObjStream.CompressIndirectObject(dwObjNum, pBuffer, dwSize);
-  if (m_ObjStream.ItemCount() < kObjectStreamMaxSize &&
-      m_ObjStream.IsNotFull()) {
-    return true;
-  }
-  return EndObjectStream(pCreator, true);
-}
-
-bool CPDF_XRefStream::EndObjectStream(CPDF_Creator* pCreator, bool bEOF) {
-  FX_FILESIZE objOffset = 0;
-  if (bEOF) {
-    objOffset = m_ObjStream.End(pCreator);
-    if (objOffset < 0)
-      return false;
-  }
-
-  if (!m_ObjStream.GetObjectNumber())
-    m_ObjStream.SetObjectNumber(pCreator->GetNextObjectNumber());
-
-  int32_t iSize = m_ObjStream.ItemCount();
-  size_t iSeg = m_IndexArray.size();
-  if (!pCreator->IsIncremental()) {
-    if (m_dwTempObjNum == 0) {
-      AppendIndex0(m_Buffer, true);
-      m_dwTempObjNum++;
-    }
-    uint32_t end_num = m_IndexArray.back().objnum + m_IndexArray.back().count;
-    int index = 0;
-    for (; m_dwTempObjNum < end_num; m_dwTempObjNum++) {
-      if (pCreator->HasObjectNumber(m_dwTempObjNum)) {
-        if (index >= iSize ||
-            m_dwTempObjNum != m_ObjStream.GetObjectNumberForItem(index)) {
-          AppendIndex1(m_Buffer, pCreator->GetObjectOffset(m_dwTempObjNum));
-        } else {
-          AppendIndex2(m_Buffer, m_ObjStream.GetObjectNumber(), index++);
-        }
-      } else {
-        AppendIndex0(m_Buffer, false);
-      }
-    }
-    if (iSize > 0 && bEOF)
-      pCreator->SetObjectOffset(m_ObjStream.GetObjectNumber(), objOffset);
-
-    m_iSeg = iSeg;
-    if (bEOF)
-      m_ObjStream.Start();
-
-    return true;
-  }
-
-  for (auto it = m_IndexArray.begin() + m_iSeg; it != m_IndexArray.end();
-       ++it) {
-    for (uint32_t m = it->objnum; m < it->objnum + it->count; ++m) {
-      if (m_ObjStream.GetIndex() >= iSize ||
-          m != m_ObjStream.GetObjectNumberForItem(it - m_IndexArray.begin())) {
-        AppendIndex1(m_Buffer, pCreator->GetObjectOffset(m));
-      } else {
-        AppendIndex2(m_Buffer, m_ObjStream.GetObjectNumber(),
-                     m_ObjStream.GetIndex());
-        m_ObjStream.IncrementIndex();
-      }
-    }
-  }
-  if (iSize > 0 && bEOF) {
-    AppendIndex1(m_Buffer, objOffset);
-    m_IndexArray.push_back({m_ObjStream.GetObjectNumber(), 1});
-    iSeg += 1;
-  }
-  m_iSeg = iSeg;
-  if (bEOF)
-    m_ObjStream.Start();
-
-  return true;
-}
-
-bool CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator, bool bEOF) {
-  uint32_t objnum = pCreator->GetNextObjectNumber();
-  IFX_ArchiveStream* archive = pCreator->GetArchive();
-  FX_FILESIZE offset_tmp = archive->CurrentOffset();
-
-  if (pCreator->IsIncremental()) {
-    AddObjectNumberToIndexArray(objnum);
-  } else {
-    for (; m_dwTempObjNum < pCreator->GetLastObjectNumber(); m_dwTempObjNum++) {
-      if (pCreator->HasObjectNumber(m_dwTempObjNum))
-        AppendIndex1(m_Buffer, pCreator->GetObjectOffset(m_dwTempObjNum));
-      else
-        AppendIndex0(m_Buffer, false);
-    }
-  }
-
-  AppendIndex1(m_Buffer, offset_tmp);
-
-  if (!archive->WriteDWord(objnum) ||
-      !archive->WriteString(" 0 obj\r\n<</Type /XRef/W[1 4 2]/Index[")) {
-    return false;
-  }
-
-  if (!pCreator->IsIncremental()) {
-    if (!archive->WriteDWord(0) || !archive->WriteString(" ") ||
-        !archive->WriteDWord(objnum + 1)) {
-      return false;
-    }
-  } else {
-    for (const auto& pair : m_IndexArray) {
-      if (!archive->WriteDWord(pair.objnum) || !archive->WriteString(" ") ||
-          !archive->WriteDWord(pair.count) || !archive->WriteString(" ")) {
-        return false;
-      }
-    }
-  }
-  if (!archive->WriteString("]/Size ") || !archive->WriteDWord(objnum + 1))
-    return false;
-
-  if (m_PrevOffset > 0) {
-    if (!archive->WriteString("/Prev "))
-      return false;
-
-    char offset_buf[20];
-    memset(offset_buf, 0, sizeof(offset_buf));
-    FXSYS_i64toa(m_PrevOffset, offset_buf, 10);
-    int32_t offset_len = (int32_t)FXSYS_strlen(offset_buf);
-    if (!archive->WriteBlock(offset_buf, offset_len))
-      return false;
-  }
-
-  CPDF_FlateEncoder encoder(m_Buffer.GetBuffer(), m_Buffer.GetLength(), true,
-                            true);
-  if (!archive->WriteString("/Filter /FlateDecode") ||
-      !archive->WriteString("/DecodeParms<</Columns 7/Predictor 12>>") ||
-      !archive->WriteString("/Length ") ||
-      !archive->WriteDWord(encoder.GetSize())) {
-    return false;
-  }
-
-  if (bEOF) {
-    if (!WriteTrailer(pCreator->GetDocument(), archive, pCreator->GetIDArray()))
-      return false;
-
-    if (CPDF_Dictionary* encryptDict = pCreator->GetEncryptDict()) {
-      uint32_t dwEncryptObjNum = encryptDict->GetObjNum();
-      if (dwEncryptObjNum == 0)
-        dwEncryptObjNum = pCreator->GetEncryptObjectNumber();
-
-      if (!WriteEncryptDictObjectReference(dwEncryptObjNum, archive))
-        return false;
-    }
-  }
-
-  if (!archive->WriteString(">>stream\r\n") ||
-      !archive->WriteBlock(encoder.GetData(), encoder.GetSize()) ||
-      !archive->WriteString("\r\nendstream\r\nendobj\r\n")) {
-    return false;
-  }
-
-  m_PrevOffset = offset_tmp;
-  return true;
-}
-
-bool CPDF_XRefStream::End(CPDF_Creator* pCreator, bool bEOF) {
-  if (!EndObjectStream(pCreator, bEOF))
-    return false;
-  return GenerateXRefStream(pCreator, bEOF);
-}
-
-bool CPDF_XRefStream::EndXRefStream(CPDF_Creator* pCreator) {
-  if (!pCreator->IsIncremental()) {
-    AppendIndex0(m_Buffer, true);
-    for (uint32_t i = 1; i < pCreator->GetLastObjectNumber() + 1; i++) {
-      if (pCreator->HasObjectNumber(i))
-        AppendIndex1(m_Buffer, pCreator->GetObjectOffset(i));
-      else
-        AppendIndex0(m_Buffer, false);
-    }
-  } else {
-    for (const auto& pair : m_IndexArray) {
-      for (uint32_t j = pair.objnum; j < pair.objnum + pair.count; ++j)
-        AppendIndex1(m_Buffer, pCreator->GetObjectOffset(j));
-    }
-  }
-  return GenerateXRefStream(pCreator, false);
-}
-
-void CPDF_XRefStream::AddObjectNumberToIndexArray(uint32_t objnum) {
-  if (m_IndexArray.empty()) {
-    m_IndexArray.push_back({objnum, 1});
-    return;
-  }
-
-  uint32_t next_objnum = m_IndexArray.back().objnum + m_IndexArray.back().count;
-  if (objnum == next_objnum)
-    m_IndexArray.back().count += 1;
-  else
-    m_IndexArray.push_back({objnum, 1});
-}
diff --git a/core/fpdfapi/edit/cpdf_xrefstream.h b/core/fpdfapi/edit/cpdf_xrefstream.h
deleted file mode 100644
index 33869c6..0000000
--- a/core/fpdfapi/edit/cpdf_xrefstream.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2017 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef CORE_FPDFAPI_EDIT_CPDF_XREFSTREAM_H_
-#define CORE_FPDFAPI_EDIT_CPDF_XREFSTREAM_H_
-
-#include <vector>
-
-#include "core/fpdfapi/edit/cpdf_objectstream.h"
-#include "core/fxcrt/fx_basic.h"
-
-class CPDF_Creator;
-class CPDF_Object;
-
-class CPDF_XRefStream {
- public:
-  struct Index {
-    uint32_t objnum;
-    uint32_t count;
-  };
-
-  CPDF_XRefStream();
-  ~CPDF_XRefStream();
-
-  bool Start();
-  bool CompressIndirectObject(uint32_t dwObjNum,
-                              const CPDF_Object* pObj,
-                              CPDF_Creator* pCreator);
-  bool CompressIndirectObject(uint32_t dwObjNum,
-                              const uint8_t* pBuffer,
-                              uint32_t dwSize,
-                              CPDF_Creator* pCreator);
-  bool End(CPDF_Creator* pCreator, bool bEOF);
-  void AddObjectNumberToIndexArray(uint32_t objnum);
-  bool EndXRefStream(CPDF_Creator* pCreator);
-
-  FX_FILESIZE GetPreviousOffset() const { return m_PrevOffset; }
-  void SetPreviousOffset(FX_FILESIZE offset) { m_PrevOffset = offset; }
-
-  uint32_t CountIndexArrayItems() const {
-    uint32_t size = 0;
-    for (const auto& pair : m_IndexArray)
-      size += pair.count;
-    return size;
-  }
-
- private:
-  bool EndObjectStream(CPDF_Creator* pCreator, bool bEOF);
-  bool GenerateXRefStream(CPDF_Creator* pCreator, bool bEOF);
-
-  std::vector<Index> m_IndexArray;
-  FX_FILESIZE m_PrevOffset;
-  uint32_t m_dwTempObjNum;
-  size_t m_iSeg;
-  CPDF_ObjectStream m_ObjStream;
-  CFX_ByteTextBuf m_Buffer;
-};
-
-#endif  // CORE_FPDFAPI_EDIT_CPDF_XREFSTREAM_H_
