텍스트 추출할 때 특정 컨트롤은 제외하는 방법 문의

파일에서 전체 텍스트를 갖고 오는 소스를 아래와 같이 구현했습니다. 예제 소스를 보고.
여기서 제가 궁금한 것은, GetText()로 뽑은 텍스트가 어떤 컨트롤에서 뽑은 것인지 알고 싶습니다. CtrlID나 UserDesc라든지.
일반 텍스트나 글상자, 도형 안에 있는 텍스트는 뽑지만 표나 그림에 있는 텍스트는 포함하고 싶지 않습니다.
고맙습니다~~

def extract_all_text(hwp):
  txt = ""

  try:
    hwp.InitScan()
    while True:
      textdata = hwp.GetText()
	  # 여기서 뽑힌 텍스트가 어떤 컨트롤인지 알고 싶습니다. CtrlID라든지.
          # 예를 들면, 표나 그림에서 뽑힌 텍스트는 포함하고 싶지 않습니다.
      # print(textdata)
      if textdata[0] == 1:
        break
      else:
        txt = txt + textdata[1]
  finally:
    hwp.ReleaseScan()

  return txt
2개의 좋아요

아래 코드는 C++로 작성한 슈도코드임음 밝힙니다.
javascript, python 언어로 포팅하려면 수정을 해야하니 로직만 참고 부탁드립니다.

  • HwpObject의 InitScan, GetText, MovePos, get_ParentCtrl
  • HwpCtrlCode의 get_CtrlCh, get_CtrlID 함수를 사용했습니다.
// 문서 전체를 텍스트 포함 모든 컨트롤을 탐색함
hwp.InitScan(0xf, 0x77, 0, 0, 0, 0);

BSTR szTtext[1024] = {0, };

while (hwp.GetText() != 1) {
   // 201 = moveScanPos로 GetText 실행한 위치로 이동함
   hwp.MovePos(201, 0, 0);

   // 현재 위치의 상위 컨트롤을 구함
   HwpCtrlCode ctrl = hwp.get_ParentCtrl();
   if (ctrl != NULL) {
      long ctrlch = ctrl.get_CtrlCh();
      // 11 = 그리기 개체, 표
      if (ctrlch == 11) {
         // 상위 컨트롤이 표라면 패스
         if (ctrl.get_CtrlID() == _T("tbl")) {
            continue;
         }
      }
   }
   ...
}

hwp.ReleaseScan();

코드를 옮겨보시고 안되는 부분이 있으시면 코멘트 남겨주세요. :slight_smile:

3개의 좋아요

고맙습니다. 원하는 해결책입니다. :+1:
쓰신 소스를 파이썬으로 옮겨서 잘 작동함을 확인하였습니다.

def extract_text_exclude_table(hwp_app):
  txt = ""
  try:
    # 문서 전체를 텍스트 포함 모든 컨트롤을 탐색함
    hwp_app.InitScan(0x000F, 0x0077)

    while True:
      textdata = hwp_app.GetText()
      if textdata[0] == 1:
        break

      # 201 = moveScanPos로 GetText 실행한 위치로 이동함
      hwp_app.MovePos(201, 0, 0)

      # 현재 위치의 상위 컨트롤을 구함
      parent_ctrl = hwp_app.ParentCtrl

      if parent_ctrl == None:  # 일반 문장(paragraph)
        txt = txt + textdata[1]
        continue

      ctrlch = parent_ctrl.CtrlCh

      # 11 = 그리기 개체, 표
      if ctrlch == 11:
        # 상위 컨트롤이 '표'
        if parent_ctrl.CtrlID == "tbl":
          continue

      txt = txt + textdata[1]
  finally:
    hwp_app.ReleaseScan()

  return txt
3개의 좋아요