인프런 커뮤니티 질문&답변
코드 정정방법 문의(문서 끼워 넣기 관련)
해결된 질문
작성
·
165
·
수정됨
1
지난 번에 답변주신 코드에서 일부 수정하여 아래와 같이 코드를 실행해 보면 제대로 작동되지 않습니다.
ChatGPT에 물어봐도 정확한 문제원인과 해결책을 알려주지 않아서 질문 올립니다.
제가 원하는 기능은, 바탕화면의 combine 폴더 안에 n개의 hwp파일을 위치 시킨 상태에서, 코드를 실행하면 hwp 문서들을 순서대로 끼워넣기 하여 "취합본.hwp"으로 저장하는 기능입니다.
지난 번에 일코님이 알려주신 코드는.. "개구리.hwp, 너구리.hwp, 다람쥐.hwp, 라마.hwp, ... "를 먼저 생성하고 나서 "취합본.hwp"을 만들어 내는 방법이었으므로, "# 샘플문서 생성"에 해당하는 코드를 제거하고 제가 원하는 기능으로 작동하기를 기대했습니다.
위와 같이 바탕화면의 combine 폴더 내에 1.hwp, 2.hwp, 3.hwp, 4.hwp, 5.hwp 문서를 넣어 두고 해당 폴더가 활성화된 상태에서 아래의 코드를 실행시켰습니다.
from pyhwpx import Hwp # 임포트
hwp = Hwp() # 한/글 실행
import os
# 끼워넣기
hwp.open(os.listdir()[0]) # 첫 번째(0) 파일 열기
for i in os.listdir()[1:]: # 첫 번째(0) 파일은 제외하고 두 번째(1)파일부터 아래 들여쓰기한 코드 반복
hwp.MoveDocEnd() # 한/글의 문서 끝으로 이동해서
hwp.BreakPage() # <----------------------- 페이지나누기(Ctrl-Enter)
hwp.insert_file(i) # 문서끼워넣기(기본값은 섹션, 글자, 문단, 스타일 모두 유지)
hwp.save_as("취합본.hwp") # 반복이 끝났으면 "취합본.hwp"로 다른이름으로저장
hwp.Quit() # 한/글 프로그램 종료
그러니까 원하는 대로 작동되지 않고 아래와 같이 나타납니다.

[질문] 위의 코드는 왜 제가 원하는대로 작동이 되지 않는지? 또 그 해결방법은 무엇인지?
[추가질문] 아래 코드 4줄은 한/글 자동화 코딩에서 거의 필수적으로 항상 쓰는 것 처럼 이해했었는데요.
위의 코드를 짜 주실 때 아래 4줄의 코드는 전혀 사용하지 않으셨었는데, 그 이유를 알 수 있을까요?
import win32com.client as win32
hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
hwp.XHwpWindows.Item(0).Visible = True
hwp.RegisterModule("FilePathCheckDLL","FilePathCheckerModule")
궁금합니다. 답변 부탁드립니다. 감사합니다.
답변 1
1
주현님, 안녕하세요?ㅎ
1. 첫 번째 오류의 원인은,
os.listdir()명령어가 기본적으로 현재 폴더의 모든 파일/폴더목록을 가져오기 때문에 발생합니다.
다시말해, .py 파일도 목록에 포함되어 있어서 그렇습니다.
해결방법은
①hwp파일만 필터링하거나,
②명시적으로 ["1.hwp", "2.hwp", "3.hwp", "4.hwp", "5.hwp"] 로 순회를 돌리시면 됩니다.
첫 번째 방법은 아래와 같은 코드로 실행하시면 됩니다.
from pyhwpx import Hwp # 임포트
hwp = Hwp() # 한/글 실행
import os
# 끼워넣기
file_list = [i for i in os.listdir() if i.endswith(".hwp")]
hwp.open(file_list[0]) # 첫 번째(0) 파일 열기
for i in file_list[1:]: # 첫 번째(0) 파일은 제외하고 두 번째(1)파일부터 아래 들여쓰기한 코드 반복
hwp.MoveDocEnd() # 한/글의 문서 끝으로 이동해서
hwp.BreakPage() # <----------------------- 페이지나누기(Ctrl-Enter)
hwp.insert_file(i) # 문서끼워넣기(기본값은 섹션, 글자, 문단, 스타일 모두 유지)
hwp.save_as("취합본.hwp") # 반복이 끝났으면 "취합본.hwp"로 다른이름으로저장
hwp.Quit() # 한/글 프로그램 종료② 두 번째 방법을 코드로 옮기면 아래와 같습니다.
from pyhwpx import Hwp # 임포트
hwp = Hwp() # 한/글 실행
import os
# 끼워넣기
file_list = ["1.hwp", "2.hwp", "3.hwp", "4.hwp", "5.hwp"]
hwp.open(file_list[0]) # 첫 번째(0) 파일 열기
for i in file_list[1:]: # 첫 번째(0) 파일은 제외하고 두 번째(1)파일부터 아래 들여쓰기한 코드 반복
hwp.MoveDocEnd() # 한/글의 문서 끝으로 이동해서
hwp.BreakPage() # <----------------------- 페이지나누기(Ctrl-Enter)
hwp.insert_file(i) # 문서끼워넣기(기본값은 섹션, 글자, 문단, 스타일 모두 유지)
hwp.save_as("취합본.hwp") # 반복이 끝났으면 "취합본.hwp"로 다른이름으로저장
hwp.Quit() # 한/글 프로그램 종료
GUI 없이 코드로만 자동화를 진행하는 경우에는
파이썬이 아래아한글로 어떤 문서를 열게 할지도
자주 고민해야 하는 부분입니다.
예를 들어 1~5.hwp 외에도 여러 개의 한/글 파일이 같은 폴더에 들어 있는 경우에
"{정수}.hwp" 형태의 파일만 골라 열어서 취합하고 싶으시다면
아래처럼 코드를 수정하시면 됩니다.
from pyhwpx import Hwp # 임포트
hwp = Hwp() # 한/글 실행
import os
# 끼워넣기
file_list = [i for i in os.listdir()
if i.endswith(".hwp") and i.split(".")[0].isdigit()]
hwp.open(file_list[0]) # 첫 번째(0) 파일 열기
for i in file_list[1:]: # 첫 번째(0) 파일은 제외하고 두 번째(1)파일부터 아래 들여쓰기한 코드 반복
hwp.MoveDocEnd() # 한/글의 문서 끝으로 이동해서
hwp.BreakPage() # <----------------------- 페이지나누기(Ctrl-Enter)
hwp.insert_file(i) # 문서끼워넣기(기본값은 섹션, 글자, 문단, 스타일 모두 유지)
hwp.save_as("취합본.hwp") # 반복이 끝났으면 "취합본.hwp"로 다른이름으로저장
hwp.Quit() # 한/글 프로그램 종료
이건 아래아한글 자동화보다는 파이썬 기본문법에 가까운 분야라서,
파이썬 문법을 어느 정도 병행해서 조금씩 접하시다 보면
필요한 수준의 지식은 자연스럽게 익히시게 될 겁니다.
2. import win32com.client를 쓰지 않는 이유
pyhwpx라는 모듈을 통해 hwp = Hwp()라는 명령어 안에
아래 코드가 포함되어 있습니다.
import win32com.client as win32
hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
hwp.XHwpWindows.Item(0).Visible = True
hwp.RegisterModule("FilePathCheckDLL","FilePathCheckerModule")그 외에도,
① RegisterModule이 실행되지 않는 경우 직접 FilePathCheckerModule을 다운로드,
② 레지스트리에디터에 FilePathCheckerModule을 새로 등록,
③ 현재 열려 있는 아래아한글 창이 있으면 새 창을 열지 않고 최근에 열린 한/글 창에 연결할 수 있게,
이런 부가적인 동작이 포함되어 있습니다.
아래아한글 자동화를 공부하면서
개인적인 편의 목적으로 만들어서 활용하던 함수들이 제법 많았습니다.
이 코드들을 다른 분들과 공유하면 좋겠다는 마음에서
pip으로 편하게 설치할 수 있게 오픈소스로 올해 초 온라인에 공개를 했습니다.
소스코드인
pyhwpx.py파일을 열어보면
대부분 win32com 코드로 만들어져 있습니다.
pyhwpx.Hwp 클래스의 인터페이스 자체는 win32com으로 생성하는 hwp와 거의 동일하지만
특정 액션, 예를 들면 hwp.GetText, hwp.PutFieldText 등의 메서드나 CreateTable 같은 액션은
업무자동화 프로세스를 직접 짜보면 단순한 작업인데도 코드가 수십줄로 길어지게 됩니다.
그리고 이게 입문자에게 가장 큰 진입장벽이더라고요.
그래서 편의를 위해 일부 확장 명령어를 제공한다든지,
기존의 액션을 조금 보완한다든지, 그렇게 다듬어 가고 있는 중입니다.
그래서, 굳이 pyhwpx를 쓰실 필요는 없습니다.
win32com으로 업무자동화 코드를 짤 수 있는 어느 정도 수준이 되시고 나면
업무 특성에 따라 굉장히 자주 반복되는 패턴들이 보이실 거고,
그런 코드는 저장해 뒀다가 자주 재활용하시게 될텐데
pyhwpx도 일종의 "미리 저장해 둔 코드모음" 같은 거라서요..
답변이 되었길 바랍니다^^;






상세한 답변 감사드립니다.
■ 1번 답변 관련.
제시해 주신 코드가 처음에 실행되지 않아 원인을 찾아보니,
작업 디렉토리를 "바탕화면의 combine 폴더"로 명확하게 인식하지 않는 거 같았습니다.
그래서 원 코드에 아래와 같은 코드를 추가해 주었습니다.
이에 따른 코드 수정본은 아래와 같습니다.
그러니까 원하는대로 잘 작동합니다.
같은 방법으로 2번째 방법(파일명을 명시하여 리스트에 저장하는 방식)의 코드도 잘 작동합니다.
저같은 컴맹도 문제를 해결할 수 있게 도움을 주셔서 감사합니다! ^^
■ 2번 답변 관련.
pyhwpx의 정체(?)를 알게 되었고, 일코님께 존경심이 드네요~!
제가 그 수준까지 올라가려면 어느 정도의 수련(?)이 필요할까요? 영영 어려울지도 모르지만요.
아무튼, 친절히 설명해 주셔서 무슨 말인지 알게 되었습니다. 이 역시 감사드립니다. ^^