# from pyhwpx import Hwp # 임포트 # hwp = Hwp() # 아래아한글 실행(프로그램이 실행되어 있는 경우, 기존 한/글 프로그램에 연결됨) # hwp.insert_text("Hello world!\r\n") # 문자열 삽입 # hwp.create_table(5, 5, treat_as_char=True) # 5행5열의 표 삽입(글자처럼 취급) # for i in range(25): # 표에 내용 삽입 # hwp.insert_text(i) # hwp.TableRightCell() # hwp.MoveDown() # hwp.insert_picture("https://ultralytics.com/images/zidane.jpg") # 이미지 삽입 # hwp.ShapeObjAttachCaption() # 캡션 삽입 # hwp.insert_text("Zidane") # 캡션 문자열 입력 # hwp.ParagraphShapeAlignCenter() # 캡션 가운데정렬 # hwp.SelectAll() # 캡션 전체선택 # hwp.set_font(Bold=True, FaceName="돋움", Height=20, TextColor="Red") # 캡션 글자모양 변경 # hwp.Cancel() # 선택해제 # hwp.Close() # 캡션 편집 종료 import win32com.client import os import logging import shutil from pathlib import Path from itertools import chain import time import win32com.client.gencache def setup_logging(): """로깅 설정""" logging.basicConfig( level = logging.INFO, format = '%(asctime)s - %(levelname)s - %(message)s', handlers = [ logging.FileHandler('hwp_conversion.log', encoding='utf-8'), logging.StreamHandler() ] ) def convert_hwp_to_xml(input_folder, output_folder): """ 지정된 폴더 내의 모든 HWP 파일을 XML로 변환 Args: input_folder (str): HWP 파일이 있는 폴더 경로 output_folder (str): XML 파일을 저장할 폴더 경로 """ try: # 한글 애플리케이션 객체 생성 # hwp = win32com.client.Dispatch("HWPFrame.HwpObject") hwp = win32com.client.gencache.EnsureDispatch("HWPFrame.HwpObject") # 자동화 보안 설정 hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule") hwp.XHwpWindows.Item(0).Visible = False # hwp.XHwpWindows.Item(0).Visible = True # 출력 폴더가 없으면 생성 os.makedirs(output_folder, exist_ok=True) parent_folder = os.path.dirname(output_folder) test_folder_path = os.path.join(parent_folder, "TEST") os.makedirs(test_folder_path, exist_ok=True) # HWP 파일 검색 및 변환 input_path = Path(input_folder) # for hwp_file in input_path.glob("DIW_2503B.hwpx"): for hwp_file in chain(input_path.glob("*.hwp"), input_path.glob("*.hwpx")): try: # 파일 열기 if hwp_file.suffix == ".hwpx": hwp.Open(str(hwp_file), "HWPX") elif hwp_file.suffix == ".hwp": hwp.Open(str(hwp_file), "HWP") #hwpactionid 기반 hwp.Run("MoveDocBegin") total_pages = hwp.PageCount current = 1 # hwp.HAction.Run("MoveDocBegin") while( current <= total_pages ): # 북마크 삽입 (현재 커서 위치에 "Page_쪽_start","Page_쪽_end" 이름으로) hwp.HAction.GetDefault("Bookmark", hwp.HParameterSet.HBookMark.HSet) hwp.HParameterSet.HBookMark.name = "Page_" + str(current) + "_start" hwp.HParameterSet.HBookMark.type = 0 hwp.HParameterSet.HBookMark.Command = 0 hwp.HAction.Execute("Bookmark", hwp.HParameterSet.HBookMark.HSet) if current < total_pages: hwp.HAction.Run("MovePageDown") hwp.HAction.Run("MoveLeft") else: hwp.HAction.Run("MoveDocEnd") hwp.HAction.GetDefault("Bookmark", hwp.HParameterSet.HBookMark.HSet) hwp.HParameterSet.HBookMark.name = "Page_" + str(current) + "_end" hwp.HParameterSet.HBookMark.type = 0 hwp.HParameterSet.HBookMark.Command = 0 hwp.HAction.Execute("Bookmark", hwp.HParameterSet.HBookMark.HSet) hwp.HAction.Run("MoveRight") current += 1 hwp.Run("SelectCtrlFront") while True: curr = hwp.KeyIndicator() # print(curr[-1]) hwp.Run("SelectCtrlFront") hwp.SetMessageBoxMode(0x111111) hwp.Run("VtChartConverter") next = hwp.KeyIndicator() if next == curr: break hwp.SetMessageBoxMode(0x0000F0) #메시지 박스 원래대로 # XML 파일 경로 설정 xml_filename = hwp_file.stem + ".hml" xml_path = os.path.join(output_folder, xml_filename) # print(f"xml_path:{xml_path} type:{type(xml_path)}") # XML로 저장 hwp.SaveAs(xml_path, "HWPML2X", "") logging.info(f"변환 성공: {hwp_file.name} -> {xml_filename}") except Exception as e: logging.error(f"파일 변환 실패: {hwp_file.name} -> {e}") finally: # 현재 문서 닫기 hwp.Clear(3) except Exception as e: logging.error(f"프로그램 실행 오류: {str(e)}") finally: # 한글 프로그램 종료 try: hwp.Quit() except: pass def delete_gen_py(): # gen_py 디렉토리 경로 gen_py_dir = os.path.join(os.environ['LOCALAPPDATA'], 'Temp', 'gen_py') # gen_py 디렉토리 삭제 if os.path.exists(gen_py_dir): shutil.rmtree(gen_py_dir) print(f'{gen_py_dir} 디렉토리를 삭제했습니다.') if __name__ == "__main__": delete_gen_py() # 로깅 설정 setup_logging() exam_rounds = [ "2508", # "2507" ] # 변환할 폴더 경로 설정 # 배열 동시에 변환하면 에러발생 -> 하나씩 변환 -> time.sleep(0.5) 추가 for exam_round in exam_rounds: folders = [ (f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\A\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\A\\DIW"), (f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\B\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\B\\DIW"), (f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\C\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\C\\DIW"), (f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\D\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\D\\DIW"), (f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\E\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\E\\DIW"), ] # folders = [ # (f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\C\\TEST",f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\C\\TEST")] # 변환 실행 for input, output in folders: try: logging.info(f"폴더 변환 시작: {input} -> {output}") convert_hwp_to_xml(input, output) logging.info(f"폴더 변환 완료: {input} -> {output}") time.sleep(0.5) except Exception as e: logging.error(f"폴더 변환 중 오류 발생: {input} -> {output}, 오류: {e}")