196 lines
7.8 KiB
Python
196 lines
7.8 KiB
Python
# 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
|
|
# 한글 채점의 경우 2페이지까지만 필요하므로 페이지 키운트를 가져오지 않고 2페이지 고정
|
|
# total_pages = 2
|
|
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 = [
|
|
"2510",
|
|
# "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"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\C\\TEST",f"D:\\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}")
|