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

janggetup님의 프로필 이미지
janggetup

작성한 질문수

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

그림 삽입하기

한글 문서에 표 안에 있는 그림을 별도 파일(jpg, png등등) 저장하려면 어떻게 해야 할까요?

해결된 질문

작성

·

742

·

수정됨

1

IMG_3392.jpeg안녕하세요~ ^^ 강의를 통해 많은 도움을 받고 있습니다. ~

다름이 아니라 ~ 한글 문서 표 안에 그림이 있는 것을 별도의 파일로 저장하는 파이썬 코드는 어떻게 해야 할까요~? “그림 삽입하기” 강의를 보고 나서 그 반대인 경우를 생각해봤습니다. 그림 ctrl 개체 선택 후 임의의 파일로 저장하는 방법이 궁금합니다. 표를 순회화면서 그림 개체를 발견하면 일정한 규칙을 정하고 파일을 저장하고 싶습니다.~

답변 2

2

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

안녕하세요?

안그래도 말씀 주신 덕분에 save_image 메서드를 따로 구현했습니다.

pyhwpx 모듈을 최신으로 업데이트하신 후에(`pip install --upgrade pyhwpx`)

2024년 3월 11일 저녁 현재 최신버전은 0.10.24입니다.

hwp.save_image(path, ctrl=hwp.CurSelectedCtrl) 방식으로 사용하셔도 되고,

이미지 앞에 캐럿을 두거나, 이미지를 선택한 상태라면

ctrl 파라미터를 생략하고 hwp.save_image(path)만 실행하셔도 됩니다.

 

참고하시라고 사용 예시를 몇 가지 보여드려보면^^;
(아래로 갈수록 고급입니다. 다소 복잡하거나 어렵다고 느껴질 수 있지만, 괜찮습니다.)

# 모든 이미지를 저장하는 예시
img_ctrls = [i for i in hwp.ctrl_list if i.UserDesc == "그림"]

for idx, ctrl in enumerate(img_ctrls):
    hwp.save_image(f"image{idx}.jpg", ctrl=ctrl)

ctrl=ctrl 이라는 부분이 생소하다고 하셨는데,
저장할 이미지를 save_image에게 알려줘야 하기 때문입니다.
만약 캐럿이 특정 이미지 앞에 있거나, 특정 이미지를 선택한 상태라면 선택이미지가 저장되지만,
위처럼 직접 순회중인 컨트롤을 알려주는 방법을 사용하실 수도 있습니다.
참고로 바로 아래 코드는
이미지 앞으로 캐럿 이동 후 save_image를 실행했기 때문에
ctrl=ctrl이라는 파라미터가 필요없습니다.
(ctrl 파라미터를 주지 않으면 캐럿 앞의 이미지를 자동으로 저장하기 때문입니다.)

# 표 안의 이미지만 저장하는 코드
# 직접 그림 앞으로 이동(move_to_ctrl)하므로
# save_image에 ctrl인수를 줄 필요 없음.

idx = 0
for ctrl in hwp.ctrl_list:
    hwp.move_to_ctrl(ctrl)
    if hwp.is_cell():
        hwp.save_image(f"image{idx}.jpg")
        idx += 1
# 표나 글상자 안의 이미지는 제외하고,
# 본문(List==0)의 이미지만 저장하는 코드
# GetAnchorPos로 위치를 탐색했지만, 이동하지는 않았으므로
# ctrl=ctrl 인수를 주었음.
idx = 0
img_list = [i for i in hwp.ctrl_list if i.UserDesc == "그림"]

for ctrl in img_list:
    if ctrl.GetAnchorPos(0).Item("List") == 0:  # 탐색했지만 이동하지는 않은 상태임.
        hwp.save_image(f"img{idx:04}.jpg", ctrl=ctrl)
        idx += 1
# 이미지 원본의 종횡비가 정확히 1:1인 이미지만 저장하는 코드
for idx, ctrl in enumerate(hwp.ctrl_list):
    if ctrl.UserDesc == "그림":
        img_attr = ctrl.Properties.Item("ShapeDrawImageAttr")
        if img_attr.Item("OriginalSizeX") == img_attr.Item("OriginalSizeX"):
        hwp.save_image(f"img{idx:03}.jpg", ctrl=ctrl)

마지막으로 문서의 모든 이미지를 저장하는 액션도 save_image로 수행 가능하겠지만,

보다 좋은 성능으로, 삽입 당시 원본 파일명까지 복원해주는

hwp.save_all_pictures라는 메서드도 제공하고 있습니다.

image

많은 활용 바랍니다.

 

추가로 질문하실 내용 있으면 댓글이나 추가질문 남겨주세요.

감사합니다. 행복한 하루 되세요^^

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

감사합니다~ 문서 취합 업무에 많은 도움일 될 것 같습니다. ^^

1

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

(문의1) hwp.save_image() 함수 사용시 idx 적용되지 않는 것 같습니다. 저장되는 이미지 파일명은 img.jpg 이름으로 고정되어 있어서 표에 여러 셀에 이미지가 있을 때 덮어쓰게 됩니다.

외부에서 아래처럼 파일명을 넘겨도 표안의 이미지는 “img.jpg” 파일명으로만 저장됩니다.. 패키지 버전은 0.10.22 입니다.


def generate_image_filename(idx, prefix="image", suffix=".jpg"):
    # 파일명을 동적으로 생성
    return f"{prefix}{idx:04}{suffix}"

 

(문의2) hwp.save_image(f”img{idx:04}.jpg”, ctrl=ctrl) 에서 ctrl=ctrl의 의미를 잘 모르겠습니다. ^^

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

(문의1)

헉ㅜ 커밋에 문제가 있었습니다ㅜㅜㅜ

0.10.23으로 업데이트 후 테스트해주시기 바랍니다. (감사합니다ㅎ)

참고로 댓글설명을 달다 보니 기존 내용과 중복이 많아ㅜ

답변 본문을 수정해 두었습니다.

ctrl 파라미터에 대한 내용과

예제 코드를 보완하였으니

찬찬히 읽어봐주시면 감사하겠습니다.

 

행복한 하루 되세요^^

janggetup님의 프로필 이미지
janggetup

작성한 질문수

질문하기