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

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

작성한 질문수

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

한/글 문서 내 모든 표의 캡션위치 수정하기(영상)

바탕쪽 텍스트추출, 표안의 사각형 안의 텍스트 추출, 표안의 글머리기호있는 텍스트 모두 추출

해결된 질문

작성

·

193

·

수정됨

1

 

 안녕하세요. 강의를 여러번 보면서 많은 도움을 얻고 있습니다. 감사합니다~
몇가지 질문 드립니다.

1. 바탕쪽이 표로 만들어져 있는 경우 바탕쪽에 있는 표의 셀안에 있는 텍스트는 어떻게 가져 올 수 있을까요?

 

2. 그리고 본문의 표의 셀내에 또 사각형을 만든 다음에 텍스트를 입력해 놓은 경우, 표의 셀안의 사각형 안의 텍스트를 가져오려면 어떻게 해야할까요?

 

3. 마지막으로 표안에 문단번호모양설정을 해서 글머리 기호 1. 2. 3.,,, 이런식으로 여러 줄이 있는 경우,

hwp.InitScan(Range=0xff), GetText를 이용하면 제일 위의 한 줄만 추출 되는 데 전체 텍스트를 다 가져 오려면 어떻게 해야할까요?

답변 1

2

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

Q1. 바탕쪽이 표로 만들어져 있는 경우 바탕쪽에 있는 표의 셀안에 있는 텍스트는 어떻게 가져 올 수 있을까요?

1. 바탕쪽이든 본문이든 표는 동일하게 접근할 수 있습니다.

1-1. 필드가 매겨진 경우

① hwp.get_field_text(필드명)을 실행하시면 셀 안의 텍스트를 리턴합니다.

(셀에 필드가 매겨져 있어야 합니다.)

image

② hwp.get_into_nth_table(0)을 실행하시면 곧바로 0번 표(바탕쪽 표)의 A1셀로 이동합니다.

image 이후, 다른 액션(TableRightCell, get_selected_text 등)과 연계하여

보다 복잡한 작업도 자동화하실 수 있습니다.

 

1-2. 필드가 매겨져 있지 않은 경우

① hwp.table_to_df(0)을 실행하시면 해당 표를 판다스 데이터프레임으로 가져옵니다.

image

판다스 데이터프레임은 엑셀이나 csv 뿐만 아니라 dict, list 등으로 변환하기 아주 쉬우므로

개인적으로는 데이터를 다룰 때 가장 많이 사용합니다.

image

② 단순히 어딘가에 붙여넣기를 원하신다면 아래처럼 "복사"를 하셔도 되겠습니다.

>>> hwp.get_into_nth_table(0)
>>> hwp.SelectCtrlFront()
>>> hwp.Copy()

image

 

 

Q2. 그리고 본문의 표의 셀내에 또 사각형을 만든 다음에 텍스트를 입력해 놓은 경우, 표의 셀안의 사각형 안의 텍스트를 가져오려면 어떻게 해야할까요?

2. 셀 안의 사각형에 접근하는 방법

2-1. 필드가 매겨져 있는 경우

get_field_text나 fields_to_dict 등을 통해 간편하게 텍스트를 추출하실 수 있습니다.

아래의 사각형들은 모두 "text_box"라는 필드명이 매겨져 있는 상태입니다.

image

2-2. 필드가 매겨져 있지 않은 경우

① 미리 해당 글상자의 get_pos 값을 알고 있는 상태라면

아래와 같이 간편하게 값을 추출할 수 있습니다.

(단, 문서에 표나 글상자 컨트롤이 추가/제거되지 않는 경우에 사용하세요.)

>>> hwp.set_pos(5,0,0)
>>> hwp.SelectAll()
>>> text = hwp.get_selected_text()
>>> hwp.Cancel()
>>> print(text)

Hello world2

image

② "문서의 몇 번째 글상자" 정도만 파악할 수 있는 경우라면?

hwp.set_pos로 접근하는 방법 외에도

hwp.ctrl_list를 통해 접근하실 수 있습니다.

image

다만 이 방법도 문서의 구조가 많이 바뀌는 상황에는 오류가 발생할 수 있으므로

주의하여 사용하셔야 합니다.

 

 

 

3. 마지막으로 표안에 문단번호모양설정을 해서 글머리 기호 1. 2. 3.,,, 이런식으로 여러 줄이 있는 경우,
hwp.InitScan(Range=0xff), GetText를 이용하면 제일 위의 한 줄만 추출 되는 데
전체 텍스트를 다 가져 오려면 어떻게 해야할까요?

3. GetText는 반복실행해야 합니다.

(글머리 기호와 상관없이) GetText는 한 줄씩 리턴합니다.

InitScan(Range=0xff)로 설정하셨으니, 선택영역만 탐색합니다.

일반적으로 아래처럼 while문과 사용하는 편입니다.

hwp.InitScan(range=0xff)  # 탐색 초기화(선택한 블록으로 탐색범위 제한)
state = 2
text_list = []
while state >= 2:  # 탐색 완료시 0 또는 1을 리턴하므로.
    state, text = hwp.GetText()
    hwp.move_pos(201)  # 탐색중인 위치로 이동
    if hwp.ParaShape.Item("HeadingType"):  # 글머리가 있는 경우에는
        text = hwp.GetHeadingString() + " " + text  # 글머리도 추출
    text_list.append(text.strip())
hwp.ReleaseScan()  # 탐색 종료

image

셀의 전체 텍스트를 가져오는 간편한 메서드들이 있기는 하지만

대부분 글머리를 추출하지 않기 때문에

위와 같은 방식을 사용하셔야 합니다.

 

글머리가 없는 경우에는 단순히 hwp.get_selected_text를 쓰시면 됩니다.

image

도움이 되었길 바랍니다.

추가로 궁금하거나, 구체적인 설명이 필요하시면

댓글이나 새 질문 남겨주시기 바랍니다.

 

행복한 하루 되세요^^

 

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

작성한 질문수

질문하기