본문 바로가기
Python

[python] 파이썬 한글 hwp 파일 문서 열기 및 텍스트 추출

by 퍼포먼스마케팅코더 2022. 8. 25.
반응형

python 파이썬 한글 hwp 파일 문서 열기 및 텍스트 추출

 

python 파이썬 한글 hwp 파일 문서 열기

오늘 알아봐야 될 거는 파이썬으로 한글 파일 문서를 열어보고 안에서 텍스트를 한번 추출해보는 코딩을 만들어 왔었는데요. 여기 안에 내용을 보자면은 여기서 새로운 파이썬 패키지를 썼던 건데 ole 라는 구조적인 파일이 있다 하더라고요 근데 파일이 뭐냐면 원래 워드라든가 ppt 이런 파일에서 개발해서 불러와서 쓰는 그건데 거기에 한글 파일도 뭔가 되는 부분이 있다고 합니다 해서 파이썬으로 만들어 봤는데요. 

 

python 파이썬 한글 hwp 파일 오류

 

제가 사용했었던 바로는 전반위적으로 텍스트 추출하는 데는 전혀 문제가 없었습니다. 근데 여기 제일 맨 밑에 보시면 오류 사항이 하나가 있었어요. 그게 뭐냐면 아까도 말씀드렸다시피 이 파일 형식이 ole 구조적인 파일 형식이 돼야 됩니다. 근데 한 가지 아까 문제점이 한글 파일 중에서 옛날에 만들어졌었던 이런 한글 파일 같은 경우에는 작동하지가 않아요. 이거를 어떻게 해결할까 하다가 이걸 해결할 수 있는 방법 중에 하나가 이렇게 동작하지 않고 아래와 같은 에러 코드가 발생됐었을 때는 한글 파일을 다른 이름으로 저장을 해서 넣어놔야 됩니다. 

 

python 파이썬 한글 hwp 파일 텍스트 추출

 

다른 이름으로 저장을 할 때 처음에 보시면 통합 형식으로 되어 있는 한글 파일로 저장하는 방식이 있어요. 그거를 선택을 하시고 다른 이름으로 저장을 완료한 다음에 다시 한 번 파일 디렉토리를 넣어서 돌려보시면 정상적으로 텍스트가 추출이 될 겁니다. 그게 하나가 있고요 그래서 이외로 보여졌었던 에러사항 그러한 것들은 제가 확인한 바로는 크게 없었습니다. 원래 가장 커서 실제로 이거를 바꾸기 위해서 다른 개발 이런 것도 찾아보고 했는데 제가 가장 확인한 바로는 한글 파일 실행돼서 뭔가 매크로 형식으로 작업하는 이것보다는 말 그대로 제가 보여드린 이 코딩만 사용을 하셔서 진행만 하시면 한글 파일을 열고 텍스트를 추출하는 데 큰 문제는 없으리라 생각됩니다. 오늘은 여기까지입니다.

 

import olefile
import zlib
import struct

def get_hwp_text(filename):
    f = olefile.OleFileIO(filename)
    dirs = f.listdir()

    # HWP 파일 검증
    if ["FileHeader"] not in dirs or \
       ["\x05HwpSummaryInformation"] not in dirs:
        raise Exception("Not Valid HWP.")

    # 문서 포맷 압축 여부 확인
    header = f.openstream("FileHeader")
    header_data = header.read()
    is_compressed = (header_data[36] & 1) == 1

    # Body Sections 불러오기
    nums = []
    for d in dirs:
        if d[0] == "BodyText":
            nums.append(int(d[1][len("Section"):]))
    sections = ["BodyText/Section"+str(x) for x in sorted(nums)]

    # 전체 text 추출
    text = ""
    for section in sections:
        bodytext = f.openstream(section)
        data = bodytext.read()
        if is_compressed:
            unpacked_data = zlib.decompress(data, -15)
        else:
            unpacked_data = data
    
        # 각 Section 내 text 추출    
        section_text = ""
        i = 0
        size = len(unpacked_data)
        while i < size:
            header = struct.unpack_from("<I", unpacked_data, i)[0]
            rec_type = header & 0x3ff
            rec_len = (header >> 20) & 0xfff

            if rec_type in [67]:
                rec_data = unpacked_data[i+4:i+4+rec_len]
                section_text += rec_data.decode('utf-16')
                section_text += "\n"

            i += 4 + rec_len

        text += section_text
        text += "\n"

    return text


file_name = 'C:/Users/user/Downloads/test.hwp'
print(get_hwp_text(file_name))



#not an OLE2 structured storage file  에러발견으로 작동 안함. 
# 동작 하지 않는 이유는 파일명을 hwp로 다른 이름으로 저장해서 넣어놔야함.

 

반응형

댓글