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

서식 유지한 채로 스타일을 모두 "바탕글"로 바꾸는 코딩

by 일코 2022. 4. 30.

안녕하세요?
일상의코딩 신명진입니다.

회사 다니다 보면 가끔 이런 경우가 있었습니다.

수십페이지의 아래아한글 레거시 문서를 구조화하기 위해서

개요와 스타일을 새롭게 매기고 싶은데

기존에 스타일이 뒤죽박죽 매겨져 있는 상태인 거예요.

근데 스타일을 변경하면 문서가 깨지잖아요ㅜ

 

그래서 서식은 그대로 두고 스타일을 모두 "바탕글"로 변경한 후에

개요와 스타일을 다시 하나씩 매겨보고 싶었거든요.

지식인에도 저와 똑같은 고민을 했던 분이 계시더라고요.

출처 : 네이버 지식인

무작정 모든 스타일을 삭제하거나 "바탕글"로 바꾸면 서식이 다 날아가버려서

문서를 다시 구조화하는 작업이 굉장히 복잡해지죠.

문맥과 수준을 기억한 채로 수정해야 하니까요.

제목이 전부 "개요1"인 경우
스타일을 제거하니 전부 신명조, 10pt에 문단위아래간격도 없어져버린다.

(도입부 설명이 조금 길었습니다.)

 

이런 경우는 문서가 짧으면 어떻게라도 수작업으로 비벼볼 수 있지만,

위 예시문서처럼 분량이 100쪽 가까이 되는 경우라면

코딩의 힘을 살짝 빌려보는 게 더 나을 것 같다는 판단이 듭니다.

아래처럼요.

의사코드 아니고, 파이썬 코드임.

함수를 정의하고 실행하는 데까지 80여개의 라인으로 적용이 가능하네요.

실행해볼까요? (전체 소스코드는 하단에)

서식복사(Alt-C) → 스타일제거 → 서식붙여넣기(Alt-C) → 다음문장 반복

서식은 유지한 채로 "바탕글" 이외 모든 스타일이 해제되었습니다.

 


 

사실 이 프로그램의 원리는 아주 간단합니다.

바로 "서식복사"를 이용한 프로그램인데요.

① 글자 및 문단서식을 복사(Alt-C)해 둔 후

② 스타일을 제거하고

③ 서식 붙여넣기로 서식만 복원하는 매크로를 반복했습니다.

 

아래는 전체 소스코드입니다. 파이썬으로 작성하였습니다.

업무에 참고하시기 바랍니다.

"""
표 안의 스타일 제외
"""

import win32com.client as win32

바탕글 = 0


def 한글_시작():
    global hwp
    hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
    hwp.XHwpWindows.Item(0).Visible = True
    hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")
    hwp.Open(r"C:\Users\ㅇㅇㅇ\ㅇㅇㅇ\ㅇㅇㅇ\기업인수목적회사(SPAC)주권+합병상장+예비심사신청서_220318#1_원본.hwp")


def 문서_끝으로():
    hwp.HAction.Run("MoveDocEnd")


def 현재위치_저장():
    return hwp.GetPos()


def 문서_처음으로():
    hwp.HAction.Run("MoveDocBegin")


def 모양_복사():
    hwp.HAction.GetDefault("ShapeCopyPaste", hwp.HParameterSet.HShapeCopyPaste.HSet)
    hwp.HParameterSet.HShapeCopyPaste.type = 2
    hwp.HAction.Execute("ShapeCopyPaste", hwp.HParameterSet.HShapeCopyPaste.HSet)


def 모양_붙여넣기():
    if 내용없는_줄바꿈인지():
        return
    else:
        hwp.HAction.Run("MoveSelLineEnd")
        hwp.HAction.Run("ShapeCopyPaste")
        hwp.HAction.Run("Cancel")


def 스타일_조회():
    Act = hwp.CreateAction("Style")  # "Style" 액션 초기화
    Set = Act.CreateSet()  # 액션에 해당하는 파라미터셋 생성(현재는 빈 값)
    Act.GetDefault(Set)  # 비어있는 파라미터셋에 현재값 채워넣기
    return Set.Item("Apply")  # 정수 리턴(0:바탕글, 1:본문..)


def 스타일_적용(num):
    Act = hwp.CreateAction("Style")
    Set = Act.CreateSet()
    Act.GetDefault(Set)
    Set.SetItem("Apply", num)  # Apply 아이템의 값을 "개요3"으로 변경
    Act.Execute(Set)  # 문서에 적용. 끝.


def 다음_문단으로():
    hwp.HAction.Run("MoveNextParaBegin")


def 내용없는_줄바꿈인지():
    hwp.InitScan(Range=0x33)
    text = hwp.GetText()
    hwp.ReleaseScan()
    if text[1] == "\r\n":
        return True
    return False


if __name__ == '__main__':
    한글_시작()
    문서_끝으로()
    끝위치 = 현재위치_저장()
    문서_처음으로()
    while hwp.GetPos() != 끝위치:
        스타일 = 스타일_조회()
        if 스타일 != 바탕글:
            모양_복사()  # Alt-C
            스타일_적용(바탕글)  # Ctrl-1
            모양_붙여넣기()  # 문단 선택 후 Alt-C
        다음_문단으로()

 

입문자 대상으로 코드를 한줄한줄 자세히 설명드리려면 최소 열 개 포스팅 정도로 연재해야 할 것 같은데

당장은 업무가 다소 밀려 있어서 포스팅이나 영상은 다음으로 미뤄야 할 것 같습니다.

그래도 코드나 실행원리가 궁금하신 분은 댓글로 남겨주시면

최대한 답변 드리도록 하겠습니다.

 

행복한 하루 되세요!

 


국내 유일의 파이썬+한컴오피스 업무자동화 입문강의

 

움짤로 빠르게 배우는 파이썬-아래아한글 자동화 레시피 - 인프런 | 강의

파이썬으로 아래아한글을 다루는 짧은 예제코드들을 소개하고, 중간중간의 결과를 GIF로 보여드립니다. 동영상 강의가 아니지만 오히려 빠르게 배울 수 있고, 따라하기도 쉽습니다., - 강의 소개

www.inflearn.com

 

댓글