본문 바로가기

일상

한글(HWP) 양식을 파이썬으로 채우고 PDF로 저장하기 (pywin32 HwpObject와 표 칸 이동)

반응형

학교나 기관에서 받은 한글(HWP) 서식 파일의 표 칸을 파이썬으로 채우고, 제출용 PDF까지 한 번에 뽑는 방법입니다.


지원서나 계획서 양식은 아직도 한글 파일로 오는 경우가 많습니다. 문장을 몇 번 고칠 때마다 한글을 열어 칸에 붙여 넣고, 줄이 넘쳤는지 보고, PDF로 다시 저장하는 일을 반복하다 보면 금방 지칩니다.


본문은 텍스트 파일 하나로 관리하고 양식에 넣는 일은 스크립트에 맡기면 고칠 때마다 명령 한 번으로 HWP와 PDF가 같이 나옵니다. 이렇게 하면서 부딪힌 함정까지 같이 정리했습니다.


- 한글이 설치된 윈도우라면 pywin32 로 한글 프로그램을 직접 조종할 수 있다

- 칸은 좌표가 아니라 라벨을 찾은 뒤 옆 칸, 아래 칸으로 이동해서 찾는다

- 고정 크기 표는 쪽을 넘어가지 않아 글이 넘치면 잘린다

- 결과는 반드시 PDF를 그려서 눈으로 확인한다


1. 한글 프로그램을 파이썬에서 부르기

HWP는 구조가 공개된 문서라도 표와 서식을 직접 다루기가 까다롭습니다. 대신 한글이 깔린 PC라면 한글 프로그램이 제공하는 자동화 객체(HWPFrame.HwpObject)를 win32com 으로 불러, 사람이 키보드로 하던 동작을 그대로 시킬 수 있습니다.



핵심은 세 가지입니다. RepeatFind 로 양식에 적힌 글자를 찾아 커서를 옮기고, InsertText 로 글을 넣고, 줄을 바꿀 때는 BreakPara 를 실행합니다. 원본 서식은 복사본을 만들어 그쪽을 열어야 실수해도 양식이 상하지 않습니다.


저장은 SaveAs 하나로 끝나는데, 형식 인자만 "HWP" 와 "PDF" 로 바꾸면 제출용 PDF가 같이 나옵니다. 작업이 끝나면 Quit() 으로 한글을 닫아야 프로세스가 남지 않습니다.


2. 표 칸은 라벨에서 출발해 이동한다

양식은 대부분 표로 되어 있어서, "성명" 옆 칸이나 "1. 담당업무" 아래 칸에 글을 넣어야 합니다. 칸의 좌표를 계산하는 대신 라벨 글자를 찾은 다음 칸 이동 동작을 쓰는 편이 훨씬 단단합니다.



TableRightCell 은 오른쪽 칸, TableLowerCell 은 아래 칸으로 커서를 옮깁니다. 양식 칸에는 안내 문구나 빈 줄이 미리 들어 있는 경우가 많으니, MoveListBegin 과 MoveSelListEnd 로 칸 전체를 선택해 지운 뒤 넣어야 빈 줄이 남지 않습니다.


칸 안의 글이 세로 가운데에 떠 있다면 칸 정렬이 "가운데"로 잡힌 양식입니다. 글을 넣은 뒤 TableCellAlignLeftTop 을 실행하면 위쪽부터 채워집니다.


3. 글이 넘치면 쪽을 넘어가지 않고 잘린다

가장 크게 헤맨 부분입니다. 2-3쪽짜리 계획서 양식의 첫 쪽 칸에 본문을 통째로 넣었더니, 다음 쪽으로 이어지지 않고 표 전체가 다음 쪽으로 밀린 뒤 아랫부분이 잘려 나왔습니다.


이런 양식은 표가 쪽 경계에서 나뉘지 않게 만들어져 있습니다. 그래서 양식을 보면 쪽마다 따로 표가 하나씩 들어 있는데, 이게 "여기까지 쓰고 다음 장으로 넘어가라"는 뜻입니다. 본문도 그에 맞춰 나눠 넣어야 합니다.



문서 안의 표는 HeadCtrl 부터 Next 로 따라가며 CtrlID 가 "tbl" 인 것을 모으면 됩니다. 표의 위치로 커서를 옮기고 ShapeObjTableSelCell 로 첫 칸에 들어간 뒤 내용을 넣습니다. 앞쪽 표에 글을 넣으면 뒤쪽 표의 위치가 밀릴 수 있어서 뒤에서부터 채우는 게 안전합니다.


본문 파일은 항목 제목(예: "2. 진학 동기")을 기준으로 쪽 단위로 잘라 둡니다. 어느 항목이 몇 쪽에 들어가는지는 한 번 PDF로 뽑아 보고 정하면 됩니다.


4. 공백으로 줄을 맞춘 양식

"지원과정 : OOO" 같은 줄은 표 칸이 아니라 공백 수십 칸으로 자리를 맞춘 경우가 있습니다. 라벨 뒤에 그냥 글을 넣으면 기존 공백 뒤에 붙어서 한참 오른쪽에 찍힙니다.


이때는 "지원전공 :" 처럼 라벨을 콜론까지 찾고, MoveSelLineEnd 로 줄 끝까지 선택해 지운 다음 다시 씁니다. 위아래 줄과 간격을 맞추려면 원본 양식의 실제 공백 수를 먼저 확인해야 하는데, 눈으로 세기보다 문서 텍스트를 뽑아 repr 로 찍어 보는 편이 정확합니다.


5. 끝의 빈 줄을 지우다 표까지 지운다

필요 없는 쪽의 표를 지운 뒤 문서 끝에 남은 빈 줄을 정리하려고 DeleteBack 을 여러 번 돌렸더니, 빈 줄만 지워지는 게 아니라 앞의 표까지 통째로 지워졌습니다. 결과 PDF에는 제목만 남은 첫 쪽 하나가 나왔습니다.


커서 앞에 무엇이 있는지 확인하지 않고 지우는 동작을 반복하면 이렇게 됩니다. 지우는 동작은 횟수로 돌리지 말고 대상을 찾아서 하거나, 아예 손대지 않는 편이 낫습니다. 앞에서 말한 대로 쪽마다 표를 살려 두면 이 정리 자체가 필요 없어집니다.


6. 결과 확인은 PDF를 그려서 한다

스크립트가 오류 없이 끝났다고 결과가 맞는 건 아닙니다. 위 함정들은 전부 오류 없이 조용히 일어났습니다. 그래서 매번 저장한 PDF의 쪽수부터 확인하고, 각 쪽을 이미지로 그려 칸 안에 글이 다 들어갔는지 봤습니다.


- hwp.PageCount 로 쪽수가 양식과 같은지 본다

- PDF를 PyMuPDF(fitz)로 쪽마다 이미지로 그려 본다

- 마지막 줄이 칸 테두리 안에 있는지, 서명 줄이 제자리에 있는지 본다


7. 정리

한글 양식 채우기는 HwpObject 로 한글 프로그램을 직접 조종하면 생각보다 간단합니다. 라벨을 찾고, 칸을 이동하고, 칸을 비운 뒤 넣고, HWP와 PDF로 같이 저장하면 됩니다.


다만 양식은 사람이 보기 좋게 만든 것이라 표가 쪽을 넘어가지 않거나 공백으로 줄을 맞춘 곳이 숨어 있습니다. 이런 곳은 오류 없이 결과만 어긋나기 때문에, 저장할 때마다 PDF를 그려 보는 습관이 가장 확실한 안전장치입니다.


여기까지 한글(HWP) 양식을 파이썬으로 채우는 방법에 대해서 작성해봤습니다. 여기까지 읽어주셔서 감사합니다!

반응형