Daily Life of BlueRose

컴퓨터 & 코딩 공부/파이썬

파이썬 Library/API - pyWin32로 한글 조작하기

푸른로즈 2024. 4. 19. 20:31
728x90

개요 및 주의사항

한글에서 제공하는 API의 구분

  • 보안모듈 (엄밀히 말하면 API는 아니지만…)
  • 한글 컨트롤 API : 한글 ActiveX 컨트롤을 위한 API로 웹에서 사용시에만 필요하다
  • 한글 오토메이션 API : 파이썬을 통해 로컬에서 한글을 실행하는 경우에 필요하다

 

환경설정의 일환으로 보안모듈을 설치해주자

  1. 보안모듈을 적당한 폴더에 넣어준다.
  2. 레지스트리에 보안모듈이 설치된 경로를 등록한다.
    • 등록경로 : 레지스트리 실행(윈도우키+R 버튼을 눌러서 '실행’창 켜기 - Regedit 입력 후 확인) - HKEY_CURRENT_USER\Software\HNC\HwpCtrl\Modules로 이동 (이때, Modules라는 폴더가 없다면 만들어준다)
    • 최종 경로 진입 후, 우클릭 - 새로 만들기 - 문자열 값을 통해 신규 값을 만들어준다. 명칭은 보통 'FilePathCheckerModule’로 한다(임의로 해도 상관은 없으나, 코딩할 때 주의가 필요).
    • FilePathCheckerModuleExample.dll파일의 경로를 적어준다.
      참고로 보안모듈 경로에는 %AppData% / %Roaming% 등의 윈도우 예약어를 사용할 수 없다. 따라서, “C:”, “C:\Users” 등 사용자 이름 필요없이 사용 가능한 공통경로를 사용할 것.
  3. 여기까지 완료 후, 실제 보안모듈을 사용할 코드의 상단부에서 보안모듈적용 명령어를 아래와 같이 입력해준다. HwpObject.RegisterModule(‘FilePathCheckerDLL’, ‘FilePathCheckerModule’)
    (여기서 HwpObject는 pyWin32을 통해 불러온 한글 프로그램 개체이므로, 본인이 입력한 개체명을 사용하면 된다.)

 

한글을 pyWin32로 불러와서 사용할 때 주의할 점

  1. 구조에 대해 어느정도 이해하고 사용하자
  • 한글도 엑셀의 Application-Workbook-WorkSheet 처럼 계층 구조를 갖음
  • 단, 엑셀이 하나의 Workbook내에 여러개의 시트가 존재가능하여 시트를 정확히 명시해야 하는 것과 달리, 한글은 하나의 HwpObject는 하나의 문서다.
  • 위 이유로, 엑셀과 달리 HwpDocument 객체를 조작하기 위하여 HwpObject.XHwpDocument의 Active_XHwpDocment에 매번 접근하여 특정 명령어를 실행할 필요없이, HwpObject.Run 혹은 HwpObject.Execute로 페이지 내 동작실행이 가능
  1. HwpObject.Open() 메소드로 연 파일은 변수에 담을 수 없다. (파일만 켜지고 정작 변수에는 따로 담기지 않는다.)
  2. 텍스트 관련 기능 사용시 스캔을 먼저 해야 함 : HwpObject.InitScan()없이 GetText()메서드를 사용하면 오류가 발생한다. 아울러, GetText()를 사용하는 동안에는 ReleaseScan()메서드로 스캔작업을 해제해서는 안된다.
  3. 파일입출력에 따른 경로사용시 : 파이썬에서 한글파일을 불러오거나 저장하는 등 파일자체를 다룰때에는 전체 파일 경로를 입력해야 한다
  4. HAction인터페이스를 통한 동작 사용시 : 하나의 Action에 대한 파라미터 변경 및 실행이 끝나기 전에는 다른 Action을 불러와서 파라미터셋을 변경해서는 안된다.
    (Action 동작은 한글을 직접조작하는 상황으로 따지면 특정 창을 켜는 행위가 같은 것으로 보인다. 중간에 다른 동작을 할 수 없도록 막히는 직접 조작 상황과 달리, 코딩에서는 엉뚱한 값이 삽입될 수 있으므로 오류가 발생하는 것으로 보인다.)

 

728x90

 

한글 내부구조에 대한 부분

HwpObject의 구조

  • XHwpDocuments
    • XHwpDocument : 상위 오브젝트에서 Active_XHwpDocument 속성으로 접근
      • XHwpFormPushButtons – XHwpFormPushButton
        • XHwpFormCheckButtons - XHwpFormCheckButton
  • XHwpWindows/XHwpWindow
    - 윈도우/탭관리를 위한 개체. 하위 개체로 XHwpDocuments, XHwpTabs가 존재함
    - XHwpWindow의 경우, 상위 오브젝트에서 Active_XHwpWindow 속성으로 접근
    • XHwpFormRadioButtons - XHwpFormRadioButton
    • XHwpFormComboBoxs - XHwpFormComboBox
    • XHwpFormEdits – XHwpFormEdit
      (각 Form개체는 상위 오브젝트에서 ItemFromName 속성으로 접근)
  • HAction
  • HParameterSet

 

한글 내부 명령 실행법(크게 2가지가 있다)

  1. HwpObject(최상위 오브젝트)의 메소드 : HwpObject.메소드()
    2번 방법과 달리 즉발성으로 실행된다.
  2. HAction - HParameterset - Run 3중 구조를 통한 실행
    (HAction기능은 ‘한글의 특정 기능을 눌러서’, ‘대화창을 통해 값을 변경하고’, ‘확인 버튼을 눌러 실행하는’ 절차를 스크립트로 구현한 것으로 추정된다.)
    • hwp.HAction.GetDefault(‘액션ID’, 해당파라미터셋.HSet) : HSet에 담긴 내용 초기화
    • hwp.HParameterSet.특정속성 = ‘바꿀내용’ : HSet에 담긴 내용을 원하는대로 변경
    • hwp.HAction.Execute(‘액션ID’, 해당파라미터셋.HSet) : 변경된 내용을 기반으로 기능 실행
    • HwpObject.Run(‘액션ID’) : HwpCtrl문서를 참고하건대, 초기화ㆍ대화상자ㆍ실행을 순차적으로 한번에 진행하는 명령어로 추정된다. 중간에 명령어를 고칠일은 없을테니, 실질적으로는 변수가 없는 기능을 간단히 수행하기 위한 명령어로 사용하면 될 것 같다.

 

주요 명령어 / 주요 활용예시

한글파일 켜기 / 창 숨기고 켜기 / 보안모듈 켜기

import os, win32gui							
import win32com.client as com
hwp = com.gencache.EnsureDispatch("HWPFrame.HwpObject")			#한글프로그램의 초기바인딩 및 캐시 생성
hwp.RegisterModule('FilePathCheckerDLL', 'FilePathCheckerModule')			#보안모듈 등록을 통해 자동화경고창 무시
win32gui.ShowWindow(win32gui.FindWindow(None, "빈 문서 1 - 한글"), 5)		#Findwindow로 핸들값을 찾고, 창 조작 시행

 

PDF로 저장하기

hwp.HAction.GetDefault('FileSaveAsPdf', hwp.HParameterSet.HFileOpenSave.HSet)
hwp.HParameterSet.HFileOpenSave.filename = '파일명'
hwp.HparameterSet.HFileOpenSave.Format = 'PDF'
hwp.HAction.Execute("FileSaveAsPDF", hwp.HParameterSet.HFileOpenSave.HSet)

 

텍스트 문 얻기

import win32com.client as com
hwp = com.gencache.EnsureDispatch("HWPFrame.HwpObject")
hwp.Open(r"파일주소")
hwp.InitScan()					#GetText를 사용하기 위해서는 스캔이 선행되어야 한다
text = hwp.GetText()					#GetText를 통해 텍스트 전문을 받는다 (bs4로 HTML을 얻는것과 유사)
whilte True:
    if text[0] = 0:					#[0]은 Status, [1]은 Content, 문서 끝에 도달하면 Status = 0 이다.
        hwp.ReleaseScan()				#Status가 0이면, 즉, 문서 끝까지 스캔완료시에는 스캔을 종료한다
        break
    else: 스캔종료시까지 수행할 절차 기록			#스캔이 종료될 때까지 특정 절차를 수행한다

 

같은 경로에 저장된 한글파일열기(순회작업 기초단계)

BASE_DIR = os.path.abspath('.')
for i in os.listdir():					#디렉토리 내 파일명을 리스트로 받아 순회한다
    hwp.Open(os.path.join(BASE_DIR, i)				#디렉토리 경로+파일명을 지정하여 각 파일을 연다
    파일 하나당 수행할 절차 기록

 

특정 폼 개체의 값 추출하기

BASE_DIR = os.path.abspath('.')
win32gui.ShowWindow(win32gui.FindWindow(None, "빈 문서 1 - 한글"), 5)		#빈문서1-한글 창을 찾아 핸들값 추적 및 조작
hwp.Open(str(BASE_DIR + '\\' + "역학조사서 - 김주현.hwp"), "HWP", "")		#기본경로, \, 파일명 병합하여 Open 실행
doc = hwp.XHwpDocuments.Active_XHwpDocument				#XHwpDocument에 접근하기 위한 기본명령어
doc.XHwpFormEdits.ItemFromName('입국_일').Text				#Name이 '입국-일'인 Edit개체의 텍스트 추출

 

해당 문서내 필드명 추출 및 삽입

fieldList = hwp.GetFieldList(0,0).split('\x02')
for c in fieldList:
    hwp.PutFieldText(c, "")

 

다른 이름으로 저장하기

hwp.SaveAs(경로+파일명+'.hwp', 'HWP', '')  #뒤의 두 변수는 사실상 고정항목임(각각 저장시 확장자, 후속행동)
반응형