인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

이상민님의 프로필 이미지
이상민

작성한 질문수

직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피

질문을 남겨주세요.

pyhwpx의 set_table_width함수가 파일에 따라 안될때가 있습니다..

작성

·

24

1

질문 남겨주셔서 감사합니다.

막히면 언제든 무엇이든 자주 질문 던져주세요.

수학/과학이나 알고리즘과는 달리

업무자동화 코딩은 고민해서 풀리는 경우가 정말 드뭅니다.

다시 말씀드리지만, 질문을 자주자주 남겨주세요.

저도 최대한 빠르게 회신 드리겠습니다.

당부드릴 두 가지가 있습니다.

① 가급적 구체적으로 설명해주세요.
② 특정 챕터 관련 질문 남겨주실 때는,
어느 챕터인지 알려주세요ㅜ

====================================

 

hwp.set_table_width()

이 함수가 특정 파일에선 안먹힙니다..ㅠㅠ

해당 한글 파일의 설정을 변경하거나 조정해야 할 부분이 있을까요? 일반적인 파일은 다 잘됩니다!

답변 2

1

일코님의 프로필 이미지
일코
지식공유자

상민님 안녕하세요?

저도 이것저것 테스트를 해봤는데ㅜ

문제가 되는 경우를 아직 찾지 못했습니다.ㅜ

대신 실행이 안 되는 이유를 몇 가지 짐작해보면,

 

① 커서위치가 표보다 우측이나 아래에 있으면 실행이 되지 않습니다.

내부적으로 hwp.SelectCtrlFront() 메서드를 사용해서 표에 접근하기 때문입니다.

 

② 커서와 표 사이에 다른 컨트롤이 있어도 실행되지 않습니다.

위와 동일한 이유로, hwp.SelectCtrlFront()는 우측이나 아래의 가장 가까운 컨트롤을 선택하기 때문입니다.

 

③ 메서드 내부에서 표 부분만 XML 추출을 하는데요..

만약 표가 XML로 딱 잘려 나올 수 있는 모양이 아니라면? 오류가 날 수도 있을 것 같습니다. (추측ㅜ)

 

그 외에는... 아무리 생각해봐도 이유를 잘 모르겠습니다;;;

코드가 제법 긴 편이어서 어딘가에서 오류가 날 수는 있겠다고 생각합니다.

 

코드 전체는 대략 아래와 같습니다. 주석을 열심히 달아보았습니다.

def set_table_width(self, width: int = 0, as_: Literal["mm", "hwpunit", "hu"] = "mm"):
    """
    표 전체의 너비를 원래 열들의 비율을 유지하면서 조정하는 메서드.
    내부적으로 xml 파싱을 사용하는 방식으로 변경.
    :param width: 너비(단위는 기본 mm이며, hwpunit으로 변경 가능)
    :param as_: 단위("mm" or "hwpunit")
    :return: 성공시 True
    """
    if not width:  # 만약 값을 입력하지 않고 `hwp.set_table_width()`라고만 실행하면?
        sec_def = self.hwp.HParameterSet.HSecDef  # 구역정보를 받아서
        self.hwp.HAction.GetDefault("PageSetup", sec_def.HSet)
        width = (
                sec_def.PageDef.PaperWidth - sec_def.PageDef.LeftMargin - sec_def.PageDef.RightMargin - sec_def.PageDef.GutterLen
                - self.get_table_outside_margin_left(as_="hwpunit") - self.get_table_outside_margin_right(
            as_="hwpunit"))  # 표의 목표너비를 용지영역과 동일하게 설정
    elif as_ == "mm":  # 메서드를 실행할 때 정수 값을 입력했다면 
        width = self.mili_to_hwp_unit(width)  # 해당 정수값으로 표 목표너비를 설정
    
    ratio = width / self.get_table_width(as_="hwpunit")  # 현재 표의 너비와 목표너비의 비율 계산
    cur_pos = self.get_pos()  # 현재 위치 저장해 두고(메서드실행 끝나면 돌아가기 위해서)
    self.SelectCtrlFront()  # 전방(문서 끝 방향)으로 컨트롤을 찾아감.
    ctrl = self.CurSelectedCtrl  # 현재 선택한 컨트롤을 
    t = self.GetTextFile("HWPML2X", "saveblock")  # XML 포맷 문서데이터로 저장
    root = ET.fromstring(t)  # 저장한 데이터 파싱 시작
    table = root.find('.//TABLE')  # 표를 찾아서

    if table is not None:  # 표를 찾았으면
        for cell in table.findall('.//CELL'):  # 셀을 찾아서
            width = cell.get('Width')  # 셀의 너비를 추출한 다음,
            if width:  # (셀의 너비가 0이 아니라면)
                cell.set('Width', str(int(width) * ratio))  # 위에서 저장한 "비율"을 곱함.
    t = ET.tostring(root, encoding='UTF-16').decode('utf-16')  # 변경한 데이터 저장.
    
    cur_view_state = self.ViewProperties.Item("OptionFlag")  # 조판부호 보기상태 현재값 저장(메서드 끝나고 원상복구 예정)
    if cur_view_state not in (2, 6):  # 조판부호가 보이는 상태가 아니면
        prop = self.ViewProperties
        prop.SetItem("OptionFlag", 6)  # 조판부호 보이게 설정변경(모든 경우에 표를 제대로 선택하기 위함)
        self.ViewProperties = prop
    self.move_to_ctrl(ctrl)  # 처음 선택했던 표(조판부호 앞)으로 이동
    self.MoveSelRight()  # 표컨트롤 선택
    self.SetTextFile(t, format="HWPML2X", option="insertfile")  # 표내용을 XML변경데이터로 덮어씌움
    prop = self.ViewProperties  # 조판부호 보기상태 되돌림
    prop.SetItem("OptionFlag", cur_view_state)
    self.ViewProperties = prop
    self.set_pos(*cur_pos)  # 처음 커서위치로 되돌아감

 

혹시 괜찮으시다면, 오류가 나는 문서를 공유해주시면 감사하겠습니다.

set_table_width 메서드를 업데이트하는데 큰 도움이 될 것 같습니다.

제 메일주소는 martinii.fun@지메일입니다.

 

행복한 하루 되세요!!!

 

이상민님의 프로필 이미지
이상민
질문자

답변주셔서 감사합니다!!

메일보내려고 본문 삭제하다보니 바탕쪽 홀,짝수 조판부호가 남아있어서 지워보니 잘 작동하더군요...........

결과적으로 바탕쪽에 표가 들어있으면 실행이 안되는것 같습니다!!!

일코님의 프로필 이미지
일코
지식공유자

그렇네요! 바탕쪽에 이것저것 넣고 나니까 제 PC에서도 실행이 안 되네요!ㅎ

바로 고쳐보려고 했는데,

생각보다 간단하지가 않은 것 같아요ㅜㅜㅜ

주말 중에 손을 한 번 보고 댓글 달아놓겠습니다.

알려주셔서 감사합니다!!!

행복한 하루 되세요^^

1

안녕하세요, 인프런 AI 인턴입니다. 이상민님, pyhwpx의 set_table_width() 함수가 특정 파일에서 작동하지 않는 상황에 대해 질문 주셨습니다.

이러한 상황은 여러 가지 요인에 의해 발생할 수 있습니다. 우선, pyhwpx 라이브러리와 관련된 설정이나 함수가 특정 파일 포맷이나 내부 구조와 호환되지 않는 경우일 수 있습니다. 예를 들어, 표의 스타일, 속성이나 특정 보안 설정에 의해 함수가 적용되지 않을 수 있습니다.

아래 링크들을 참고하시면 문제 해결에 도움이 될 수 있습니다:

파일에 따라 기능이 다르게 작동하는 이유가 일반적으로 아예 다른 구조를 가지거나, 소소한 설정 차이 때문일 수 있으므로, 문제가 발생하는 파일과 정상 파일의 차이를 비교하면서 문제를 해결하려고 시도해 보세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

이상민님의 프로필 이미지
이상민

작성한 질문수

질문하기