hwp5.py Field Start 16바이트 수정 안내

케빈랩 HWP 추출 타임아웃을 해결하기 위한 로컬 가상환경 임시 수정 안내입니다.

이 수정은 프로젝트 Git 코드가 아니라 각 컴퓨터의 .venv에 설치된 외부 라이브러리를 고치는 방식입니다. 가상환경을 다시 만들거나 라이브러리를 재설치하면 사라지므로, 팀원 전원이 같은 방법으로 적용해야 합니다.

1. 수정할 파일 열기

VS Code에서 아래 파일을 엽니다.

GPTPilots_Project\.venv\Lib\site-packages\hwp_hwpx_parser\hwp5.py

2. 수정할 함수 찾기

파일에서 아래 함수를 검색합니다.

def _extract_hyperlink_texts_from_para(self, para_data: bytes) -> List[str]:

그 함수 안에서 아래 블록을 찾습니다.

if code == 0x03:

3. 어디부터 어디까지 지우나

아래 블록 전체를 지웁니다. 시작은 if code == 0x03:이고, 끝은 마지막 i += 14 다음의 continue입니다.

if code == 0x03:
    if i + 6 <= len(para_data):
        ctrl_id = struct.unpack_from("<I", para_data, i + 2)[0]
 
        if ctrl_id == CTRL_ID_HYPERLINK:
            text_start = i + 14
            text_chars = []
            j = text_start
 
            while j < len(para_data) - 1:
                c = struct.unpack_from("<H", para_data, j)[0]
                if c == 0x04:
                    break
                elif c == 0x03:
                    j += 2
                elif 0x20 <= c < 0x10000:
                    text_chars.append(chr(c))
                    j += 2
                else:
                    j += 2
 
            if text_chars:
                hyperlink_texts.append("".join(text_chars))
            i = j
            continue
        else:
            i += 14
            continue

바로 다음의 아래 코드는 삭제하면 안 됩니다.

elif code == 0x04:

4. 같은 위치에 붙여넣을 코드

삭제한 자리, 즉 elif code == 0x04: 바로 위에 아래 코드를 붙여넣습니다.

if code == 0x03:
    field_start_size = 16
 
    if i + field_start_size > len(para_data):
        break
 
    ctrl_id = struct.unpack_from("<I", para_data, i + 2)[0]
 
    if ctrl_id == CTRL_ID_HYPERLINK:
        text_start = i + field_start_size
        text_chars = []
        j = text_start
 
        while j < len(para_data) - 1:
            c = struct.unpack_from("<H", para_data, j)[0]
            if c == 0x04:
                break
            elif c == 0x03:
                j += 2
            elif 0x20 <= c < 0x10000:
                text_chars.append(chr(c))
                j += 2
            else:
                j += 2
 
        if text_chars:
            hyperlink_texts.append("".join(text_chars))
        i = j
        continue
    else:
        i += field_start_size
        continue

최종 구조는 아래처럼 이어져야 합니다.

if code == 0x03:
    # 위 수정 코드
elif code == 0x04:
    # 기존 코드 유지

5. 적용 확인

케빈랩 HWP를 다시 추출했을 때 아래처럼 나오면 적용 성공입니다.

성공: True
추출 글자 수: 56,914