인프런 커뮤니티 질문&답변

rosetteer님의 프로필 이미지
rosetteer

작성한 질문수

직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피

바탕쪽, 머리말, 꼬리말, 미주 장식, 두 줄이상의 빈 줄 삭제

해결된 질문

작성

·

124

1

hwp 파일에서 바탕쪽, 머리말, 꼬리말, 미주 장식, 두 줄이상의 빈 줄을 자동으로 없애고자 강의를 수강합니다. 힌트를 얻고 싶습니다.

답변 1

2

일코님의 프로필 이미지
일코
지식공유자

안녕하세요?

아래의 샘플문서를 가지고 설명을 드리겠습니다.

https://drive.google.com/file/d/1P5EPY4QHjTUXGAFi7QxQ1IrXgrCGdfhd/view?usp=sharing

image.png

 

1. 바탕쪽 제거하기

문서 내 모든 바탕쪽을 제거하는 가장 간단한 방법은,

pyhwpx를 최신버전으로 설치하신 뒤(현재 0.35.1),

아래 코드를 실행하시면 됩니다.

from pyhwpx import Hwp

hwp = Hwp()

hwp.DeleteDocumentMasterPage()
녹화_2024_08_25_17_38_19_8.gif

 

조금 부연설명을 드리면,

바탕쪽은 특이하게 "구역" 개념을 사용하고, 컨트롤의 위치가 보이지 않는 게 특징입니다. 미주나 각주, 표, 그림 등은 "컨트롤"이라 불리는 개체로 수정/삭제가 가능한 반면, 바탕쪽은 그냥 구역의 바탕쪽 편집에 들어가 내용을 지우면 됩니다. 구체적으로는 바탕쪽 편집상태에서 Run("DeleteDocumentMasterPage")를 실행하거나(문서의 모든 바탕쪽 제거), Run("DeleteSectionMasterPage")를 실행(현재 구역의 바탕쪽만 제거)하면 됩니다. pyhwpx에서는 두 가지 기능 모두 메서드 형태로 제공하고 있으므로, 간편하게 바탕쪽을 제거하실 수 있습니다.

 

2. 문서 내 모든 머리말과 꼬리말 제거

머리말, 꼬리말을 제거하는 코드는 아래와 같습니다.

from pyhwpx import Hwp

hwp = Hwp()

for ctrl in hwp.ctrl_list:
    if ctrl.UserDesc.startswith("머리말") or ctrl.UserDesc.startswith("꼬리말"):
        hwp.DeleteCtrl(ctrl)
녹화_2024_08_25_17_52_32_313.gif

머리말이나 꼬리말은 단순한 컨트롤이므로

컨트롤을 순회하면서 DeleteCtrl을 실행하시면 됩니다.

 

3. 미주 장식(?) 제거

미주 장식이 정확히 뭘 의미하는지 몰라서ㅜ

우선 미주를 제거하는 코드를 보여드립니다.

(사실 위의 머리말, 꼬리말 제거 코드와 거의 유사합니다.)

for ctrl in hwp.ctrl_list:
    if ctrl.UserDesc.startswith("미주"):
        hwp.DeleteCtrl(ctrl)
녹화_2024_08_25_17_54_46_569.gif

 

4. 두 줄 이상의 빈 줄을 없애기

아래아한글의 find 액션을 활용하시는 걸 추천드립니다.

아래와 같은 방식으로 find 메서드를 쓰실 수 있습니다.

(참고로 ^n은 아래아한글의 "줄바꿈"을 의미합니다.)

while True:
    hwp.MoveDocBegin()
    if hwp.find("^n^n"):
        hwp.find_replace("^n^n", "^n")
        # 또는 단순히 hwp.BreakPara()
    else:
        break
녹화_2024_08_25_18_20_18_857.gif

 

 

사실 가장 간단하고 예외 없는 문서를 가지고 시연을 해드려서

실제 복잡한 문서에서는 여러가지 예외사항이 발생할 수 있습니다.

 

실행해보시고, 적용해보시면서

오류가 나거나 이해가 안 가게 작동하는 부분이 있다면

추가댓글 남겨주시기 바랍니다.

 

행복한 하루 되세요^^

 

rosetteer님의 프로필 이미지
rosetteer
질문자

답변 감사합니다.

rosetteer님의 프로필 이미지
rosetteer
질문자

아래아한글에서 페이지 또는 단을 바꾸는 표시가 ^n 외에 무엇인가 또 있나보군요 ㅠㅠ 찾아보겠습니다. 미주 장식은 미주 또는 각주를 표시할 때 나타나는 밑줄 부분을 말씀드린 것입니다.

일코님의 프로필 이미지
일코
지식공유자

앗, ^n은 특수하게 찾기/찾아바꾸기에만 쓰이는 기호입니다.

일반적으로 줄바꿈을 삽입할 때에는 insert_text 메서드로

문자열 \r\n (또는 \r) 을 입력하시거나,

혹은 hwp.BreakPara() 메서드로 직접 줄바꿈을 삽입하실 수 있습니다.

 

그 외의 줄바꿈은

hwp.BreakLine(), # 줄 나눔, Shift-Enter

hwp.BreakPage(), # 쪽나누기, Ctrl-Enter

hwp.BreakColumn() # 단 나누기(배분다단), Ctrl-Shift-Enter

hwp.BreakSection() # 구역 나누기 Shift-Alt-Enter

hwp.BreakColDef() # 단 정의 삽입, Ctrl-Alt-Enter

등의 메서드를 사용하시면 됩니다^^

 

rosetteer님의 프로필 이미지
rosetteer
질문자

친절한 답변 감사합니다. hwp.BreakPara()로 삽입된 줄바꿈을 지우려면 어떻게 해야하나요?

일코님의 프로필 이미지
일코
지식공유자

아래아한글 조작하듯 하시면 됩니다.

왼쪽에서 hwp.Delete()를 싱행하시거나,

오른쪽에서 hwp.DeleteBack()을 실행하시거나요.

 

지워야 할 줄바꿈이 여러 개라면, 찾아가는 방식을 결정해야 합니다. 제일 간단한 방법은, 위에서 보여드린 찾기/찾아바꾸기를 실행하는 방법입니다.

 

구체적인 예시를 들어주시면 해법을 알려드리겠습니다^^

rosetteer님의 프로필 이미지
rosetteer

작성한 질문수

질문하기