본문 바로가기
생각

내용은 맞는데 HWP 양식이 깨지는 이유: DOCX 매핑과 2단 검수

초안의 문단 순서와 양식의 위치를 직접 대응시키면 생기는 오류를 짚는다. 의미 기반 매핑과 내용·구조·화면 검증을 작은 문서 예제로 나눈다.

내용은 맞는데 HWP 양식이 깨지는 이유: DOCX 매핑과 2단 검수 관련 이미지

DOCX에는 옮길 내용이, HWP에는 지켜야 할 편집 규칙이 담겨 있다. HWP의 글꼴과 여백, 단 구성, 문단 배치를 유지하면서 초안 내용을 제자리에 맞춰 넣어야 한다.

변환과 양식 채우기는 다르다

포맷 변환은 원본 DOCX의 내용과 서식을 다른 파일 형식으로 옮기는 작업이다. 반면 양식 채우기는 내용을 DOCX에서, 편집 규칙을 HWP에서 가져와야 하므로 두 원본의 역할부터 구분한다.

HWP에서는 용지 크기, 여백, 단 설정, 글꼴, 제목 스타일, 표와 그림의 위치를 보존 대상으로 삼는다. DOCX에서는 제목, 초록, 본문, 참고문헌을 가져오되, 원문에 없는 저자 정보는 임의로 만들지 않는다.

두 문서에서 일반 텍스트만 추출해 새 HWP를 만드는 방식은 구현이 간단하지만 원래 양식을 잃기 쉽다. 기존 HWP를 템플릿으로 삼아 필요한 내용만 패치해야 편집 정보를 더 많이 보존할 수 있다.

kordoc으로 두 문서의 구조를 읽기

kordoc은 DOCX와 HWP/HWPX를 공통 블록 구조와 Markdown으로 파싱한다. 제목과 문단, 표를 단순한 텍스트 덩어리가 아니라 문서 구조로 다룬다. 편집한 Markdown을 원본 HWP/HWPX에 다시 반영하는 patch_document, 양식 필드를 채우는 fill_form, 결과를 렌더링하는 render_document도 제공한다.

작업은 DOCX의 제목·초록·본문·참고문헌을 구분하고 비어 있는 메타데이터를 표시하는 것부터 시작한다. 이어서 HWP의 문단 순서와 단 구성을 읽어 의미에 맞게 대응시키고, 수정한 문서를 다시 파싱하고 렌더링해 검사한다.

단순히 DOCX 1번 문단을 HWP 1번 문단에 일대일로 맞추면 안 된다. 양식에는 안내 문구, 저자 영역, 영문 초록, 참고문헌처럼 초안과 순서나 길이가 다른 영역이 있기 때문이다. 제목과 헤딩, 주변 라벨까지 함께 살펴야 안정적으로 매핑할 수 있다.

가상의 DOCX가 제목·초록·본문 세 블록으로 구성되고, HWP 양식이 제목·저자·소속·초록·본문 다섯 영역으로 나뉜다고 해 보자. 순서대로 세 블록을 채우면 초록이 저자 칸에, 본문이 소속 칸에 들어간다. 문단 수가 적어서 생긴 단순 누락이 아니라 매핑 기준 자체가 틀린 것이다. ‘초록’이라는 헤딩과 주변 라벨을 기준으로 매핑하고, DOCX에 없는 저자·소속 칸은 비워 둬야 한다.

매핑 결과는 원문 블록과 대상 영역의 쌍으로 기록한다. 표의 값과 주석, 참고문헌은 본문과 별도로 매핑하고, 원문 블록 하나가 두 번 들어가거나 필수 블록이 빠지지 않았는지 검사한다. 제목 문자열이 비슷한 ‘국문 초록’과 ‘영문 초록’도 같은 대상으로 묶어 합치지 않는다. 이 예시는 kordoc의 성능 측정값이 아니라 양식 채우기의 실패 조건을 보여준다.

내용 검사를 통과한 뒤에는 텍스트 길이를 늘린 변형 문서로 배치를 확인한다. 짧은 제목에서는 정상이던 2단 양식도 긴 제목이나 긴 표 주석이 들어가면 다음 단이나 페이지로 밀릴 수 있다. 원문 내용이 모두 남아 있는지, 그리고 독자가 실제로 읽을 수 있는 위치에 놓였는지를 분리해서 확인하면 매핑 오류를 서식 조정으로 덮어 버리는 잘못된 수정을 피할 수 있다.

DOCX의 내용과 HWP/HWPX의 양식을 따로 파싱해 헤딩·레이블로 매핑하고 원본에 패치한다. 원문 내용 대조와 전체 페이지 렌더링 검수를 분리하며 없는 저자 정보는 만들지 않는다.
DOCX의 내용과 HWP/HWPX의 양식을 따로 파싱해 헤딩·레이블로 매핑하고 원본에 패치한다. 원문 내용 대조와 전체 페이지 렌더링 검수를 분리하며 없는 저자 정보는 만들지 않는다. 근거 원문 (https://github.com/chrisryugj/kordoc)

2단 문서는 몇 줄만 늘어도 달라진다

한 단짜리 문서는 문장이 늘어나면 단순히 다음 페이지로 넘어가는 경우가 많다. 하지만 2단 문서는 한쪽 단의 길이가 바뀌면 뒤쪽 문단과 표의 위치까지 연쇄적으로 달라진다. 한 문단이 몇 줄 길어졌을 뿐인데 다음 쪽 제목이 오른쪽 단 끝에 홀로 남기도 한다.

내용 확인과 양식 확인은 별개다. 필수 내용은 원문 대조로, 배치는 전체 페이지 렌더링으로 검수한다. 단 넘침, 잘린 문장, 비정상적인 빈 공간을 확인해야 한다.

kordoc은 HWPX에 저장된 조판 정보를 활용하고, 조판 캐시가 없는 문서에는 reflow를 적용해 결과를 SVG나 이미지로 보여준다. 문서 자동화에서 렌더링은 단순한 미리보기가 아니라 테스트 결과다.

없는 정보를 채우지 않는 기능

저자명·소속·이메일·참고문헌은 근거 없이 채우지 않는다. 값이 없으면 빈칸이나 미확정 표시로 남겨 둔다.

자동화 규칙에는 원문에 없는 정보를 추정하지 않는다는 조건을 명시하고, 검수할 때 실제 원본과 대조한다.

표 안의 빈 입력칸도 마찬가지다. 빈칸이라는 이유로 모델이 값을 임의로 추정하면 안 된다. 값의 출처가 DOCX에 있는지 확인하고, 없다면 사용자에게 묻거나 그대로 비워 둔다.

파일 저장 뒤에 남은 네 가지 검사

문서 생성 코드가 오류 없이 끝났다고 해서 작업까지 성공한 것은 아니다. 결과 HWP/HWPX의 구조가 유효한지 검사하고, DOCX의 필수 내용이 빠지지 않았는지 대조해야 한다. 원본 양식의 단과 표, 서식이 유지됐는지도 확인한다. 마지막으로 모든 페이지를 렌더링해 화면에서 깨진 부분이 없는지 살핀다.

파일 저장 성공은 검수의 시작점일 뿐이다. 내용 누락과 배치 깨짐을 각각 기록해야 매핑을 고칠지, 양식 처리를 고칠지 판단할 수 있다.

도입 전에는 제목 체계, 표 유무, 본문 길이가 다른 문서들로 실패 사례를 모은다. 특히 길이가 늘어날 때 단과 표가 어떻게 밀리는지 확인한 뒤 자동 처리 범위를 정한다.

참고 자료

kordoc GitHub 저장소 (https://github.com/chrisryugj/kordoc (새 창))

kordoc의 HWP/HWPX 서식 보존 패치와 렌더링 기능 (https://github.com/chrisryugj/kordoc#readme (새 창))

채용 제안 보내기

생각

함께 해결할 LLM 과제와 기대하는 역할을 알려 주세요.

연락하기