hwp
파일은 참 코딩에 활용하기 번거롭다...
한글 파일에 [ U18 ]
이런식으로 셀번호가 표기되어 있으면 엑셀에서 U열 18행 값을 찾아 넣는 작업을 파이썬으로 자동화하려고 한다.
파이썬으로 한글파일을 다루기 위해서는 pywin32
를 설치해야 한다.
pip install pywin32
import win32com.client as win32
hwp=win32.gencache.EnsureDispatch("HWPFrame.HwpObject")
hwp.Open("hwp 파일 경로","HWP","forceopen:true")
❗ 여기서부터는 자동화에 필요한 코드를 각자 알아서 따와야 한다 ❗
아래한글 매크로 스크립트를 녹화해서 코드를 가져다 쓰는 방식인데, 예시로 문자열 찾기를 해보도록 하겠다.
빈 한글 파일을 열어서 대충 내용을 채운다.
Shift
+ Alt
+ H
-> 아무거나 선택하고 정의
를 누르면 해당 한글파일에 작용하는 액션들의 스크립트 코드가 기록된다.
Ctrl
+F
눌러서 '그리워하다'라는 문자를 찾고 닫기
Shift
+ Alt
+ X
(녹화종료) -> Shift
+ Alt
+ L
(스크립트목록 열기) -> Alt
+ C
(녹화한 코드 열기)
나온 코드를 필요한 부분만 떼서 파이썬으로 고쳐서 쓴다.
// 녹화된 스크립트 코드
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);
이런식으로 필요한 부분의 스크립트를 따면 아래와 같이 나온다. (이미지 삽입같은건 안됨..,)
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)
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)
new_filename = "새로운 파일명"
new_file_path = file_root + "/" + new_filename
hwp.SaveAs(new_file_path)
hwp.Quit()
파이썬 코드만 돌렸을 때는 잘 돌아갔는데 장고 API로 사용하려고 url 연결을 해서 실행하니까 CoInitialize
가 호출되지 않았다는 오류가 떴다. 해결하는데 오래 걸릴 줄 알았는데 생각보다 쉽게 해결되었다.
import pythoncom
def pywin32를_사용하는_함수(request):
pythoncom.CoInitialize()
# ...
# pywin32를 사용하는 코드
# ...
pythoncom.CoUninitialize()
file_root = os.path.abspath(os.path.join(
os.path.dirname(__file__), # 앱 폴더명
"앱폴더 안에 있는 폴더 or 파일명"
))
from django.core.files.storage import FileSystemStorage
from django.http import FileResponse
def 파일다운로드함수(request):
fs = FileSystemStorage("파일 경로")
response = FileResponse(fs.open("파일 경로", 'rb'), filename="파일명")
return response
https://github.com/zizaekku/report-system
위치 : report-system/pdf/views.py
[파이썬] 한글파일 내 특정 문자열 찾아 바꾸기
[파이썬-한/글]이미지 삽입시 "글뒤로 보내기" 설정방법
03) COM과 스레드