Type Here to Get Search Results !

Golang: Go언어로 아래아한글(HWP) 빈 페이지를 열어보기

HWP(아래아한글)는 "한글 워드 프로세서"의 약자로, 우리 한국에서 사용되는 워드 프로세싱 소프트웨어입니다. 한글과컴퓨터에 의해 개발되었으며, 한국 정부 및 기업에서 널리 사용되고 있습니다. HWP는 텍스트, 이미지, 표 등을 포함한 복잡한 문서를 만들 수 있는 도구로, 특히 한글 텍스트 처리에 있어 뛰어난 기능을 제공합니다. 이 소프트웨어는 정부 문서, 공식 보고서 등의 작성에 자주 사용됩니다. 국내에서 공공기관 등에서 매우 중요한 문서 작성 도구로 사용되고 있습니다. 


HWP(아래아한글)를 자동화하는 강좌 및 예제 글과 유튜브 영상은 참 많습니다. 이들 강좌 및 예제들 대부분은 Python(파이썬)을 이용한 예제들이고, 훌륭하게 설명된 것들이 참 많습니다.

저 역시 파이썬을 업무 자동화로 많이 이용하고 있습니다만, 개인적으로 유독 HWP와 Python 조합만은 손이 잘 가지 않습니다. 

제가 반복적인 hwp 작성 업무를 하던 때가 2018년쯤 됩니다. 당시에는 지금처럼 참조할만한 자료가 많지 않았기에 HWP 자동화를 어떻게 해야할지 몰라, 표와 문장으로 구성된 초안을 html로 작성하게 하여 이를 HWP에 복사&붙여넣기를 하였습니다. 완전한 자동화는 아니었지만, 업무 시간을 상당히 단축시켜주고, 직접 타이핑할 때 실수로 발생하게 되는 오류도 방지할 수 있었습니다. 

한동안 반복적인 hwp 작업이 없었기에 관심이 없었는데, 최근에 불연듯 Go언어로 hwp 자동화가 되지 않을까 싶은 생각이 들어서 간단히 시도를 해봤습니다.


현재 제 환경은 다음과 같습니다.

  • 한글2020버전을 사용. 별도로 한글오토메이션을 설치할 필요는 없습니다.
  • Go 1.21.3 64bit

한글 오토메이션 설명을 보면 다음 문구를 볼 수 있습니다.

OLE(COM) Object를 이용하여 한글 기능을 실행하거나 문서를 제어할 수 있습니다.

OLE은 또 뭔가 싶습니다.

OLE(Object Linking and Embedding)는 마이크로소프트에서 개발한 기술로, 다양한 애플리케이션 간에 객체를 공유하고 재사용할 수 있게 해주는 기능입니다. 이 기술을 통해 사용자는 한 애플리케이션에서 생성한 객체를 다른 애플리케이션에 삽입(Embedding)하거나 링크(Linking)할 수 있습니다. 예를 들어, Microsoft Word 문서에 Excel 스프레드시트를 삽입하거나 링크할 수 있으며, 이를 통해 문서 내에서 직접 Excel 데이터를 보여주고, 업데이트할 수 있습니다.

일단 그런게 있는가보다 생각하고, Go언어를 이용하여 빈 HWP 화면을 띄우는 예제는 다음과 같습니다.

package main

import (
	"github.com/go-ole/go-ole"
	"github.com/go-ole/go-ole/oleutil"
)

func main() {
	// OLE 시스템 초기화
	err := ole.CoInitialize(0)
	if err != nil {
		panic(err)
	}
	defer ole.CoUninitialize()

	// HWP COM 객체 생성
	hwp, err := oleutil.CreateObject("HWPFrame.HwpObject")
	if err != nil {
		panic(err)
	}
	defer hwp.Release()

	// IDispatch 인터페이스 요청 및 반환
	dispatch_hwp, err := hwp.QueryInterface(ole.IID_IDispatch)
	if err != nil {
		panic(err)
	}
	defer dispatch_hwp.Release()

	// HWP 화면 띄우기 시작
	// XHwpWindows 객체 가져오기
	xHwpWindows, err := oleutil.GetProperty(dispatch_hwp, "XHwpWindows")
	if err != nil {
		panic(err)
	}
	defer xHwpWindows.Clear()

	// 창 객체 가져오기
	window := oleutil.MustGetProperty(xHwpWindows.ToIDispatch(), "Item", 0).ToIDispatch()
	defer window.Release()

	// 창의 가시성 설정
	_, err = oleutil.PutProperty(window, "Visible", true)
	if err != nil {
		panic(err)
	}
	// HWP 화면 띄우기 끝
}

위 코드에서 주석 "//HWP 화면 띄우기 시작"에서 "//HWP 화면 띄우기 끝" 사이의 코드가 없으면, 별도의 아래한글을 띄우지 않고 백그라운드에서 작동합니다.

동일한 일을 수행하는 파이썬 코드에 비해서 정말 길어졌습니다. 이게 Golang의 매력(?)이죠.

댓글 쓰기

0 댓글
* Please Don't Spam Here. All the Comments are Reviewed by Admin.