인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

박주현님의 프로필 이미지
박주현

작성한 질문수

직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피

파이썬으로 한/글 프로그램을 열기

아래아한글 여러 파일 병합 코드의 기능 개선 문의

작성

·

18

1

 

일코 강사님께서 일전에 "끼워넣기를 통해 아래아한글의 여러파일을 병합하는 코드"를 짜주셨는데요.

해당 코드가 작동은 하지만, 일부 기능은 원하는 대로 되지 않는 부분이 있어서 개선방법을 문의 드립니다.

 

현재의 파이썬 코드는 아래와 같습니다.

from pyhwpx import Hwp  # 임포트

hwp = Hwp()  # 한/글 실행

import os


# 작업할 디렉토리를 명시적으로 설정 (예: "C:/Users/Username/Documents")
target_dir = "D:\magicfolder"

# 작업 디렉토리로 변경
os.chdir(target_dir)

# 끼워넣기
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()  # 한/글 프로그램 종료

 

"D:\magicfolder"에 n개의 파일을 넣어두고 위 코드를 실행하면,

첫 번째(0) 파일을 먼저 열고,

문서 끼워 넣기(ctrl+o)를 이용해 두 번째(1), 세 번째(2), ... n번째(n-1) 파일을 차례로 끼워넣기 합니다.

 

문서 끼워 넣기(ctrl+o) 팝업에서 아래아한글에서 체크할 수 있는 옵션은 아래의 4개 입니다.

image.png

 

제가 의도하는 것은 문서 끼워 넣기(ctrl+o) 시

매번 위 4개 항목(글자 모양 유지, 스타일 유지, 문단 모양 유지, 쪽 모양 유지)에 체크된 상태로 끼워넣는 것입니다.

여기서, 원하는 것은 끼워 넣는 다양한 파일들이 구역설정이나 스타일이 다를 때 각각의 원본을 그래로 유지한 채 병합하는 것입니다.

 

현재 코드에 일코님께서 메모해 주시기로는

hwp.insert_file(i) # 문서끼워넣기(기본값은 섹션, 글자, 문단, 스타일 모두 유지)

라고 하셨으나,

실제 코드를 실행한 결과는

첫 번째(0) 파일의 편집 용지(F7) 상 구역설정 1가지만 취합본에 적용된 것이 확인됩니다.

 

이게 불편한 이유는,

예를 들면 첫 번째(0) 파일, 두 번째(0) 파일, ..., n번째(n-1) 파일의 구역설정(상하좌우 용지여백 등)이 다를 때

첫 번째(0) 파일의 구역설정 1가지에 맞추어서 취합되면, 작성내용이 다 틀어지기 때문입니다.

hwp.insert_file( ) 이라는 기능을 아래아한글 API문서에서 찾기 시도했으나 발견하지 못했습니다.

hwp.insert_file( )이라는 기능은 일코님이 제작하신 pyhwpx 패키지에만 포함된 기능일까요?

 

코드를 실행해 문서 끼워 넣기(ctrl+o) 시,

글자 모양 유지, 스타일 유지, 문단 모양 유지, 쪽 모양 유지를 강제로 체크하도록 하는 방법이 있을까요?

 

도움 부탁드립니다. 감사합니다.

 

답변 1

1

일코님의 프로필 이미지
일코
지식공유자

주현님 안녕하세요?

hwp.insert_file 메서드는 제가 임의로 추가하긴 했지만,

원래 소스는 win32의 hwp.InsertFile입니다.

파라미터는 keep_section=1, keep_charshape=1, keep_parashape=1, keep_style=1, move_doc_end=False 로 이미 기본값이 부여되어 있어, 체크박스 네 개를 다 켠 것과 동일한 상태입니다.

 

pyhwpx를 사용하시면서 win32의 기능을 그대로 사용하시려면,
hwp 객체 안의 hwp 객체를 사용하시면 됩니다. (win32의 hwp도 로딩이 되어 있습니다.)
예를 들면 아래처럼,
hwp.hwp.InsertFile(FilePath, KeepSection=1, KeepCharshape=1, KeepParashape=1, KeepStyle=1)이라고 실행하시면 됩니다.

제 PC에서 재현해보려고 문서 몇 개를 테스트해봤는데,
스타일과 용지, 글자모양, 문단모양을 전부 다르게 잡고 병합해봐도
정상 작동합니다...ㅜㅜㅜ

 

혹시 아래 링크의 압축파일을 다운받아 압축을 푸신 후 코드를 한 번 적용해보시겠어요?

https://drive.google.com/file/d/1a_QvC85TLabHGbT5u11__YanOSY7Axp9/view?usp=sharing

파일들은 각각 아래와 같은 서식입니다.

문서01.hwp

image.png

문서02.hwp

image.png

 

문서03.hwp

image.png

 

스타일, 글자모양, 문단모양, 페이지여백을 모두 다르게 적용한 상태입니다.

아래 코드를 실행하면,

from pyhwpx import Hwp

hwp = Hwp()

import os


target_dir = r"C:\Users\Administrator\Desktop\새 폴더"

os.chdir(target_dir)

file_list = [i for i in os.listdir() 
             if i.endswith(".hwp")]
hwp.open(file_list[0])
hwp.MoveDocEnd()
for i in file_list[1:]:
    hwp.insert_file(i, move_doc_end=True)

제대로 병합이 되는 듯 합니다... (제 PC에서만 그런가 의심은 됩니다ㅜ)

녹화_2024_12_20_19_01_07_378.gif

기존 소스코드 중에 BreakPage 라인은 제거하였습니다.
keep_section이 켜져 있어서 자동으로 자르고 다음페이지로 넘어가니까요ㅜ

 

추측해보건대,

메서드의 문제라기보다는 문서 때문에 문제가 발생하는 게 아닌가 싶기도 합니다.
혹시 괜찮으시다면 병합이 안 되는 예시파일을 샘플로 전송해주시면
제가 직접 테스트해봐도 될까요? 메일주소는 martinii.fun@지메일입니다.

만약 한글2014VP 이상의 버전을 사용 중이시면
CopyPage 및 PastePage를 반복해서 사용하시는 방법도 추천드립니다.
페이지별로 옮기는 메서드라서 InsertFile에 비해 다소 느리기는 하지만ㅠ
큰 문제가 발생했던 적은 없어서, 자주 사용을 했습니다.

 

회신 기다리겠습니다.

감사합니다.

박주현님의 프로필 이미지
박주현
질문자

병합재료가 되었던 해당 파일은 회사에 두고 왔는데 지금이 금요일 저녁이라서 출근 시 확인하여 메일 송부드리겠습니다.

 

답변 감사드립니다.

지금 폰으로 답변 내용은 확인하였으나 회사 PC에서 테스트해봐야 할 거 같습니다.

 

좋은 주말 보내세요~ ^^

박주현님의 프로필 이미지
박주현

작성한 질문수

질문하기