hwp
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 450071ad4ca8d..3b49b4ed0ac1e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
 ## Unreleased
 
 ### New Features
+- Added `HWPReader` (#7672)
 - Simplified portkey LLM interface (#7669)
 - Added async operation support to `ElasticsearchStore` vector store (#7613)
 
diff --git a/llama_index/readers/file/base.py b/llama_index/readers/file/base.py
index 6fe9eb53bd268..b21c6d450c71b 100644
--- a/llama_index/readers/file/base.py
+++ b/llama_index/readers/file/base.py
@@ -5,7 +5,7 @@
 from typing import Callable, Dict, Generator, List, Optional, Type
 
 from llama_index.readers.base import BaseReader
-from llama_index.readers.file.docs_reader import DocxReader, PDFReader
+from llama_index.readers.file.docs_reader import DocxReader, PDFReader, HWPReader
 from llama_index.readers.file.epub_reader import EpubReader
 from llama_index.readers.file.image_reader import ImageReader
 from llama_index.readers.file.ipynb_reader import IPYNBReader
@@ -17,6 +17,7 @@
 from llama_index.schema import Document
 
 DEFAULT_FILE_READER_CLS: Dict[str, Type[BaseReader]] = {
+    ".hwp": HWPReader,
     ".pdf": PDFReader,
     ".docx": DocxReader,
     ".pptx": PptxReader,
diff --git a/llama_index/readers/file/docs_reader.py b/llama_index/readers/file/docs_reader.py
index 05ab0246f6c5f..57954d7c7e781 100644
--- a/llama_index/readers/file/docs_reader.py
+++ b/llama_index/readers/file/docs_reader.py
@@ -3,8 +3,11 @@
 Contains parsers for docx, pdf files.
 
 """
+import zlib
+import struct
+
 from pathlib import Path
-from typing import Dict, List, Optional
+from typing import Any, Dict, List, Optional
 
 from llama_index.readers.base import BaseReader
 from llama_index.schema import Document
@@ -66,3 +69,102 @@ def load_data(
             metadata.update(extra_info)
 
         return [Document(text=text, metadata=metadata or {})]
+
+
+class HWPReader(BaseReader):
+    """Hwp Parser"""
+
+    def __init__(self, *args: Any, **kwargs: Any) -> None:
+        super().__init__(*args, **kwargs)
+        self.FILE_HEADER_SECTION = "FileHeader"
+        self.HWP_SUMMARY_SECTION = "\x05HwpSummaryInformation"
+        self.SECTION_NAME_LENGTH = len("Section")
+        self.BODYTEXT_SECTION = "BodyText"
+        self.HWP_TEXT_TAGS = [67]
+        self.text = ""
+
+    def load_data(
+        self, file: Path, extra_info: Optional[Dict] = None
+    ) -> List[Document]:
+        """Load data and extract table from Hwp file.
+        Args:
+            file (Path): Path for the Hwp file.
+        Returns:
+            List[Document]
+        """
+        import olefile
+
+        load_file = olefile.OleFileIO(file)
+        file_dir = load_file.listdir()
+        if self.is_valid(file_dir) is False:
+            raise Exception("Not Valid HwpFile")
+
+        result_text = self._get_text(load_file, file_dir)
+        result = self._text_to_document(text=result_text, extra_info=extra_info)
+        return [result]
+
+    def is_valid(self, dirs: List[str]) -> bool:
+        if [self.FILE_HEADER_SECTION] not in dirs:
+            return False
+
+        return [self.HWP_SUMMARY_SECTION] in dirs
+
+    def get_body_sections(self, dirs: List[str]) -> List[str]:
+        m = []
+        for d in dirs:
+            if d[0] == self.BODYTEXT_SECTION:
+                m.append(int(d[1][self.SECTION_NAME_LENGTH :]))
+
+        return ["BodyText/Section" + str(x) for x in sorted(m)]
+
+    def _text_to_document(
+        self, text: str, extra_info: Optional[Dict] = None
+    ) -> Document:
+        return Document(text=text, extra_info=extra_info or {})
+
+    def get_text(self) -> str:
+        return self.text
+
+        # 전체 text 추출
+
+    def _get_text(self, load_file: Any, file_dirs: List[str]) -> str:
+        sections = self.get_body_sections(file_dirs)
+        text = ""
+        for section in sections:
+            text += self.get_text_from_section(load_file, section)
+            text += "\n"
+
+        self.text = text
+        return self.text
+
+    def is_compressed(self, load_file: Any) -> bool:
+        header = load_file.openstream("FileHeader")
+        header_data = header.read()
+        return (header_data[36] & 1) == 1
+
+    def get_text_from_section(self, load_file: Any, section: str) -> str:
+        bodytext = load_file.openstream(section)
+        data = bodytext.read()
+
+        unpacked_data = (
+            zlib.decompress(data, -15) if self.is_compressed(load_file) else data
+        )
+        size = len(unpacked_data)
+
+        i = 0
+
+        text = ""
+        while i < size:
+            header = struct.unpack_from("<I", unpacked_data, i)[0]
+            rec_type = header & 0x3FF
+            (header >> 10) & 0x3FF
+            rec_len = (header >> 20) & 0xFFF
+
+            if rec_type in self.HWP_TEXT_TAGS:
+                rec_data = unpacked_data[i + 4 : i + 4 + rec_len]
+                text += rec_data.decode("utf-16")
+                text += "\n"
+
+            i += 4 + rec_len
+
+        return text

Added hwp reader module. 