본문 바로가기

분류 전체보기470

[HDMI] 본격적으로 xml 파헤쳐보기 지난 포스팅에서는 hwp 파일을 hwpx로 포맷변환하고, 압축을 푸는 과정을 진행해보았습니다. 이번 포스팅은 본격적으로 xml 파헤쳐보기 입니다. xml파일을 파싱하는 라이브러리는 여러 개가 있지만 우리는 xml파서의 큰형님(?)이라 불릴 수 있는 내장 패키지인 xml을 이용해보겠습니다. 그 중에서도 ElementTree라는 모듈을 사용할건데요. (ElementTree 외에도 xml 패키지 안에는 dom, parsers, sax 등의 서브패키지가 포함되어 있습니다.) 그 전에 우리가 파헤칠 header.xml 문서를 한 번 열어나 보고 시작하자구요. 포맷변환이나 압축해제 등 이전 과정을 건너뛰고 파싱에만 관심 있으신 분은 아래 첨부한 header.xml 파일만 다운받아서 실습을 진행해주시면 되겠습니다. .. 2022. 12. 7.
[HDMI] hwp를 hwpx로 포맷변환하고 압축 풀기 제목이 거창해 보이지만 사실 굉장히 간단한 프로세스입니다. 1. hwp를 hwpx로 포맷변환(다른 이름으로 저장) 2. hwpx파일 압축해제 이러면 제목이랑 똑같잖아!ㅜ 위 두가지 기능을 각각 구현해보겠습니다. 1. 다른이름으로 저장 한글에서 제공하는 API를 형식별로 크게 나누면 네 가지 정도가 있습니다. ①일반적인 메서드, ②프로퍼티, ③파라미터가 필요한 액션, 그리고 ④파라미터가 필요없는 액션 다른이름으로 저장하기 기능은 함수 형태의 메서드로도 구현되어 있습니다. hwp.SaveAs(파일명, 포맷)입니다. import win32com.client as win32 FILE_PATH = r"C:\Users\smj02\OneDrive\바탕 화면\빈 문서1.hwp" hwp = win32.gencache.E.. 2022. 12. 7.
[HDMI] 빈 문서1.hwpx를 분해해보면 안녕하세요? 일코입니다. HDMI(Hangul Document Manipulation and Information, 이름 참 잘 지었다!) 시리즈 예전에도 이와 관련한 포스팅을 한 번 올린 적은 있었습니다. 한/글 없이 hwpx 파일의 표를 pd.DataFrame으로 추출하는 방법 (tistory.com) 한/글 없이 hwpx 파일의 표를 pd.DataFrame으로 추출하는 방법 안녕하세요? 일상의 코딩, 일코입니다. hwpx 포맷이 만들어진지 벌써 10년도 훌쩍 넘었습니다. 한컴오피스에서는, 데이터 추출이 번거로운 기존의 hwp 포맷 대신 machine-readable한 hwpx 포맷을 사용해 martinii.fun 솔직히 말ㅆ므드리면 그 뒤로 틈틈이 파이썬의 xml 모듈 문서를 읽어보거나 튜토리얼을 .. 2022. 12. 7.
[hwpx 분석하기] HDMI 시리즈를 시작하며 잠시 과거회상 업무자동화 공부를 시작한지도 벌써 6년이 넘었습니다. 사실 업무 중에 가장 많은 시간을 썼던 코드는 아래아한글이 아니라 파이썬-셀레늄으로 브라우저(회사 그룹웨어) 작업을 자동화하는 거였어요. 이게 나름 해킹하는 느낌의 재미가 있어서 파고들게 되었습니다. 해킹이라는 표현은 좀 오바 같지만, 공기업의 그룹웨어가 이렇게 취약점이 많을 줄은 몰랐거든요. 재직 당시 보안팀에 제보했던 수십 개의 취약점 중에 굵직한 걸 꼽으라면 그룹웨어 로그인 비밀번호 입력 무력화, 로그인할 때 휴대폰 2차인증 패스, 다른 사우 사번으로 그룹웨어 및 메신저 로그인하기, 타 부서 기록물, 비공개문서 열람하기, 비밀번호 "1"로 바꾸기 등등 서비스 대부분이 주로 클라이언트 측에서 자바스크립트로 이뤄지는 구조라서 소스코드만.. 2022. 12. 7.
[QnA] 문단 위, 문단 아래 간격이 적용이 안되고 0이 돼요.. 혹시. 문단모양에서 문단 위 간격, 문단 아래 간격 값을 지정하는 방법을 알 수 있을까요? # 문단모양 설정 def para_style(align, LineSpace, prevSpace, nextSpace, breakline_div, min_space): # 정렬방식(왼쪽, 가운데, 오른쪽) / 줄간격 / 문단위 / 문단아래 / 줄나눔기준(어절, 글자) / 최소공백 act = hwp.CreateAction("ParagraphShape") # 액션생성 pset = act.CreateSet() # 파라미터셋 생성 act.GetDefault(pset) # 파라미터셋에 현재 상태값 넣기 pset.SetItem("AlignType", hwp.HAlign(align)) # 정렬("Justify", "Left", ".. 2022. 12. 6.
[QnA] 문서간 스타일서식 맞바꾸기 보호되어 있는 글 입니다. 2022. 12. 6.
문서 중 특정 컨트롤을 모두 삭제하는 아주 간단한 코드 문서 안에서 쪽번호 위치나 새쪽번호, 감추기 같은 조판부호들은 일일이 찾기도 쉽지 않을뿐더러 본문이 긴 경우에는 페이지 밖으로 사라져 있기도 합니다. 문서가 긴 경우에는 이런 컨트롤들을 일일이 찾아서 삭제하는 것도 정말 시간을 많이 잡아먹는 일입니다. 다행히 한/글에서는 특정 조판부호를 모두 삭제하는 기능을 제공하고 있습니다. 아래 움짤은 문서 내 모든 고정폭빈칸 컨트롤을 삭제하는 예시입니다. 다행히 이 코드는 매크로 녹화가 되어서, 파이썬 코드로도 쉽게 고칠 수 있습니다. 녹화한 스크립트매크로는 아래와 같습니다. HAction.GetDefault("DeleteCtrls", HParameterSet.HDeleteCtrls.HSet); with (HParameterSet.HDeleteCtrls) { Cre.. 2022. 12. 5.
문서 중 짝수(또는 홀수)페이지를 전부 삭제하는 파이썬코드 코드를 먼저 보여드립니다. 간단한 주석을 옆에 달아놓았습니다. 이 코드는 한/글 2014 이하 버전에서는 작동하지 않습니다. act = hwp.CreateAction("DeletePage") # DeletePage 액션 생성 pset = act.CreateSet() # 파라미터셋 생성 act.GetDefault(pset) # 파라미터셋에 현재값 대입 pset.SetItem("Range", 2) # 삭제범위 설정. {2:RangeCustom에서 지정한 페이지만 삭제, 0:현재 쪽 삭제(RangeCustom 무시), 1:선택한 모든 쪽 삭제} pset.SetItem("RangeCustom", ", ".join([str(i) for i in range(1, hwp.XHwpDocuments.Item(0).XHw.. 2022. 12. 5.
[QnA] 파이참에서 한/글 API 코드 자동완성을 하고 싶어요! 파이참이나 VSCode에서 코딩을 해보면 자동완성 기능 덕분에 메서드를 빠르게 찾는 등 코드를 쾌적하게 짤 수 있는데, win32com으로 아래아한글 자동화를 할 때에는 자동완성이나 파라미터 정보 등이 하나도 뜨지 않아서 막막합니다. 좋은 방법이 없을까요? 예. 좋은 방법이 없는 것 같습니다. 솔직히 저도 사실 왜 IDE에서 한/글 API 코드의 자동완성이나 파라미터 정보가 안 뜨는지 잘 모르겠습니다. 아래 예시화면처럼 자동완성을 잘 잡아주면 참 좋을텐데요. 한/글 자동화 코드를 짤 때는 아래처럼 장님 코끼리 만지듯 허우적허우적 코딩하는 게 참 번거롭습니다. 모두 외울 수도 없는 노릇이고 수시로 API문서를 뒤적거리면서 코딩해야 하니까요. 그래도 나름 경험적으로 알게 된 몇 가지 팁이 있는데요. 업무자동.. 2022. 12. 5.