스타일 초기화를 위해서 노력하고 있습니다.
공부하면서 이것저것 하고 있는데 스타일을 한글처음 만들었을때로 변환 적용을 하니까 (헤더 바꿔서)
안쓰는 스타일도 적용되어 남아 있네요 저는 지금 문서의 모든 스타일을 지우고 스타일을 초기화 하려고
하면 어떻게 코드를 수정해야 할까요?
import os
import shutil
import zipfile
from glob import glob
from time import sleep
import tkinter as tk
from tkinter import filedialog
import re
# GUI를 통한 파일 선택
def select_file():
file_path = filedialog.askopenfilename(filetypes=[('HWPX Files', '*.hwpx')])
if file_path:
process_file(file_path)
success_label.config(text="Success")
def process_file(hwpx_file_path):
# 압축 풀기 및 스타일 교체
extract(hwpx_file_path)
convert_styles("temp/Contents/header.xml") # header.xml 파일에서 스타일을 교체
# 다시 압축하여 저장
with zipfile.ZipFile(hwpx_file_path.replace(".hwpx", "_Style_re.hwpx"), 'w', zipfile.ZIP_DEFLATED) as zipf:
zipdir('temp', zipf)
# 임시 폴더 삭제
shutil.rmtree('temp')
print("파일 처리가 완료되었습니다.")
def extract(path):
os.chdir(os.path.dirname(path))
target_path = os.path.join(os.getcwd(), "temp")
with zipfile.ZipFile(path, 'r') as zf:
zf.extractall(path=target_path)
def convert_styles(header_file_path):
# header.xml에서 <hh:style> 부터 </hh:styles>까지의 내용을 사용자가 제공한 데이터로 교체
with open(header_file_path, "r", encoding="utf-8") as file:
data = file.read()
# <hh:style>부터 </hh:styles>까지 매칭하여 교체
new_styles = '''<hh:styles itemCnt="22">
<hh:style id="0" type="PARA" name="바탕글" engName="Normal" paraPrIDRef="0" charPrIDRef="0" nextStyleIDRef="0" langID="1042" lockForm="0"/>
<hh:style id="1" type="PARA" name="본문" engName="Body" paraPrIDRef="1" charPrIDRef="0" nextStyleIDRef="1" langID="1042" lockForm="0"/>
<hh:style id="2" type="PARA" name="개요 1" engName="Outline 1" paraPrIDRef="2" charPrIDRef="0" nextStyleIDRef="2" langID="1042" lockForm="0"/>
<hh:style id="3" type="PARA" name="개요 2" engName="Outline 2" paraPrIDRef="3" charPrIDRef="0" nextStyleIDRef="3" langID="1042" lockForm="0"/>
<hh:style id="4" type="PARA" name="개요 3" engName="Outline 3" paraPrIDRef="4" charPrIDRef="0" nextStyleIDRef="4" langID="1042" lockForm="0"/>
<hh:style id="5" type="PARA" name="개요 4" engName="Outline 4" paraPrIDRef="5" charPrIDRef="0" nextStyleIDRef="5" langID="1042" lockForm="0"/>
<hh:style id="6" type="PARA" name="개요 5" engName="Outline 5" paraPrIDRef="6" charPrIDRef="0" nextStyleIDRef="6" langID="1042" lockForm="0"/>
<hh:style id="7" type="PARA" name="개요 6" engName="Outline 6" paraPrIDRef="7" charPrIDRef="0" nextStyleIDRef="7" langID="1042" lockForm="0"/>
<hh:style id="8" type="PARA" name="개요 7" engName="Outline 7" paraPrIDRef="8" charPrIDRef="0" nextStyleIDRef="8" langID="1042" lockForm="0"/>
<hh:style id="9" type="PARA" name="개요 8" engName="Outline 8" paraPrIDRef="18" charPrIDRef="0" nextStyleIDRef="9" langID="1042" lockForm="0"/>
<hh:style id="10" type="PARA" name="개요 9" engName="Outline 9" paraPrIDRef="16" charPrIDRef="0" nextStyleIDRef="10" langID="1042" lockForm="0"/>
<hh:style id="11" type="PARA" name="개요 10" engName="Outline 10" paraPrIDRef="17" charPrIDRef="0" nextStyleIDRef="11" langID="1042" lockForm="0"/>
<hh:style id="12" type="CHAR" name="쪽 번호" engName="Page Number" paraPrIDRef="0" charPrIDRef="1" nextStyleIDRef="0" langID="1042" lockForm="0"/>
<hh:style id="13" type="PARA" name="머리말" engName="Header" paraPrIDRef="9" charPrIDRef="2" nextStyleIDRef="13" langID="1042" lockForm="0"/>
<hh:style id="14" type="PARA" name="각주" engName="Footnote" paraPrIDRef="10" charPrIDRef="3" nextStyleIDRef="14" langID="1042" lockForm="0"/>
<hh:style id="15" type="PARA" name="미주" engName="Endnote" paraPrIDRef="10" charPrIDRef="3" nextStyleIDRef="15" langID="1042" lockForm="0"/>
<hh:style id="16" type="PARA" name="메모" engName="Memo" paraPrIDRef="11" charPrIDRef="4" nextStyleIDRef="16" langID="1042" lockForm="0"/>
<hh:style id="17" type="PARA" name="차례 제목" engName="TOC Heading" paraPrIDRef="12" charPrIDRef="5" nextStyleIDRef="17" langID="1042" lockForm="0"/>
<hh:style id="18" type="PARA" name="차례 1" engName="TOC 1" paraPrIDRef="13" charPrIDRef="6" nextStyleIDRef="18" langID="1042" lockForm="0"/>
<hh:style id="19" type="PARA" name="차례 2" engName="TOC 2" paraPrIDRef="14" charPrIDRef="6" nextStyleIDRef="19" langID="1042" lockForm="0"/>
<hh:style id="20" type="PARA" name="차례 3" engName="TOC 3" paraPrIDRef="15" charPrIDRef="6" nextStyleIDRef="20" langID="1042" lockForm="0"/>
<hh:style id="21" type="PARA" name="캡션" engName="Caption" paraPrIDRef="19" charPrIDRef="0" nextStyleIDRef="21" langID="1042" lockForm="0"/>
</hh:styles>'''
data = re.sub(r'<hh:styles.*?</hh:styles>', new_styles, data, flags=re.DOTALL)
with open(header_file_path, "w", encoding="utf-8") as file:
file.write(data)
def zipdir(path, ziph):
os.chdir(path)
for root, dirs, files in os.walk("."):
for file in files:
ziph.write(os.path.join(root, file))
os.chdir("..")
# GUI 설정 및 실행
root = tk.Tk()
root.title("HWPX Style Converter v1.0")
root.geometry("400x300")
# 프로그램 제목
title_label = tk.Label(root, text="HWPX 파일 스타일 변경 프로그램", font=("Arial", 16))
title_label.pack(pady=10)
# 파일 선택 지침
instruction_label = tk.Label(root, text="Please select an HWPX file.", font=("Arial", 10))
instruction_label.pack(pady=5)
# 파일 선택 버튼
select_button = tk.Button(root, text="Select HWPX File", command=select_file)
select_button.pack(pady=10)
# 성공 메시지
success_label = tk.Label(root, text="", font=("Arial", 12), fg="green")
success_label.pack(pady=20)
# 하단 정보 표시
footer_label = tk.Label(root, text="Version 1.0V Developed by Hyunuk", font=("Arial", 8))
footer_label.pack(side="bottom", anchor="w", padx=10, pady=10)
root.mainloop()
현욱님 안녕하세요?
요즘 보고서 제출이 코앞으로 다가와서,
큼직한 질문에는 답변을 달아드리지 못했습니다ㅜ
pyhwpx에서 set_style 메서드를 제공하고 있어서,
hwp.set_style("바탕글")
이라고만 실행하면 바탕글로 바뀌고 글자나 문단모양도 바탕글로 초기화됩니다.글자를 유지하는 방법은
① 문단에서 먼저 모양 복사(Alt-C)를 하시고, : hwp.ShapeCopyPaste()
② 스타일을 초기화하신 후 : `hwp.set_style("바탕글")`
③ 복사해 둔 모양을 다시 붙여넣는 것입니다.
그러면 스타일은 해제되고 글자/문단모양이 남아있게 됩니다.
스타일에 문단번호가 포함되어 있는 경우도 있는데
이 경우는 미리 hwp.GetHeadingString()으로 따로 추출할 수 있습니다.
대략 코드를 짜보면 아래처럼 됩니다.
실행 전에는 모두 스타일이 있었는데, 실행 후에는 모든 스타일이 "바탕글"로 변경되었습니다.
코드 자체는 간단한 편인데,
만약 pyhwpx가 아니라 오토메이션API를 직접 사용하시는 거라면
예전에 작성했던 포스팅을 참고하시면 도움이 될 듯 합니다.
https://employeecoding.tistory.com/237
도움이 되었길 바랍니다ㅎ
(아직 위에 써주신 코드를 읽어보지는 못했는데, 찬찬히 읽어보겠습니다. 감사합니다!)
행복한 하루 되세요^^
답글