VertPos 관련문의

이 범주에서는 웹한글 기안기에 대한 다른 사용자의 기술 지원을 제공받을 수 있습니다.

  1. 웹한글 기안기의 API 사용/연동은 개발 가이드를 참조하세요.
  2. 일반 문의는 한글과컴퓨터 웹사이트의 고객 지원을 이용하세요.
  3. 개인정보가 포함되지 않도록 유의하세요. 게시글 또는 댓글에 개인정보가 포함된 내용이 있을 경우 게시물이 숨김처리 될 수 있습니다.

ScrollPosInfo 나 MovePos 혹은 MoveToFieldEx 를 이용해서 화면 전환 한 뒤에
VertPos 를 추출하려고 하면 제대로 값을 못가져오는 경우가 다반사입니다.
비동기 형식으로 구현한 것도 아닌데 해당 값이 제대로 동작하지 않는 이유와 해결법을 알고 싶습니다.

안녕하세요.

VertPos 추출을 어떤 방식으로 사용하시는지 알려주시면 파악에 도움이 될 것 같습니다.
보통 VertPos를 가져오는 방식은 하기와 같습니다. 참고 부탁 드리겠습니다.

var scrollItem = HwpCtrl.ScrollPosInfo;
var vertPos = scrollItem .Item(“VertPos”);

감사합니다.

        function scrollSetBefore(idx, start){
            if(message.HwpCtrl.ScrollPosInfo.Item("VertPos") != 0 && !start){
                message.ScrollPosInfo(0,0);
                setTimeout(() => scrollSetBefore(idx), 10);
                return;
            }
            if(end == null)
                message.HwpCtrl.MovePos(3);
            end = message.HwpCtrl.ScrollPosInfo.Item("VertPos");
            if(end == 0){
                setTimeout(() => scrollSetBefore(idx, true), 10);
            }else{
                endScroll = end;
                message.MoveToFieldEx("headcampaign{{" + idx + "}}");
                setTimeout(() => scrollSet(idx), 10);
                end = null;
            }
        }

        var before = 0;
        function scrollSet(idx){
            var next = message.HwpCtrl.ScrollPosInfo.Item("VertPos");
            if(before == next || next == endScroll){
                setTimeout(() => scrollSet(idx), 10);
                return;
            }
            scrollPos[idx] = next;
            before = next;
            if(++idx == an.options.length){
                if(pos)
                    message.HwpCtrl.SetPos(pos.list, pos.para, pos.pos);
                else
                    message.ScrollPosInfo(0,0);
                pos = null;
                before = 0;
            }else{
                message.HwpCtrl.MovePos(3);
                message.MoveToFieldEx("headcampaign{{" + idx + "}}");
                setTimeout(() => scrollSet(idx), 30);
            }
        }

HwpCtrl.Open 에서 콜백 함수로 위의 메서드를 호출하는데요. 나름 비동기식으로 구현해서 scroll 값을 가져오려고 무던히 노력하는데도 스크롤 값이 간헐적으로 다르게 나옵니다.
Open 콜백 함수에서 동작하는데도 본문이 제대로 다 표출이 안된 경우가 있는건가요? 아니면 어떤 경우일까요. 확인 부탁드립니다.

안녕하세요.

HwpCtrl.Open 의 콜백함수에서 본문이 제대로 표출이 안되서 발생하는 현상은 아닙니다.

MovePos 혹은 MoveToFieldEx 사용 시에는 화면 업데이트가 비동기로 일어나게 되는데요
이때, 아직 화면 업데이트가 완료되지 않은 상태에서 스크롤 값을 가져오려 하면 정확한 값을 반환하지 않을 수 있습니다.

올려주신 코드와 비슷하게 10장 내외의 문서에서 테스트하였을 때는 정상적인 값을 가져오는 것을 확인하였습니다.
현재로써는 사용하시는 코드 상의 setTimeout의 시간을 문서의 양, 서버의 사양 등에 따라 조절하시어 사용하시는 방법 뿐일 듯 합니다.

하지만 말씀주신 상황은 내부적으로 검토해보겠습니다.

원하시는 답변 드리지 못해 죄송합니다.
감사합니다.

아니죠… 해당 문제는 프론트에서 일어나는 일인데 어째서 서버 사양을 말씀하시는건지 모르겠네요.
이미 말씀 드렸듯이 해당 현상이 상시 발생하는게 아니라 간헐적으로 발생한다고 말씀드렸습니다.
해당 테스트를 어떤 방식으로 하셨는지 알고싶습니다.
개발자 툴로 디버깅 모드로 확인하면서 진행하면 아마 동일한 값을 반환할 테지만
실행 후에 각 페이지의 scroll 값을 일정 변수에 담아두고 (위의 scrollPos Array 처럼)
완료 시 해당 변수에 담겨있는 값을 확인해보시면 간헐적으로 다른 값이 표출될겁니다.
화면업데이트가 비동기 식으로 일어난다고 하셨는데 그게 단계적으로 스크롤 값이 다르게 나올수도 있나요?
비동기 상황을 고려하여 scroll 값 변동이 일어나는 시점을 이전 위치, 문서끝이 아닌 경우가 확인 되고 나서야 진행하는 식으로 코드를 짰는데요.
또한 클라이언트 피씨 사양에 따라서 발생하는 오류라면 그렇지 않도록 개발해야하지 않나요?

안녕하세요.

위의 답변은 문서 Open시 전체 본문이 로딩이 끝나지않은 상태에서 scroll 정보를 가져오려고해서 발생하지 않았나해서 답변을 주신것 같습니다.

샘플코드에서 “setTimeout()” 부분을,

setTimeout안에 setTimeout 이중으로 코드를 작성하여 테스트 가능 할까요.?
setTimeout(function() {
setTimeout(function() {/* scrollSet 코드 작성 */}, 30);
}, 300);

확인 부탁드립니다.
감사합니다.

테스트 하는데 어려울건 없겠습니다만…
어차피 setTimeout을 하게되면 그전의 모든 동작과 별개로 동작하는데 중복으로 적용 하는것은 시간을 330으로 주는것과 다를바가 없어보이는데요.
말씀하시는게 어떤 효과를 보기 위함인지 알고 싶습니다.
그리고 테스트시 330이라는 시간이 제법 긴 시간이라 검색하는 부분 갯수에 따라 로딩 시간이 유의미하게 길어질거 같은데요.

안녕하세요.

HwpCtrl.Open 에서 콜백 함수가 실행되는 시점은 문서가 모두 로딩된 시점이 아닌 백엔드에서 문서 변환이 끝난 시점입니다.
따라서, 올려주신 코드를 실행했을 때 간헐적으로 다른 값을 가져오는 이유는 문서 로딩이 끝나기 전에 vertPos 값을 추출하려고 해서 입니다.

웹한글기안기의 Properties 중에 문서의 페이지수를 가져오는 HwpCtrl.PageCount 가 있습니다.
이 Properties를 얻기 위해서 웹한글 기안기는 내부적으로 문서의 페이지수를 계산하기 위해 Pagination을 진행하게 됩니다.
해당 Properties를 사용하여, 문서의 pagination을 유도하고, 올려주신 코드로 테스트 해보시기 바랍니다.

감사합니다.


아직 로딩이 되지 않은것이 본문이 제대로 표출되지 않았다는 의미가 아니었나요?
로딩이 완료된 시점을 알수 있는 방법은 없나요?
말씀하신 페이지네이션 값은 스크롤 값의 일관성을 보장해주지 않았습니다.
scroll 값을 저장하는 각 시점에 페이지네이션 값을 console로 찍어서 테스트한 결과 스크롤 값이 다르게 찍혀도 페이지네이션 값은 일정했습니다.

안녕하세요.

로딩이 완료된 시점을 알 수 있는 방법은 현재로써는 없습니다.

여러가지로 혼란을 드린 것 같아 지금까지의 답변을 정리해서 말씀드립니다.
올려주신 코드 내부에서 사용 중이신 MovePos, MoveToField와 같은 본문 내의 이동이 있는 API 들을 사용하였을 때 본문의 스크롤 관련된 정보들을 비동기로 업데이트 하는 로직을 수행하게 됩니다.

스크롤 관련 정보 업데이트가 끝나지 않은 상태일 때 VertPos 값을 추출하려고 하면 다른 값이 나올 수 있습니다.

원하시는 답변을 드리고자 작성자님의 의도를 파악하고, 테스트 후에 가이드 드리고 있지만 올려주신 코드만으로는 상세한 의도를 파악하기에 어려움이 있습니다.

구현하고자 하시는 로직이나 방향을 상세히 설명해주시면 사용하시는 API가 아닌 다른 방법으로 구현할 수 있다면 내부적으로 검토 후에 답변 드리겠습니다.

감사합니다.

코드에 보여지듯이 문서가 로딩된 후에 headcampaign 이라는 셀네임을 가진 셀 위치의 scroll 값을 찾아서 저장하는게 목적입니다.
다른 방법이 있을까요?

안녕하세요.

scroll 값을 찾아서 저장하는 목적을 추가로 알려주시면 검토해보겠습니다.

감사합니다.

스크롤 위치에 따라 파일 리스트를 변경해서 표출하는 메서드를 호출하려고 합니다.

안녕하세요.

웹한글기안기의 MoveToField API를 사용하게 되면 스크롤 이동이 생기게 됩니다.
스크롤 이벤트를 활용하여 스크롤 이벤트가 발생하였을 때 VertPos 값을 구하는 방식으로 사용하시면 됩니다.

테스트한 코드 함께 전달드리며, 도움이 되시기를 바랍니다.

HwpCtrl.Open("HWP 파일 경로", "HWP", "", function () {
  HwpCtrl.AddEventListener(2, function() {
    // 스크롤 이벤트 발생 시, VertPos값 추출
    var ScrollPosSet = HwpCtrl.ScrollPosInfo;
    var vertPos = ScrollPosSet.Item("VertPos");
    console.log(vertPos);
  });

  fieldScan(0);

  // 문서 내부에 필드 스캔
  function fieldScan(idx) {
    if(idx == 4) {
        return;
    }
    HwpCtrl.MoveToField('test'+idx);
    setTimeout(() => {
      fieldScan(++idx);
    }, 10);
  }
});

감사합니다.

1개의 좋아요

우선 MoveToField에서는 스크롤 이동이 생기지 않습니다.
MoveToFieldEx 말씀하시는 것 같은데
최초 질문에서 말씀 드렸듯이 HwpCtrl.Open 콜백에서는 화면이 전부 로딩된 상태가 아니다보니
필드명으로 이동했을때 간헐적으로 스크롤 값이 다른 현상이 발생합니다.
스크롤이 다른것이 MoveToFieldEx를 했을때 캐럿이 스크롤 최상단에 위치하는 경우도 생기고
중간에 위치하는 경우도 생깁니다.
또한 주신 코드대로 구현해본 결과 4회 이동한 후에 최종적으로 1회 더 스크롤이 이동되는 경우가 발생합니다.
더 아래쪽에 있다가 위로 올라가는 식으로요.

안녕하세요.

MoveToField도 찾고자 하는 필드로 이동이 이루어지기 때문에 스크롤 이동이 발생합니다.

제가 올려드린 테스트 코드는 정상 동작하는지 확인한 후에 공유해드린 것입니다.
예시 코드를 참고하시어 MoveToField로 구현하여 재확인 부탁 드리겠습니다.

그래도 정상 동작하지 않으신다면 구현하신 코드를 공유해주시면 추가로 검토해 보겠습니다.

감사합니다.

다시 확인해봤으나 MoveToField로는 스크롤 이동이 발생하지 않아 스크롤 이벤트가 발생하지 않았습니다.

안녕하세요.

제가 올려드렸던 테스트 코드를 하기의 웹한글기안기 테스트 페이지에서 실행해보시면 정상적으로 스크롤 이벤트가 발생하는 것을 확인하실 수 있습니다.

현재 사용중이신 웹한글기안기 버전을 말씀해주시면 테스트 페이지와 다르게 동작하는 이유를 확인하는데 도움이 될 것 같습니다.

감사합니다.

테스트 페이지에서 동일 시도 했으나 여전히 동작하지 않았습니다.
Ex 를 했을때는 동작 확인 했습니다.

안녕하세요.

테스트페이지에서 시도하신 코드 공유해주시면 확인해보겠습니다.

감사합니다.