HWP 파일 내용을 프로그램에서 읽어야 할 때가 있습니다. 공문서나 양식 파일에서 특정 문구를 찾거나, 본문만 뽑아 DB에 넣는 작업 같은 경우죠. HWP는 형식이 공개돼 있긴 해도 직접 파싱하기는 번거롭고, 한글이 설치된 PC라면 한글 ActiveX 컨트롤(HwpCtrl)을 폼에 올려서 문서를 열고 텍스트를 받아 오는 쪽이 훨씬 간단합니다.

아래 예제는 윈폼에 HwpCtrl1 컨트롤과 텍스트박스가 올라가 있다고 가정한 코드입니다.

GetTextFile 한 줄로 끝내기

문서 전체를 한 번에 문자열로 받으려면 GetTextFile 을 씁니다. 첫 번째 인자로 형식을 지정하는데 "TEXT" 를 주면 일반 텍스트, "HTML" 을 주면 HTML 문자열로 돌려줍니다.

string filePath = @"c:\sample.hwp"   //샘플 한글파일의 경로
HwpCtrl1.Open(filePath);

textBox.text = HwpCtrl1.GetTextFile("TEXT","").ToString();
// 작업환경은 윈폼이고, 폼에 textBox가 올려져 있다고 가정한 코드이다.
// 한글 파일로부터 TEXT 추출시 HTML로 추출을 원하면 해당 값을 HTML로 입력하면 된다.

원문 그대로 옮긴 코드라 첫 줄 끝에 세미콜론이 빠져 있고 textBox.text 도 소문자입니다. 그대로 붙여 넣으면 컴파일이 안 되니 string filePath = @"c:\sample.hwp"; 로, 텍스트박스는 실제 폼의 컨트롤 이름과 .Text 로 고쳐서 쓰세요.

HTML로 받으면 표나 글자 서식이 태그로 어느 정도 남아서, 웹 화면에 그대로 보여 줄 때 편합니다. 검색이나 비교가 목적이면 TEXT 쪽이 다루기 쉽고요.

InitScan과 GetTextBySet으로 조금씩 읽기

GetTextFile 로도 충분한 경우가 많지만, 문서를 앞에서부터 훑으며 조각 단위로 받는 방법도 있습니다. 문서를 여는 데까지는 같고, InitScan 으로 검색을 초기화한 다음 GetText 액션을 반복 호출합니다.

string filePath = @"c:\sample.hwp"   //샘플 한글파일의 경로
HwpCtrl1.Open(filePath);
// 여기까지는 동일하다.

HwpCtrl1.InitScan();   // 문서 검색을 위한 초기화
while(GetText() != 1)
{
}
HwpCtrl1.ReleaseScan();   //InitScan()으로 설정된 정보를 초기화 한다.

private int GetText()
{
    int ret = 0;

    HWPCONTROLLib.HwpParameterSet TextSet;
    TextSet = (HWPCONTROLLib.HwpParameterSet)HwpCtrl1.CreateSet("GetText");
    ret = HwpCtrl1.GetTextBySet(TextSet);
    var txt = TextSet.Item("Text");

    textBox1.Text += txt;
    return ret;
}

CreateSet("GetText") 로 파라미터셋을 만들고 GetTextBySet 에 넘기면, 이번에 읽은 조각이 파라미터셋의 "Text" 항목에 담기고 상태값이 반환됩니다. 이 코드는 반환값이 1이 될 때까지, 즉 문서 끝에 닿을 때까지 돌면서 읽은 조각을 텍스트박스에 계속 이어 붙입니다. while 본문이 비어 있는 건 실제 작업을 조건식 안의 GetText() 가 다 하기 때문입니다.

끝나면 ReleaseScan 으로 검색 상태를 꼭 풀어 줘야 합니다. 풀지 않고 다른 작업을 이어 하면 다음 스캔이 엉뚱한 위치에서 시작할 수 있습니다.

어느 쪽을 쓸까

문서 전체 내용이 필요하면 GetTextFile 이 짧고 빠릅니다. 조각 단위 방식은 읽는 도중에 특정 문구가 나오면 멈추거나, 조각마다 따로 처리하고 싶을 때 쓸모가 있습니다. 다만 textBox1.Text += txt 처럼 컨트롤 텍스트에 계속 더하는 방식은 문서가 길면 눈에 띄게 느려집니다. 실제로 쓸 때는 StringBuilder 에 모았다가 마지막에 한 번 넣는 편이 낫습니다.

그리고 두 방법 모두 한글 프로그램이 설치돼 있어야 동작합니다. 서버나 한글이 없는 PC에 배포할 프로그램이라면 이 방식은 맞지 않으니 처음부터 고려해 두세요.