본문 바로가기
  • 안녕하세요! 금융, 책, 코딩을 기록합니다
Python/업무 자동화

[파이썬+워드] 워드 속 이미지 자동 추출하기

by 금책코 2024. 11. 2.

안녕하세요! 

 

오늘은 파이썬을 활용하여 MS Word(.docx) 안에 있는 단,복수의 이미지들을 자동으로 추출하는 코드를 소개하고자 합니다.

 

다음과 같은 상황에 계신 분들께 도움이 되리라 생각합니다.

 

1. 많은 워드 파일 속에 있는 모든 이미지 파일들을 따로 저장해두어야 하는 경우  

 

해당 내용은 범용성 있게 활용되진 않을 것이라 생각하지만, 데이터 검수나 DB작업을 하시는 분들께 도움이 되리라 생각합니다. 또한 코드도 매우 간결하니 쉽게 따라실 수 있을 것 같습니다. 

 

코드의 각주가 없는 것은 제일 밑 하단에 첨부하였습니다. 최종 실행코드는 [결과] 영상과 같습니다. 

[결과]

 

 

먼저 구현하려는 코드 순서는 다음과 같습니다. 

 

1) 필요 라이브러리를 설치 및 임포트 한다. 

2) 워드 파일의 폴더 경로와 저장할 경로를 설정해준다.

3) 폴더 경로 안에 있는 모든 워드 파일들을 리스트로 만든다. 

4) 추출한 이미지를 담는 폴더를 만들고, 각각의 워드 파일에서 이미지를 추출 후 넣는다.

 

 

그럼 가상의 워드파일(.docx)들을 바탕으로 코딩을 진행해 보겠습니다. 

 

[그림1]과 같이 복수의 워드파일들이 있습니다. 각각의 파일들에서 이미지만 추출하여 저장하고 싶은 상황입니다. 

[그림1]

 

또한 [그림2]는 각 워드파일의 내용을 부분적으로 보여주고 있습니다.

 

이를 보면 파일 안에는 이미지뿐만 아니라 흔하게 사용되는 표, 그래프도 있는 것을 알 수 있습니다.

 

이때 저희의 목적은 이미지만 추출하는 것입니다. (예시에서는 노트북이 있는 이미지)  

[그림2]

 

 

1) 필요 라이브러리를 설치 및 임포트 한다. 

# 1. 라이브러리 설치 및 임포트 

# 1-1 라이브러리 설치 (해당 라이브러리가 이미 설치되어 있는 분들은 생략하셔도 좋습니다.)
!pip install docx2txt
	# docx2txt 라이브러리뿐만 아니라 더욱 고급기능을 제공하는 aspose-words 라이브러리도 있습니다.
    # 하지만 aspose-words는 결제해야 이용할 수 있는 기능도 있기에, 오픈소스인 docx2txt를 활용합니다.
    # 더 복잡한 기능을 원하시거나, 기업단위로 쓰시고 싶으시다면 aspose-words도 괜찮을 것 같습니다.

# 1-2 라이브러리 임포트 
import docx2txt
import os

 

 

2) 워드 파일의 폴더 경로와 저장할 경로를 설정해준다.

# 2. 워드 파일의 폴더 경로와 저장할 경로를 설정해준다.

# 2-1. 워드 파일이 있는 폴더 경로 설정 
docx_path = "C:/Users/Desktop/test"

# 2-2. 워드 파일에 추출한 이미지를 저장할 폴더 경로 설정 
image_path = "C:/Users/Desktop/test2"

 

 

3) 폴더 경로 안에 있는 모든 워드 파일들을 리스트로 만든다. 

3. 폴더 경로 안에 있는 모든 워드 파일들을 리스트로 만든다. 

files = os.listdir(docx_path)

# 리스트에서 for문을 돌면서, 윈도우 운영체제를 위해 저장된 숨겨진 파일들을 걸러내는 작업입니다.
files = [i for i in files if os.path.isfile(os.path.join(docx_path, i)) and i != "desktop.ini"]

# 리스트를 폴더에서 수정된 순으로 정렬하는 함수입니다.    
files.sort(key=lambda x: os.path.getmtime(os.path.join(docx_path, x)))

 # 3-1 결과 출력
 # print(files)

 

3)까지 진행한 후 결과를 출력해보면 [그림3]과 같이 출력이 나옵니다. 

[그림3]

 

 

4) 추출한 이미지를 담는 폴더를 만들고, 각각의 워드 파일에서 이미지를 추출 후 넣는다.

# 4) 추출한 이미지를 담는 폴더를 만들고, 각각의 워드 파일에서 이미지를 추출 후 넣는다.

# for문을 돌면서 워드파일을 하나씩 가져옵니다.
for name in files:

    file_path = os.path.join(docx_path, name)
    file_name = os.path.splitext(name)[0]   
    	# .docx와 같은 확장자명을 지우고 파일명만 추출하는 코드입니다. 
    
    # 각 워드파일의 이름으로 개별 폴더를 만듭니다. 
    temp_folder = os.path.join(image_path, file_name)
    os.makedirs(temp_folder, exist_ok=True)

    # 이미지를 추출합니다.
    docx2txt.process(file_path, temp_folder)

 

4)까지 완료하면 최종적으로 얻고 싶은 이미지들을 [그림4]와 같이 얻을 수 있습니다.

[그림4]

 

 

+응용:

[그림4]처럼 기본적으로 모든 이미지의 이름들은 image1,2,3... 와 같이 적용됩니다.

 

만약 해당 이미지 또한 워드 파일명으로 넣어주고 싶다면 4)에서 for문을 하나 더 추가하면 됩니다.

for name in files:

    file_path = os.path.join(docx_path, name)
    file_name = os.path.splitext(name)[0]  
    
    temp_folder = os.path.join(image_path, file_name)
    os.makedirs(temp_folder, exist_ok=True)

    docx2txt.process(file_path, temp_folder)
    
	# 추가되는 for문입니다. 이미지를 추출하고 각 이름을 바꿉니다. 
    for index, img_file in enumerate(os.listdir(temp_folder), start=1):

		# 이미지가 있는 폴더 경로를 설정합니다.
        img_path = os.path.join(temp_folder, img_file)
        
        # 이미지 확장자가 있을 때 해당 과정을 통하여 파일명만 붙여줍니다.  
        img_ext = os.path.splitext(img_file)[1]  
        
        # 워드 파일명_img_1,2,3 과 같은 식으로 진행됩니다.
        new_img_name = f"{file_name}_img_{index}{img_ext}"
        
        # 바꾼 이미지명으로 경로를 설정해주고 이름을 변경합니다.
        new_img_path = os.path.join(temp_folder, new_img_name)
        os.rename(img_path, new_img_path)

 

마지막으로 주석이 없는 전체 코드입니다. 

# !pip install docx2txt

import docx2txt
import os

docx_path = "C:/Users/GO_YEONG_MIN/Desktop/test2"
image_path = "C:/Users/GO_YEONG_MIN/Desktop/test3"

files = os.listdir(docx_path)
files = [i for i in files if os.path.isfile(os.path.join(docx_path, i)) and i != "desktop.ini"]
files.sort(key=lambda x: os.path.getmtime(os.path.join(docx_path, x)))

for name in files:

    file_path = os.path.join(docx_path, name)
    file_name = os.path.splitext(name)[0]  
    temp_folder = os.path.join(image_path, file_name)
    os.makedirs(temp_folder, exist_ok=True)

    docx2txt.process(file_path, temp_folder)

 

긴 글 읽어주셔서 감사합니다. 조금이나마 도움이 되셨길 바랍니다!