본문 바로가기
아래아한글 자동화/python+hwp 중급

한/글 문서에 포함된 그림들 화질저하 없이 이미지파일로 저장하는 프로그램 만들어보기

by 일코 2022. 3. 31.

안녕하세요?

일상의코딩입니다. 잘들 지내시는지요?

저는 최근 정말정말 운좋게 다양한 일들을 경험하고 있습니다.

이야기보따리는 다음에 풀 기회가 있으면 꺼내놓겠습니다.

 

이번 시간에는 한/글에서 제공하는 다양한 방식의 메서드 중

가장 간편한 한줄명령어(Run)와 파이썬을 이용해서

응용프로그램을 하나 만들어보겠습니다.

이름하여, "한/글 문서에 포함된 그림들 화질저하 없이 이미지파일로 저장하는 프로그램"입니다.

실제로 한/글 문서에 삽입한 이미지를 화질저하 없이 그대로 이미지파일로 저장하려면,

아래와 같은 작업을 거쳐야 합니다.

 

1. 이미지를 선택한다.

2. 이미지를 "원래 크기"로 변경한다.

3. 우클릭(또는 다양한 방법)으로 저장한다.

 

왜냐면, 한/글2020 전의 버전 어딘가까지는 

문서 내 삽입된 해상도의 이미지 그대로 저장하기를 누르면

해상도와 이미지 품질이 저하되는 현상이 발생했고요.

한/글 2020 이상의 버전부터는 용량뻥튀기(?) 현상이 발생하고 있는데요.

이건 무슨 신박한 버그인지 먼저 한 번 보여드리겠습니다.

 

[1/3]문서에 아래와 같은 이미지를 삽입해보겠습니다.

해상도와 용량이 제법 큰 이미지입니다.

 

삽입한 모습은 아래와 같습니다.

이미지를 삽입했습니다.

 

[2/3] 이미지를 image01.png라는 이름의 이미지로 다시 저장해보겠습니다.

"그림 파일로 저장(S)" 메뉴를 클릭합니다.

 

[3/3] 저장한 이미지의 용량을 확인해봅시다.

읭? 9메가 파일이 무슨 재주로 15메가가 되는고?

 

다른 이미지로도 테스트를 몇 번 더 해 보았습니다.

해상도는 동일한데 용량만 일곱 배로 커지는 마법!

 


 

해상도는 동일한테 용량만 괜히 7배로 커지는 마법(==버그)!

우리의 원드라이브와 구글포토는 소중하니까,

이런 작업을 자주 하시는 분들은 이 문제를 두고만 볼 수는 없겠죠?

파이썬 코드를 알려드리기 전에,

 

수작업으로는 이미지 저장시 이 문제를 어떻게 해결할 수 있을까요?

가장 가볍게 해결할 수 있는 방법은

저장하기 전에 "원래 크기"로 이미지 사이즈를 되돌린 후에 저장하면

문제가 발생하지 않습니다.

 

이 버튼을 클릭해서 원래 해상도로 되돌린 후에

 

이 상태로 그림파일로 저장 메뉴를 클릭하고 image02.png로 저장하면

 

짜잔! 본래 용량으로 다시 저장됩니다.

 


 

이 작업을 파이썬 코드로 한 번 옮겨보겠습니다.

한/글 문서에서 이미지를 자주 추출하시는 분들은 제일 아랫쪽에

컴파일한 실행파일이 있으니 다운받아서 실행하시거나,

파이썬을 다루시는 분들이라면, 바로 아래의 코드를 직접 실행해보셔도 좋습니다.

 

1. 파이썬 코드 - 한/글문서 이미지 추출기

import os

import win32com.client as win32


def 한글파일열기():
    한글 = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
    한글.XHwpWindows.Item(0).Visible = True
    한글.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")
    한글_팝업(한글, "이미지를 추출할 한/글 파일을 선택해주세요.")
    한글.Run("FileOpen")  # 파일선택 팝업창을 열어서 추출할 한/글파일을 선택합니다.
    return 한글


def 그림추출(경로, 확장자):
    한글.HAction.GetDefault("PictureSave", 한글.HParameterSet.HShapeObjSaveAsPicture.HSet)
    한글.HParameterSet.HShapeObjSaveAsPicture.Path = 경로
    한글.HParameterSet.HShapeObjSaveAsPicture.Ext = 확장자
    한글.HAction.Execute("PictureSave", 한글.HParameterSet.HShapeObjSaveAsPicture.HSet)


def 한글_팝업(한글, 문자열):
    메시지박스 = 한글.XHwpMessageBox
    메시지박스.string = 문자열
    메시지박스.DoModal()


def 이미지추출():
    한글.Run("MoveDocEnd")
    이미지번호 = 1
    while True:
        try:
            # 현재위치 = 한글.GetPos()
            한글.Run("SelectCtrlReverse")
            if 한글.CurSelectedCtrl.CtrlID == "gso":  # 이미지이면
                한글.Run("PictureToOriginal")  # 원래 크기로
                그림추출(os.path.join(os.getcwd(), f"한글이미지{이미지번호}.jpg"), "jpg")
                이미지번호 += 1
            # if 한글.GetPos() == 현재위치:
            #     break
        except AttributeError:
            break


if __name__ == '__main__':
    한글 = 한글파일열기()
    이미지추출()
    한글_팝업(한글, "이미지 추출작업을 완료하였습니다.")
    한글.Clear(1)
    한글.Quit()

실행화면

 

2. 컴파일된 실행파일(윈도우)

이미지추출기.zip
9.91MB

 

※ 유의사항

위 코드는 튜토리얼을 위해 1차적으로 간략히 제작한 버전임을 밝힙니다.

현재 프로그램으로는 이미지가 표 안에 들어있는 경우에

이를 추출하지 못하는 버그가 있습니다.

이를 보완하는 방법은 다음 포스팅에서 상세히 다루겠습니다.

 

이번 포스팅은 여기서 마칩니다.

감사합니다. 행복한 하루 되세요!

 

신명진 드림

 

댓글