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

유정진님의 프로필 이미지

작성한 질문수

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

hwp 문서 내의 개체를 파일명으로 찾는 방법이 있을까요?

해결된 질문

23.04.10 05:05 작성

·

748

1

먼저, 강의 감사합니다. 많은 도움이 되고 있습니다!

그림파일로 입력된 원번호를 텍스트 원번호로 교체하고 싶습니다.

문서에 삽입된 그림파일의 파일명(개체 설명문에 나오는)으로 객체를 찾는 방법이 궁금합니다.

답변 2

2

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

2023. 04. 10. 12:47

예시코드입니다.

아래와 같은 문서가 있을 때(1.png, 2.png, 3.png, 4.png가 삽입되어 있습니다.)

image

미리 짜둔 아래 함수를 실행하면

image

위와 같이 파일명이나 삽입순서로 이미지를 선택할 수 있습니다.

그럼 이번엔
이미지를 지우고 원문자를 삽입하는 작업도 간단히 진행해보겠습니다.

image

이제 코드 전체를 보여드리겠습니다.
(너무 길다고 놀라지 마시고 차근차근 읽어보시면 좋겠어요ㅎㅎ)
이 중 몇 개는 위 예제에서 사용하지 않은 함수입니다.

import os
import xml.etree.ElementTree as ET
import win32com.client as win32


def hwp_init():
    hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
    hwp.XHwpWindows.Item(0).Visible = True
    hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")
    return hwp


def save_as_hml():
    hwp.HAction.GetDefault("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet)
    hwp.HParameterSet.HFileOpenSave.filename = hwp.Path.replace("hwpx", "hml")
    hwp.HParameterSet.HFileOpenSave.Format = "HWPML2X"
    return hwp.HAction.Execute("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet)


def get_image_dict():
    save_as_hml()
    tree = ET.parse(hwp.Path.replace(".hwpx", ".hml"))
    root = tree.getroot()
    total_count = int(list(root.iter("BINDATALIST"))[0].attrib["Count"])
    image_dict = {list(root.iter("SHAPECOMMENT"))[i].text.split("\n")[1].split(": ")[1]: i for i in range(total_count)}
    os.remove(hwp.Path.replace(".hwpx", ".hml"))
    return image_dict


def select_image_by_order(order):
    hwp.Run("Cancel")
    ctrl = hwp.HeadCtrl
    count = 0
    while ctrl:
        if ctrl.UserDesc == "그림":
            if order == count:
                hwp.SetPosBySet(ctrl.GetAnchorPos(1))
                hwp.FindCtrl()
                return
            count += 1
        ctrl = ctrl.Next
    return False


def select_image_by_filename(filename):
    hwp.Run("Cancel")
    order = image_dict[filename]
    ctrl = hwp.HeadCtrl
    count = 0
    while ctrl:
        if ctrl.UserDesc == "그림":
            if order == count:
                hwp.SetPosBySet(ctrl.GetAnchorPos(1))
                hwp.FindCtrl()
                return
            count += 1
        ctrl = ctrl.Next
    return False


def get_image_ctrl_dict():
    image_ctrl_dict = {}
    hwp.Run("Cancel")
    ctrl = hwp.HeadCtrl
    count = 0
    while ctrl:
        if ctrl.UserDesc == "그림":
            image_ctrl_dict[count] = ctrl
            count += 1
        ctrl = ctrl.Next
    return image_ctrl_dict


def 원문자삽입(num):
    hwp.HAction.GetDefault("InsertText", hwp.HParameterSet.HInsertText.HSet)
    hwp.HParameterSet.HInsertText.Text = chr(9311 + num)
    return hwp.HAction.Execute("InsertText", hwp.HParameterSet.HInsertText.HSet)


if __name__ == "__main__":
    hwp = hwp_init()
    hwp.Open(r"C:\Users\Administrator\Desktop\이미지명\이미지명으로탐색.hwpx")
    image_dict = get_image_dict()
    image_ctrl_dict = get_image_ctrl_dict()
    for i, j in image_dict.items():
        # 파일명이 숫자로만 이뤄져 있으면?
        if i.split(".")[0].isdigit():
            ctrl = image_ctrl_dict[image_dict[i]]
            # 해당 위치로 이동
            hwp.SetPosBySet(ctrl.GetAnchorPos(1))
            # 이미지 삭제 후
            hwp.DeleteCtrl(ctrl)
            # 파일명에 따라 원문자 삽입
            원문자삽입(int(i.split(".")[0]))

혹시 이해가 잘 안 되는 부분이 있다면
자유롭게 댓글 남겨주세요.
상세하게 설명드리겠습니다.

검토해보시고 추가로 필요하신 부분 알려주세요ㅎ

행복한 하루 되세요^^

유정진님의 프로필 이미지
유정진
질문자

2023. 04. 10. 13:18

와우... 감사합니다!!

코드를 보는 것만으로도 많은 공부가 됩네요!(수강료를 올리셔야,,,ㅎㅎㅎ)

1

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

2023. 04. 10. 11:17

정진님 안녕하세요?^^

파일명으로 이미지 컨트롤을 찾는 기능은
간단한 함수들의 조합으로 제작 가능합니다.

제가 정진님 질문을 이해하기로는

(예를 들어)
"1.png"가 이미지 원번호 ①이고,
"2.png"가 이미지 원번호 ②인데,
이를 각각 텍스트 원번호 ①과 ②로 교체하시겠다는 말씀 같은데
맞나요?ㅎ

제가 오늘 중으로 예제코드를 짜서 한 번 보여드려보겠습니다.