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

MH H님의 프로필 이미지
MH H

작성한 질문수

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

누름틀 없는 대량의 한/글 문서를 엑셀로 취합하기#라이브코딩

특정 스타일이 적용된 텍스트만 복사하여 따로 저장하는 방법이 있을까요?

해결된 질문

작성

·

669

1

안녕하세요 선생님. 좋은 강의 감사합니다.

질문이 있습니다.

어떤 한글 문서의 내용이 여러 개의 스타일이 적용된 문서인 경우

그 중 특정한 스타일이 적용된 텍스트 부분만 복사하여 따로 저장하는 방법이 있을까요?

 

예를 들어 어떤 문서의 텍스트에

A, B, C, D, E, F, G, H라는 8개의 스타일이 적용된 경우

이 중 B스타일이 적용된 텍스트만 선택하여 복사 저장하거나,

이 중 D스타일이 적용된 텍스트만 선택하여 복사 저장하거나,

F와 G의 스타일이 적용된 텍스트만 선택하여 복사 저장하는 법이 궁금합니다.

답변 4

1

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

<2. 붙여넣을 때 새로운 스타일 적용방법>

 

새로운 스타일을 코드로 생성하는 작업은 굉장히 피곤한 작업이기 때문에
직접 특정 스타일이 적용된 템플릿 파일을 미리 만들어 두시는 것을 추천드립니다.
해당 문단에 특정 스타일을 적용하는 코드는 아래와 같이 간단합니다.

def apply_style(style_num):
    Act = hwp.CreateAction("Style")
    Set = Act.CreateSet()
    Act.GetDefault(Set)
    Set.SetItem("Apply", style_num)
    Act.Execute(Set)

image

소개해드린 코드를 조합하시면
원하시는 업무자동화 코드를 완성하실 수 있을 겁니다.
구현하시면서 소소하게 막히는 부분이 있으면
추가질문 남겨주시기 바랍니다.

 

즐거운 업무자동화 하시기 바랍니다!
행복한 하루 되세요^^

1

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

<1. 특정 스타일의 텍스트만 추출하여 새 문서로 만드는 방법>

시연화면을 먼저 보여드립니다.

image

위와 같이 구현해 보았습니다. 코드는 아래와 같습니다.
기능별로 함수를 작성해 두었는데, 꼭 전부 이해해야 하는 것은 아닙니다.

def get_style() -> int:
    """
    등록된 스타일 순서대로 정수인덱스가 매겨져 있습니다.
    바탕글 : 0
    본문 : 1
    개요1 : 2
    개요2 : 3
    개요3 : 4 ... 이런 식입니다.
    이 정수 인덱스를 리턴하는 함수입니다.
    """
    Act = hwp.CreateAction("Style")
    Set = Act.CreateSet()
    Act.GetDefault(Set)
    return Set.Item("Apply")


def get_text() -> str:
    """
    선택 영역의 텍스트만 추출하는 함수입니다.
    단, 글머리는 추출하지 않습니다.
    """
    hwp.InitScan(Range=0xff)  # "선택 영역만"
    state, text = hwp.GetText()
    hwp.ReleaseScan()
    return text


def get_doc_end_pos() -> tuple[int]:
    """
    본문 탐색 while문의 종료 조건으로
    "문서 끝 도달시 반복종료"를 구현하기 위해
    문서 끝 위치를 미리 추출해 두는 함수입니다.
    """
    hwp.Run("MoveDocEnd")
    doc_end_pos = hwp.GetPos()
    hwp.Run("MoveDocBegin")
    return doc_end_pos


def get_style_text(*style_num) -> list[str]:
    """
    특정 스타일의 문단 텍스트만 추출하는 메인함수.
    `get_style_text(2,3,4)` 식으로 스타일 중복선택 가능.
    """
    doc_end_pos = get_doc_end_pos()
    style_text_list = []
    while True:
        if hwp.GetPos() == doc_end_pos:
            break
        hwp.Run("MoveSelParaEnd")
        if get_style() in style_num:
            style_text_list.append(get_text())
        hwp.Run("MoveNextParaBegin")
    return style_text_list

 

get_style_text 함수를 통해 특정 스타일의 문자열을 추출하실 수 있습니다.
추출한 리스트를 통해 새 문서를 작성하는 코드는 아래와 같습니다.
(이것도 시연화면을 먼저 보여드리겠습니다. 개요1 스타일의 텍스트만 추출하는 경우입니다.)

image

위 화면에서 사용한 코드는 아래와 같습니다.

import os

def insert_text(text):
    """
    문서에 텍스트를 삽입하는 함수입니다.
    """
    hwp.HAction.GetDefault("InsertText", hwp.HParameterSet.HInsertText.HSet)
    hwp.HParameterSet.HInsertText.Text = text
    hwp.HAction.Execute("InsertText", hwp.HParameterSet.HInsertText.HSet)


# 위 코드에서 추출한 결과
style2_text = get_style_text(2)  # 개요1 스타일에 해당하는 문자열만 추출(스타일 복수선택 가능)
# ['스타일1(개요1) AAA', '스타일1(개요1) DDD', '스타일1(개요1) GGG']


hwp.Run("FileNew")  # 빈 문서 생성
for para in style2_text:
    insert_text(para + "\r\n")  # 텍스트 + 줄바꿈 삽입
hwp.SaveAs(os.path.join(os.getcwd(), "result2.hwp"))  # 현재 위치에 다른이름으로 저장
hwp.Run("FileClose")

 

정확히 의도하신 바와 일치하지 않을 수 있지만,
기본 진행방법은 대체로 위와 비슷할 것입니다.
수정이나 부연이 필요한 부분이 있다면 추가 질문을 남겨주시면
빠르게 검토하도록 하겠습니다.

(미리 추가질문 남겨주신 "특정 스타일을 적용하는 방법"은 이어서 작성해드리겠습니다^^;)

MH H님의 프로필 이미지
MH H
질문자

성가신 일일 수 있는데, 이렇게 답변해주셔서 감사합니다.
아직 초보라서... 천천히 살펴보면서 한번 시도해보겠습니다.
좋은 하루되세요~^^

1

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

MH H님, 안녕하세요?

가능한 작업이기는 한데
제법 성가신 작업이라서,
제가 어느 정도 예제코드를 완성해서
다시 답변을 남겨드리겠습니다.

행복한 하루 되세요^^

MH H님의 프로필 이미지
MH H
질문자

넵 감사합니다. 기대하고 있겠습니다~^^

MH H님의 프로필 이미지
MH H
질문자

약간 업그레이드한 궁금증이 생겨 질문을 드리겠습니다.

 

원래 문서에 A, B, C, D, E, F, G, H라는 8개의 스타일이 적용되어 있고,

붙여넣기 할 새로운 문서에는 X, Y, Z라는 3개의 스타일을 설정해 놓고

 

  1. 원래 문서의 B스타일이 적용된 텍스트를 복사해서

새로운 문서에 붙여넣기한 후 X라는 스타일을 설정하고,

  1. 원래 문서의 F스타일이 적용된 텍스트를 복사해서

새로운 문서에 붙여넣기한 후 Y라는 스타일을 설정하고,

  1. 원래 문서의 H스타일이 적용된 텍스트를 복사해서

새로운 문서에 붙여넣기한 후 Z라는 스타일을 설정하여 저장할 수 있는지도 궁금합니다.

-1

안녕하세요, 인프런 AI 인턴이에요. 특정 스타일이 적용된 텍스트만 복사하여 따로 저장하는 방법은 여러 가지가 있습니다.

가장 간단한 방법은 특정 스타일이 적용된 텍스트를 찾아서 복사 후, 다른 곳에 붙여넣는 것입니다. 한글 문서의 경우에는 “찾기” 기능을 사용하여 특정 스타일을 찾을 수 있습니다.

  1. 문서에서 “Ctrl + F” 를 눌러 “찾기” 창을 엽니다.
  2. “찾기” 창에서 “스타일” 옵션을 선택하고, 원하는 스타일을 선택하여 검색합니다.
  3. 검색된 텍스트를 블록 지정하여 “Ctrl + C” 를 눌러 복사합니다.
  4. 복사한 텍스트를 원하는 곳에 붙여넣습니다.

이 방법을 사용하여 각각의 특정 스타일에 해당하는 텍스트를 별도로 저장할 수 있습니다. 다른 방법으로는 프로그래밍 언어나 스크립트를 사용하여 특정 스타일이 적용된 텍스트를 추출하는 방법도 있지만, 이는 상세한 내용을 알아야 하므로 좀 더 구체적인 정보를 제공해주시면 도움을 드릴 수 있을 것 같아요. 필요한 경우, 개발 관련 질문이 있다면 지식 공유자에게 문의해보시는 것도 좋은 방법일 수 있습니다. 수고하세요!

MH H님의 프로필 이미지
MH H
질문자

넵 답변 감사합니다. 그런 방법은 알고 있는데 그걸 자동화하는 방법이 궁금합니다~^^

MH H님의 프로필 이미지
MH H

작성한 질문수

질문하기