HTML로 저장하기 문의드려요.

HWP 문서의 일부분을 블록으로 선택한후 선택된 내용을 HTML로 저장하고 싶습니다.
아래 코딩으로 기능이 동작하긴 하는데 코드 선택 다이얼로그가 떠요.
이 다이얼로그 안뜨게끔 해서 동작하게끔 하고 싶습니다.

// 페이지 찾아가기
GotoPage(rHwpObject, nPageNum);
rHwpObject.Run("Select");
GotoPage(rHwpObject, nPageNum + 1);


// 파일로 저장
CHAction hAction;
CHParameterSet hParameterSet;
CHSet hSet;
CHFileOpenSave hFileOpenSave;

hAction.AttachDispatch(rHwpObject.get_HAction());
hParameterSet.AttachDispatch(rHwpObject.get_HParameterSet());
hFileOpenSave.AttachDispatch(hParameterSet.get_HFileOpenSave());
hSet.AttachDispatch(hFileOpenSave.get_HSet());
BOOL bRet = hAction.GetDefault("FileSaveBlock_S", hSet);

CString strTempFile = _T("");
CString strTemp = HostIni.GetData();
strTempFile.Format("%s_%d.html", strTemp, nPageNum);
hFileOpenSave.put_filename(_T(strTempFile));
hFileOpenSave.put_Format(_T("HTML"));
hFileOpenSave.put_Attributes(1);
**hFileOpenSave.put_Argument("code:ks;");**  // ???
bRet = hAction.Execute("FileSaveBlock_S", hSet);

hParameterSet.DetachDispatch();
hAction.DetachDispatch();
rHwpObject.Run("Cancel");

return bRet; 

다음과 같은 다이얼로그가 떠요. 이거 안뜨게 하고 싶습니다.
테스트 환경 : 한글 2010.
image

안녕하세요 ^^
API로는 해당창을 안뜨게는 불가능합니다.
해당창을 안뜨게 하려면 문자 코드를 기본 값으로 지정 하도록 하면 다음부턴 뜨지 않습니다.
현재 한글 2010 테스트가 불가능해 2024 기준으로 환경설정에서도 해당 문자 코드를 어떤값으로 기본으로 할지 설정이 가능합니다.
판단 후 확인의 경우 창이뜨게됩니다.
감사합니다.
image

1개의 좋아요

안녕하세요.

GetTextFile로 선택 영역을 HTML 형식으로 저장하는 방식을 사용해보시면 좋을 것 같습니다.

// var.bstr에 선택한 부분을 HTML 형식으로 표현된 문자열 데이터가 반환됨
VARIANT var = rHwpObject.GetTextFile(_T("HTML"), _T("saveblock"));

// TODO : HTML로 파일 저장
// 1. 로컬 파일 생성 CreateFile
// 2. WriteFile (var.bstrVal)

감사합니다.

1개의 좋아요

위의 가이드 주신 것 참고하여 해보았습니다. 그런데 한글 버전별로 동작이 다르네요.
[작업요령]
-한글문서 매 페이지별 HTML 로 저장.
-방법 : 페이지 이동 → 블록선택 시작 → 다음페이지 이동 → HTML로 저장 → 블록해제

[구현]
BOOL SavePageHtml(CHwpObject& rHwpObject, int nPageNum)
{
int nTotalPage = rHwpObject.get_PageCount();

// 페이지 찾아가기
GotoPage(rHwpObject, nPageNum);

rHwpObject.Run("Select");

if (nPageNum < nTotalPage)
	GotoPage(rHwpObject, nPageNum + 1);
else {
	rHwpObject.Run("MovePageEnd");
}

    // 블록저장
CString strHtml = rHwpObject.GetTextFile(_T("HTML"), _T("saveblock"));
CString strTempFile = _T("");
CString strTemp = HostIni.GetData();
strTempFile.Format("%s_%d.html", strTemp, nPageNum);
BOOL bRet = GetClassManager()->writeToFile(strTempFile, (unsigned char*)(LPCTSTR)strHtml, strHtml.GetLength());
ASSERT(bRet == TRUE);

    // 블록해제
rHwpObject.Run("Cancel");

return bRet;

}

[현상]
한글 2005~한글 Neo : 특정페이지에서 동작이 다름.
예를 들어 특정페이지에서는 해당 페이지가 아닌 1페이지부터
모두 HTML로 생성됨. 블록선택이 해제가 안된 채 선택된 상태로 남음
한글 2018~한글 2024 : 매 페이지별 HTML 생성됨.
=> 위 기능은 특별한 사유가 없는 한 모든 한글버전에 대해서 동일해야 할 것으로 보이는데 결과가 다릅니다. 어디서 차이가 발생할까요? 이를 해결하는 방법이 궁금합니다.
테스트는 각 페이지별로 간단한 표가 있는 5페이지짜리 문서로 진행했습니다.

1개의 좋아요

한글 2010 ~ 한글 NEO 까지 확인해봤지만 블록 저장은 정상 동작하는 것을 확인했습니다.
특정 페이지 라고 말씀하신 파일을 전달주시면 도움 드릴 수 있을 것 같습니다.
감사합니다.

1개의 좋아요

안녕하세요. 확인해 주셔서 감사합니다.
첨부파일을 보내드려야 하는데 어떻게 보내야 하는지… 링크로 보내드립니다.
확인해 주세요.

SampleTable_TestData_v02.hwp

1개의 좋아요

작성하신 코드 참고해서 GetTextFile로 얻어온 버퍼만 확인해봤는데요.
2010까지 페이지별로 출력됨을 확인했습니다.

long nPages = m_app.get_PageCount();

for (int i = 1; i <= nPages; i++) {
	// 찾아가기 - 1쪽으로 이동
	CDHwpAction gotoAct = m_app.CreateAction(_T("Goto"));
	CDHwpParameterSet set = gotoAct.CreateSet();
	gotoAct.GetDefault(set);
	set.SetItem(_T("SetSelectionIndex"), COleVariant((long)1));
	set.SetItem(_T("DialogResult"), COleVariant((long)i));
	gotoAct.Execute(set);

	m_app.Run(_T("Select"));

	// 찾아가기 - 2쪽으로 이동
	if (i != nPages) {
		CDHwpAction gotoAct2 = m_app.CreateAction(_T("Goto"));
		CDHwpParameterSet set2 = gotoAct2.CreateSet();
		gotoAct2.GetDefault(set2);
		set2.SetItem(_T("SetSelectionIndex"), COleVariant((long)1));
		set2.SetItem(_T("DialogResult"), COleVariant((long)i + 1));
		gotoAct2.Execute(set2);
	}
	else {
		m_app.Run(_T("MovePageEnd"));
	}

	CString strHTML = m_app.GetTextFile(_T("HTML"), _T("saveblock"));
	strHTML;

	m_app.Run(_T("Cancel"));
}

문의하신 내용대로라면

블록 선택이 해제가 안된 채로 남아있다는 것으로 봐서는
Cancel 동작이 안된 것으로 추정이 되는데요.
Cancel 동작에 대해서만 확인을 해보시면 좋을 것 같습니다.

:thinking: :thinking:

1개의 좋아요

포맷을 달리해서
CString xml = rHwpObject.GetTextFile(_T(“HWPML2X”), _T(“saveblock”));
와 같이 'HWPML2X’로 xml 형태로 문자열을 얻어오고 있는데요.

한글문서에 있는 '문자표’를 모두 한글문서 본문대로 가져올 수는 없을까요?
지금은 특정문자표들이 ? 로 대체되고 있는데 본문의 내용 그대로 유지하고 싶습니다.

감사합니다.

1개의 좋아요

문자표의 문자들은 유니코드 기반이라서
가져온 텍스트를 바이너리 형식으로 보면 정상적으로 추출됨을 확인할 수 있을겁니다.
다만 해당 유니코드들을 표현할 수 있는 폰트가 없다면
말씀하신대로 ?, ㅁ,… 형식(추출한 형식을 보는 뷰어에 따라 다름)으로 보일겁니다.

한글 프로그램의 함초롬 계열들의 폰트에서는 다양한 유니코드 문자들의 글립(Glyph) 가지고 있기 때문에 대부분의 문자들을 표현할 수 있습니다.

1개의 좋아요

감사합니다. 일부 확인했고 좀 더 자세히 살펴보겠습니다.

아물러, 한가지 추가 질문을 드립니다.
한글을 페이지별로 블록을 지정하고 이를 hwp 파일로 별도로 저장은 가능하죠.
그런데 이 저장된 파일들을 다시 열어서 별개의 작업을 하고 싶습니다.
현재 UserActionModule 형태로 구현중인데
block 지정 - 파일로 저장 - 저장된 파일 별도처리(open & more…)
이렇게 처리할 수 있는 방안이 있을까요?

OCX를 지원할 때는 OCX를 활용하여 위 과정을 진행할 수 있었습니다.
지금은 OCX가 없는데요. 현재 작업중인 한글문서가 열린 상태에서
수차례 save, open 등을 진행할 수 있는지 궁금합니다.

1개의 좋아요

두 개의 문서창을 열어서 교대로 문서 핸들링을 하는 예제입니다.
이 방식을 응용해서 반복 코드를 작성하실 수 있을 것 같습니다.

(C++)

    CXHwpDocuments documents = rHwpObject.get_XHwpDocuments();
    CXHwpDocument doc1 = documents.get_Active_XHwpDocument();
    CXHwpDocument doc2 = documents.Add(FALSE);
    
    doc1.Open(_T("c:\\1.hwpx"), COleVariant(_T("")), COleVariant(_T("")));

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

    // TODO : doc1에서 하고자 하는 동작 구현
    rHwpObject.Run(_T("MoveDocBegin"));
    rHwpObject.Run(_T("Select"));
    rHwpObject.Run(_T("MovePageDown"));
    VARIANT blockedContents = rHwpObject.GetTextFile(_T("HWP"), _T("saveblock"));

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

    // TODO : doc2에서 하도자 하는 동작 구현
    rHwpObject.SetTextFile(blockedContents, _T("HWP"), _T(""));
1개의 좋아요