Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 MS Word 문서 다루기: 단락 생성과 이미지 삽입 완벽 가이드

소개

데이터 엔지니어링 전문가로 일하다 보면 테스터들이 Microsoft Word 문서로 작성한 테스트 결과를 자주 받게 됩니다. 스크린샷부터 아주 긴 단락까지, 워드 문서 하나에 방대한 정보가 담겨 있곤 하죠.

어느 날 테스트 팀에서 도구가 자동으로 생성한 텍스트와 이미지(자동 캡처된 스크린샷)를 Word 문서에 삽입해 주는 프로그램을 만들어 달라는 요청을 받았습니다.

MS Word는 다른 문서 형식과 달리 '페이지'라는 개념이 없고, 안타깝게도 모든 것이 단락(paragraph) 단위로 동작합니다. 따라서 문서를 깔끔하게 나누려면 줄바꿈(break)과 섹션(section)을 적절히 활용해야 합니다.

시작하기: python-docx 설치

먼저 python-docx 라이브러리를 설치합니다.

pip install python-docx

1. 새 문서 만들기와 단락 추가

새 Word 문서를 생성하고, 단락을 추가한 뒤 줄바꿈을 넣어 여러 줄의 텍스트를 작성해 보겠습니다.

import docx

# 새 문서 생성
WordDocx = docx.Document()

# 단락 추가
Paragraph = WordDocx.add_paragraph('1. Hello World, 샘플 텍스트입니다...')
run = Paragraph.add_run()

# 줄바꿈(line break)이 포함된 단락
run.add_break(docx.text.run.WD_BREAK.LINE)

# 같은 단락에 이어서 텍스트 추가
Paragraph.add_run('2. 두 번째 줄을 작성했습니다. 계속 더 쓸 수도 있습니다.')

# 최종적으로 문서 저장
WordDocx.save('My_Amazing_WordDoc.docx')

2. 문서 내용 검증하기

작성한 문서가 제대로 저장되었는지 확인해야겠죠? 프로그래머니까 당연히 코드로 확인합니다.

doc = docx.Document('My_Amazing_WordDoc.docx')
print(f"output \n *** Document has {len(doc.paragraphs)} - paragraphs")
for paragraph_number, paragraph in enumerate(doc.paragraphs):
    if paragraph.text:
        print(f"\n {paragraph.text}")

실행 결과

*** Document has 1 - paragraphs

1. Hello World, Some Sample Text Here...
2. I have just written my 2nd line and I can write more..

단락은 1개지만 그 안에 줄바꿈으로 구분된 두 줄의 텍스트가 들어 있는 것을 확인할 수 있습니다.

이미지 삽입하기

3. 이미지 준비와 삽입

이제 문서에 이미지를 추가해 보겠습니다. 먼저 저작권 문제가 없는 이미지가 필요합니다. 여기서는 저작권 걱정 없이 어떤 용도로든 사용할 수 있는 무료 이미지를 제공하는 unsplash.com에서 이미지를 다운로드했습니다. 인터넷에서 이미지를 가져올 때는 항상 저작권을 꼼꼼히 확인하시기 바랍니다.

다운로드한 이미지 파일명은 Tree.jpg이며, 이 이미지를 문서에 추가하겠습니다.

import requests
from docx.shared import Cm

# GitHub에서 이미지 다운로드
response = requests.get("https://raw.githubusercontent.com/sasankac/TestDataSet/master/Tree.jpg")
image = open("Tree.jpg", "wb")
image.write(response.content)
image.close()

# 문서에 이미지 추가
image_to_add = doc.add_picture("Tree.jpg")
print(f"output \n *** MY Image has width = {image_to_add.width} and Height as - {image_to_add.height}")

실행 결과

*** MY Image has width = 43891200 and Height as - 65836800

출력된 값은 EMU(English Metric Unit) 단위입니다. Word에서는 픽셀이나 센티미터 대신 EMU라는 내부 단위로 크기를 관리합니다.

4. 이미지 크기 조절하기

원본 이미지가 너무 크기 때문에 적절한 크기로 조절해야 합니다. widthheight 매개변수를 활용하면 됩니다.

image_to_add.width = Cm(10)
image_to_add.height = Cm(10)
print(f" *** My New dimensions Image has width = {image_to_add.width} and Height as - {image_to_add.height}")

# 최종적으로 문서 저장
doc.save('report.docx')

실행 결과

*** My New dimensions Image has width = 3600000 and Height as - 3600000

10cm × 10cm 크기로 조절되었습니다. 참고로 1cm는 360,000 EMU에 해당합니다.

5. 결과 확인

생성된 report.docx 파일을 열면 텍스트와 함께 지정한 크기의 이미지가 삽입된 것을 확인할 수 있습니다.

전체 코드 예제

지금까지 배운 내용을 하나로 합친 완성 코드입니다.

import requests
from docx.shared import Cm

# GitHub에서 이미지 다운로드
response = requests.get("https://raw.githubusercontent.com/sasankac/TestDataSet/master/Tree.jpg")
image = open("Tree.jpg", "wb")
image.write(response.content)
image.close()

# 문서에 이미지 추가
image_to_add = doc.add_picture("Tree.jpg")
print(f"output \n *** MY Image has width = {image_to_add.width} and Height as - {image_to_add.height}")

# 이미지 크기 조절
image_to_add.width = Cm(10)
image_to_add.height = Cm(10)
print(f" *** My New dimensions Image has width = {image_to_add.width} and Height as - {image_to_add.height}")

# 최종적으로 문서 저장
doc.save('report.docx')

실행 결과

*** MY Image has width = 43891200 and Height as - 65836800
*** My New dimensions Image has width = 3600000 and Height as - 3600000

마치며

이처럼 python-docx를 활용하면 반복적인 보고서 작성 업무를 자동화할 수 있습니다. 특히 테스트 결과처럼 텍스트와 스크린샷이 함께 들어가는 문서를 프로그램으로 생성하면 시간을 크게 절약할 수 있습니다. 줄바꿈(WD_BREAK), 페이지 나누기(WD_BREAK.PAGE), 섹션 등을 추가로 활용하면 더욱 체계적인 문서 구조를 만들 수 있습니다.