[Python] 아래 한글 문서작업 파이썬 자동화

김재연·2022년 10월 27일
1
post-thumbnail

hwp 파일은 참 코딩에 활용하기 번거롭다...

한글 파일에 [ U18 ] 이런식으로 셀번호가 표기되어 있으면 엑셀에서 U열 18행 값을 찾아 넣는 작업을 파이썬으로 자동화하려고 한다.

1. 라이브러리 설치

파이썬으로 한글파일을 다루기 위해서는 pywin32를 설치해야 한다.

pip install pywin32

2. 파일 열기

import win32com.client as win32

hwp=win32.gencache.EnsureDispatch("HWPFrame.HwpObject")
hwp.Open("hwp 파일 경로","HWP","forceopen:true")

3. 아래 한글 매크로 스크립트 녹화하기

❗ 여기서부터는 자동화에 필요한 코드를 각자 알아서 따와야 한다 ❗

아래한글 매크로 스크립트를 녹화해서 코드를 가져다 쓰는 방식인데, 예시로 문자열 찾기를 해보도록 하겠다.

  1. 빈 한글 파일을 열어서 대충 내용을 채운다.

  2. Shift + Alt + H -> 아무거나 선택하고 정의를 누르면 해당 한글파일에 작용하는 액션들의 스크립트 코드가 기록된다.

  1. Ctrl+F 눌러서 '그리워하다'라는 문자를 찾고 닫기

  2. Shift + Alt + X (녹화종료) -> Shift + Alt + L (스크립트목록 열기) -> Alt + C (녹화한 코드 열기)

  3. 나온 코드를 필요한 부분만 떼서 파이썬으로 고쳐서 쓴다.

// 녹화된 스크립트 코드
function OnScriptMacro_중국어1()
{
	HAction.GetDefault("RepeatFind", HParameterSet.HFindReplace.HSet);
	with (HParameterSet.HFindReplace)
	{
		ReplaceString = "";
		FindString = "그리워하다";
		IgnoreReplaceString = 0;
		IgnoreFindString = 0;
		Direction = FindDir("Forward");
		WholeWordOnly = 0;
		UseWildCards = 0;
		SeveralWords = 0;
		AllWordForms = 0;
		MatchCase = 0;
		ReplaceMode = 0;
		ReplaceStyle = "";
		FindStyle = "";
		FindRegExp = 0;
		FindJaso = 0;
		HanjaFromHangul = 0;
		IgnoreMessage = 1;
		FindType = 1;
	}
	HAction.Execute("RepeatFind", HParameterSet.HFindReplace.HSet);
}
# 파이썬으로 고친 코드
# hwp=win32.gencache.EnsureDispatch("HWPFrame.HwpObject")
hwp.HAction.GetDefault("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);
hwp.HParameterSet.HFindReplace.FindString = "그리워하다"
hwp.HParameterSet.HFindReplace.IgnoreMessage = 1
hwp.HAction.Execute("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);

이런식으로 필요한 부분의 스크립트를 따면 아래와 같이 나온다. (이미지 삽입같은건 안됨..,)


3-1. 모두 찾아바꾸기 (텍스트인 경우)

hwp.HAction.GetDefault("AllReplace", hwp.HParameterSet.HFindReplace.HSet)
option=hwp.HParameterSet.HFindReplace
option.FindString = "찾을 문자열"
option.ReplaceString = "바꿀 문자열"
option.IgnoreMessage = 1
hwp.HAction.Execute("AllReplace", hwp.HParameterSet.HFindReplace.HSet)

3-2. 이미지 삽입하기 (이미지인 경우)

hwp.InsertPicture("이미지 경로", Embedded=True) # 이미지 삽입
hwp.FindCtrl() # 이미지 선택 (커서에서 인접한 개체 선택)
hwp.HAction.Run("Cut") # 잘라내기

while True:
	# 이미지 삽입할 위치 찾기
	hwp.HAction.GetDefault("RepeatFind", hwp.HParameterSet.HFindReplace.HSet)
	hwp.HParameterSet.HFindReplace.FindString = "찾을 문자열"
	hwp.HParameterSet.HFindReplace.IgnoreMessage = 1
	result = hwp.HAction.Execute("RepeatFind", hwp.HParameterSet.HFindReplace.HSet)

	# 다 바꿨으면 종료
	if result == False:
		break

	# 붙여넣기
	hwp.HAction.GetDefault("Paste", hwp.HParameterSet.HSelectionOpt.HSet)
	hwp.HAction.Execute("Paste", hwp.HParameterSet.HSelectionOpt.HSet)

4. 파일 다른 이름으로 저장 후 닫기

new_filename = "새로운 파일명"
new_file_path = file_root + "/" + new_filename
hwp.SaveAs(new_file_path)
hwp.Quit()

5. 🕸 CoInitialize 오류 해결

파이썬 코드만 돌렸을 때는 잘 돌아갔는데 장고 API로 사용하려고 url 연결을 해서 실행하니까 CoInitialize가 호출되지 않았다는 오류가 떴다. 해결하는데 오래 걸릴 줄 알았는데 생각보다 쉽게 해결되었다.

import pythoncom

def pywin32를_사용하는_함수(request):
	pythoncom.CoInitialize()
    # ...
	# pywin32를 사용하는 코드
    # ...
	pythoncom.CoUninitialize()

6. 번외

1) 파일 경로 지정하기

file_root = os.path.abspath(os.path.join(
        os.path.dirname(__file__), # 앱 폴더명
        "앱폴더 안에 있는 폴더 or 파일명"
    ))

2) 파일 다운로드

from django.core.files.storage import FileSystemStorage
from django.http import FileResponse

def 파일다운로드함수(request):
	fs = FileSystemStorage("파일 경로")
	response = FileResponse(fs.open("파일 경로", 'rb'), filename="파일명")
	return response

7. 최종코드

https://github.com/zizaekku/report-system

위치 : report-system/pdf/views.py


Reference

[파이썬] 한글파일 내 특정 문자열 찾아 바꾸기
[파이썬-한/글]이미지 삽입시 "글뒤로 보내기" 설정방법
03) COM과 스레드

profile
일기장같은 공부기록📝

0개의 댓글

관련 채용 정보