본문 바로가기
아래아한글 자동화/python+hwp 중급

[QnA] 맞춤법 자동교정시 표시해 두기

by 일코 2022. 10. 28.
안녕하세요 일상의 코딩님!! 유튜브를 통해서 알게되고 블로그까지 찾아왔습니다.
블로그의 유익한 글들로 많은 도움을 받고 있는데요...
아무리 찾아봐도 도저히 제 능력 밖이라 ... 바쁘실텐데 여쭙고자 합니다. ㅠㅠ
아래한글에서 맞춤법 교정을 자동으로 하는 코드를 만들고 싶은데
단순히 맞춤법 검사기로 교정하는 것은 어절단위로 돌면서 Run으로 작동은 시키는데
맞춤법 교정을 한 부분을 글자나 음영색을 바꿔서 어떤 부분을 교정했는지 표시를 하고 싶은데요
교정이 되고 나니 빨간줄도 사라지고,,, 그위치를 찾는 것도... 방법이 없는거 같아서요
도움을 요청합니다. ㅠㅠ
어떻게 방법이 없을까요... ㅠㅠ 헤매고 있는 절 구해주세요 ㅠㅠㅠㅠㅠ

질문 주신 분께서는 나름 한/글 메서드를 잘 활용하고 계신 분 같아요.

어절 단위로 돌면서 Run 돌리실 때(아마 AutoSpellSelect0를 사용하시는 것 같은데요.)

hwp.AutoSpellSelect0으로 실행하지 마시고,

hwp.HAction.AutoSpellSelect로 실행하시면

교정했을 때에만 True, 교정안하고 넘어가면 False를 매번 리턴해요.

교정 전의 어절을 저장해 뒀다가,

교정을 거쳤으면 해당어절에 메모표시를 하거나,

교정된 어절을 빨간색 괄호로 덮고

그 앞에 다시 애초의 어절을 삽입해놓는 식으로 표시하시면 될 것 같아요.

제가 알맞은 솔루션을 말씀드렸는지 궁금하지만,

하여튼 제가 이해한 방식으로 코드를 한 번 짜 볼게요.

 

우선 기존 실행화면과 코드는 아래와 같아요.

첫 번째로 추천하는 교정어휘로 변경하는 명령어인 hwp.HAction.Run("AutoSpellSelect0")

다음 어절로 이동하는 명령어인 hwp.HAction.Run("MoveNextWord"),

이 두 가지 명령어만 반복실행하면 기본적인 자동교정이 완료됩니다.

팁을 하나 드리면
while문으로 돌릴 때 문서 끝 위치가 교정 과정에서 바뀔 수 있으니까,
문서 끝에 도착할 때까지 정방향 탐색을 하는 것보다는(물론 가능은 하지만)
문서 시작 좌표(pos)는 거의 항상 (0,0,16)이니까
문서 끝에서부터 역방향 탐색을 하는 게 조금 더 코드가 짧아요.

위를 참고해서 뼈대가 되는 코드를 짜보면

hwp.Run("MoveDocEnd")
while hwp.GetPos() != (0, 0, 16):
    hwp.Run("MovePrevWord")
    hwp.HAction.Run("AutoSpellSelect0")

코드가 딱 네 줄, 꽤 짧네요.

이렇게 한 번 실행해볼까요?

의도한 대로 잘 동작하는 것 같네요.

그럼 이 코드에 살을 조금만 더 붙여서

교정을 거치면 표시를 해 두도록 만들어보겠습니다.

질문자 분께서 "글자나 음영색"이라고 하셨으니까,

글자는 빨갛게, 음영은 연한 빨강으로 줘보겠습니다.

교정되지 않은 어절은 스킵해야 하니까, if문을 하나만 넣어주면 되겠네요.

 

hwp.Run("MoveDocEnd")
while hwp.GetPos() != (0, 0, 16):
    hwp.Run("MovePrevWord")
    if hwp.HAction.Run("AutoSpellSelect0"):
        # 글자서식 바꾸는 코드 삽입할 곳

 

수월하게 마치겠네요.

글자를 빨갛게 수정하는 코드는

hwp.Run("CharShapeTextColorRed")

연한 빨강으로 음영 넣는 코드는(매크로녹화 참조)

hwp.HAction.GetDefault("CharShape", hwp.HParameterSet.HCharShape.HSet)
hwp.HParameterSet.HCharShape.ShadeColor = hwp.RGBColor(238, 201, 201)
hwp.HAction.Execute("CharShape", hwp.HParameterSet.HCharShape.HSet)

이렇게 조합해서 코드를 짜보면

최종 코드는

hwp.Run("MoveDocEnd")
while hwp.GetPos() != (0, 0, 16):
    hwp.Run("MovePrevWord")
    if hwp.HAction.Run("AutoSpellSelect0"):
        hwp.Run("MoveSelPrevWord")
        hwp.Run("CharShapeTextColorRed")
        hwp.HAction.GetDefault("CharShape", hwp.HParameterSet.HCharShape.HSet)
        hwp.HParameterSet.HCharShape.ShadeColor = hwp.RGBColor(238, 201, 201)
        hwp.HAction.Execute("CharShape", hwp.HParameterSet.HCharShape.HSet)
hwp.Run("Cancel")

이렇게 한 번 실행해보겠습니다.

이 정도면 의도한 대로 나름 잘 동작하는 것 같네요.

아쉬운 부분이 많은 코드지만 여기서 마칩니다.

추가로 질문하실 부분이 있으면

댓글이나 메일로 남겨주시기 바랍니다.

 

마치며

생각해보면, 기존 어휘가 궁금할 수 있는 경우도 있겠네요.

최종 모양이 아래처럼 되도록 고쳐볼 수도 있겠네요.

위 그림과 같이 교정한 어휘 앞에다

교정 전 어휘를 붉은색 아래첨자로 뒤에 표시해 둔다든지요.

또 이렇게 해 놓으면 좋은 점이, 검토 후 마무리할 때

아래처럼 "붉은색 언더라인" 서식만 찾아바꾸기로 일괄삭제가 가능하니까

문서가 길 때 사후작업이 훨씬 간편하기도 하겠더라고요.

이런 방법도 있겠네요?

하여튼 도움이 되었기를 바랍니다.

행복한 하루 되세요

앞으로도 도움이 되는 콘텐츠를 만들어 가겠습니다.

!

댓글