2개의 한글 창을 띄워놓았을 때 파일 간 전환

안녕하세요
문서1.hwp 와 문서2.hwp 가 있다고 가정할 때…

  1. 문서1의 내용 일부를 복사해서 문서2에 붙여넣기 후,
  2. 또 문서1의 또다른 내용 일부를 복사해서 문서2에 추가로 붙여넣기
    하는 파이썬 코드를 짜고 싶습니다.

hwp.Open() 으로 코드를 짜봤는데, 대충 요약하자면
hwp.Open(“문서1.hwp”) #문서1을 열고,
for _ in range(5):
hwp.HAction.Run(“TableLowerCell”)
for _ in range(2):
hwp.HAction.Run(“TableRightCell”) #저장된 캐럿 위치에서 화살표 키로 움직인 후(문서1은 SetPos로 좌표를 찍기 어려운 상황의 파일인지라)
hwp.HAction.Run(“Copy”) #문서1의 내용을 선택했다 치고 복사한 후,

hwp.Open(“문서2.hwp”) #문서2를 열고,
hwp.SetPos(x, y, z) #문서2는 좌표 찍기 가능…
hwp.HAction.Run(“Paste”) #붙여넣기.


이 다음에 다시 문서 1로 창을 전환하여 화살표 키로 움직였던 캐럿의 그 마지막 위치에서 다시 캐럿 이동을 시작하고 싶은 건데… (alt + tab 하듯이…)
문서1로의 창 전환을 할때는 어떤 코드를 사용해야 하나요?
다시 hwp.Open(“문서1.hwp”)를 쓰게 되면 캐럿의 위치가 초기 상태로 돌아가서 귀찮아지더라구요

조금 횡설수설 하지만…
복사를 할 때마다 ctrl+s 를 하는 방법도 생각해봤지만 코드가 좀 지저분해질 것 같아 질문 올리게 되었습니다.

1개의 좋아요

안녕하세요.

C++로 두 문서를 핸들링하는 샘플 예제를 작성했습니다.
참고하셔서 파이썬으로 응용해서 작성해보세요.

(m_app == hwp 동일한 개체임)

	CXHwpDocuments documents = m_app.get_XHwpDocuments();

	// 한글이 처음 실행됐을 때 활성화된 문서 개체를 구함
	CXHwpDocument doc1 = documents.get_Active_XHwpDocument();
	// 새로운 창을 열어서 문서 개체를 한 개 생성
	CXHwpDocument doc2 = documents.Add(FALSE);

	// doc1, doc2의 id를 임의로 가져와 봄 
	// 추후에 documents에서 인덱스로 접근하고자 할 때 사용할 수 있음
	long doc1id = doc1.get_DocumentID();
	long doc2id = doc2.get_DocumentID();
	
	// doc1에서 문서를 오픈 
	doc1.Open(_T("c:\\1.hwpx"), COleVariant(_T("")), COleVariant(_T("")));
	// doc2에서 문서를 오픈 
	doc2.Open(_T("c:\\2.hwpx"), COleVariant(_T("")), COleVariant(_T("")));

	// doc1 창 활성화
	doc1.SetActive_XHwpDocument();	

	// TODO : doc1에서 하고자 하는 동작 구현
	// m_app.함수 호출

	//doc2 창 활성화
	doc2.SetActive_XHwpDocument();
	
	// TODO : doc2에서 하고자 하는 동작 구현
	// m_app.함수 호출

감사합니다.

1개의 좋아요

jhbang님께서 올려주신 답변이 제일 좋아 보입니다.
아래는 몇 가지 다른 방식의 구현입니다.

① 프로세스 두 개 열기

아래처럼 두 개의 프로세스를 열어버리는 게 가장 단순한 방법 같기도 해요^^;
전환에 신경쓰지 않아도 되고,
hwp라는 변수명도 예를 들어
hwp_src, hwp_dst처럼 맥락에 맞게 바꾸면 코드 쓰고 읽기도 편하고요.

녹화_2024_08_29_12_18_28_508

import win32com.client as win32

hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
hwp.XHwpWindows.Active_XHwpWindow.Visible = True

hwp2 = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
hwp2.XHwpWindows.Active_XHwpWindow.Visible = True
#%%
hwp.Run("SelectAll")
hwp.Run("Cut")
#%%
hwp2.Run("Paste")
#%%
hwp2.Run("SelectAll")
hwp2.Run("Copy")
hwp2.Run("Cancel")
#%%
hwp.Run("Paste")

② jhbang님 코드의 파이썬 구현

만약 창을 띄워놓은 채로 작업하실 때는 유의하셔야 할 점이 있습니다.
마우스나 Alt-Tab으로 특정 창을 활성화하면, 그 창이 Active 상태가 됩니다.

녹화_2024_08_29_12_29_20_931

#%%
import win32com.client as win32

hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
hwp.XHwpWindows.Active_XHwpWindow.Visible = True
# 창이 두 개가 됨. 1로 바꾸면 탭 생성(새 창에 포커스)
hwp.XHwpDocuments.Add(0)  
#%%
hwp.XHwpDocuments.Item(0).SetActive_XHwpDocument()
pset = hwp.HParameterSet.HInsertText
pset.Text = "Hello world!"
hwp.HAction.Execute("InsertText", pset.HSet)
#%%
hwp.Run("SelectAll")
hwp.Run("Cut")
#%%
hwp.XHwpDocuments.Item(1).SetActive_XHwpDocument()
hwp.Run("Paste")

③ pyhwpx 모듈 실행시

파이썬 pyhwpx 모듈의 Hwp 클래스를 이용하시면
add_doc(), add_tab(), switch_to(idx) 등의 명령어로
간단히 창 전환 작업을 하실 수 있습니다.

녹화_2024_08_29_12_39_00_523

#%%
# import win32com.client as win32
#
# hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
# hwp.XHwpWindows.Active_XHwpWindow.Visible = True

from pyhwpx import Hwp

hwp = Hwp()
# hwp.open("문서1.hwp")
#%%
hwp.SelectAll()
hwp.Cut()
#%%
hwp.add_doc()  # 창 추가
# hwp.open("문서2.hwp")
hwp.switch_to(1)  # 0부터 시작
hwp.Paste()
#%%
hwp.switch_to(0)
hwp.insert_text("Hi!")

도움이 되었길 바랍니다^^
행복한 하루 되세요!

1개의 좋아요

깔끔하게 정리해주셨네요. :+1:
도움 답변 감사합니다.

1개의 좋아요

①에서
한/글 인스턴스를 2개 생성할 때 ver.2024에서는 1개만 생성됩니다.
인스턴스를 2개 이상 만들 때는 multi-thread를 이용하면 해결 되더군요…
참고 하세요~~

1개의 좋아요