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

윤병현님의 프로필 이미지
윤병현

작성한 질문수

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

페이지 단설정 매크로스크립트 미작동

해결된 질문

작성

·

99

1

안녕하세요 일코님

 

페이지의 단을 1단으로 변경하기 위해서,

한글에서 매크로 녹화를 하여 스크립트를 아래와 같이 땄습니다.

 

HAction.GetDefault("MultiColumn", HParameterSet.HColDef.HSet);
	with (HParameterSet.HColDef)
	{
		Type = ColDefType("Newspaper");
		CreateItemArray("WidthGap", 1);
		WidthGap.Item(0) = MiliToHwpUnit(115.6);
		LineType = HwpLineType("None");
		HSet.SetItem("ApplyClass", 868);
		HSet.SetItem("ApplyTo", 2);
	}
	HAction.Execute("MultiColumn", HParameterSet.HColDef.HSet);

 

이 매크로를 사용하기 위해서

 

        hwp.HAction.GetDefault("MultiColumn", hwp.HParameterSet.HColDef.HSet)
        hwp.HParameterSet.HColDef.Type = hwp.ColDefType("Newspaper")
        hwp.HParameterSet.HColDef.CreateItemArray("WidthGap", 1)
        hwp.HParameterSet.HColDef.WidthGap.Item(0) = hwp.MiliToHwpUnit(115.6)
        hwp.HParameterSet.HColDef.HSet.SetItem("ApplyClass", 868)
        hwp.HParameterSet.HColDef.HSet.SetItem("ApplyTo", 2)
        hwp.HAction.Execute("MultiColumn", hwp.HParameterSet.hwp.HColDef.HSet)

 

이렇게 코드를 작성했는데요.

 

문제는 두번째 줄인 hwp.HParameterSet.HColDef.Type 이부분과

네번째 줄 hwp.HParameterSet.HColDef.WidthGap.Item(0) 입니다.

 

두번째 줄을 실행했을 때

 

AttributeError: '<win32com.gen_py.HwpObject 1.0 Type Library.HColDef instance at 0x1617095373456>' object has no attribute 'Type'

 

 

이러한 에러메시지가 뜨고

 

네번째 줄은

 

hwp.HParameterSet.HColDef.WidthGap.Item(0) = hwp.MiliToHwpUnit(115.6)

IndentationError: unexpected indent

 

이렇게 나오는데요.. 뭐가문제일까요?

 

늘 친절하고 자세하게 답변해주셔서 정말 감사합니다!

 

답변 1

1

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

병현님 안녕하세요?

 

AttributeError: '<win32com.gen_py.HwpObject 1.0 Type Library.HColDef instance at 0x1617095373456>' object has no attribute 'Type'

 

위 오류는 스크립트매크로를 파이썬으로 옮길 때 자주 발생하는 오류인데요. win32 API를 파이썬 클래스로 변환하면서 파이썬 문법이 아닌 부분이 충돌하기 때문에, 스크립트매크로 문법과 파이썬 문법이 약간 달라집니다.

대표적으로

hwp.HParameterSet.HColDef.WidthGap.Item(0) = hwp.MiliToHwpUnit(115.6)

위와 같은 코드는 아래처럼 변경해주시면 됩니다.

hwp.HParameterSet.HColDef.WidthGap.SetItem(0, hwp.MiliToHwpUnit(115.6))

 

그리고 두 번째 오류인

IndentationError: unexpected indent

 

이 오류메시지는 들여쓰기 관련 오류인데요.

지금 모든 줄에 들여쓰기가 일괄 적용되어 있는 것으로 보입니다.

hwp. 앞의 들여쓰기들을 모두 삭제해주시면 해결될 것 같습니다.

 

안 되는 부분 있으면 또 알려주세요^^

더위 잘 피하시고, 행복한 하루 되세요~

 

<참고>

 

코드 마지막 줄에 "hwp." 이 중간에 하나 더 들어가 있어서 오류가 나요.

그리고 보통 HColDef.Count가 들어가야 할 것 같은데,

복사해주신 코드에는 그게 없어서 이상하네요.

 

참고하시라고 다단 관련 샘플코드 몇 개 드려볼게요.

def script_macro1():  # 단순 다단
    pset = hwp.HParameterSet.HColDef
    hwp.HAction.GetDefault("MultiColumn", pset.HSet)
    pset.Count = 2
    pset.SameGap = hwp.MiliToHwpUnit(8.0)
    pset.HSet.SetItem("ApplyClass", 832)
    pset.HSet.SetItem("ApplyTo", 6)
    hwp.HAction.Execute("MultiColumn", pset.HSet)
    
def script_macro2():  # 프리셋 활용하는 다단
    pset = hwp.HParameterSet.HColDef
    hwp.HAction.GetDefault("MultiColumnPreset1", pset.HSet)
    pset.type = hwp.ColDefType("Newspaper")
    pset.SameSize = 1
    pset.Count = 2
    pset.Layout = hwp.ColLayoutType("Left")
    pset.SameGap = hwp.MiliToHwpUnit(8.0)
    pset.LineType = hwp.HwpLineType("None")
    pset.LineWidth = hwp.HwpLineWidth("0.1mm")
    pset.LineColor = hwp.RGBColor(0, 0, 0)
    pset.HSet.SetItem("ApplyClass", 832)
    pset.HSet.SetItem("ApplyTo", 6)
    hwp.HAction.Execute("MultiColumnPreset1", pset.HSet)
    
    
def script_macro3():  # 병현님 코드(오류남)
    hwp.HAction.GetDefault("MultiColumn", hwp.HParameterSet.HColDef.HSet)
    hwp.HParameterSet.HColDef.type = hwp.ColDefType("Newspaper")
    hwp.HParameterSet.HColDef.CreateItemArray("WidthGap", 1)
    hwp.HParameterSet.HColDef.WidthGap.SetItem(0, hwp.MiliToHwpUnit(115.6))
    hwp.HParameterSet.HColDef.HSet.SetItem("ApplyClass", 868)
    hwp.HParameterSet.HColDef.HSet.SetItem("ApplyTo", 2)
    hwp.HAction.Execute("MultiColumn", hwp.HParameterSet.HColDef.HSet)
    
    
def script_macro4():  # 병현님 코드에 Count 라인만 더함
    pset = hwp.HParameterSet.HColDef
    hwp.HAction.GetDefault("MultiColumn", pset.HSet)
    pset.Count = 2
    hwp.HParameterSet.HColDef.CreateItemArray("WidthGap", 1)
    hwp.HParameterSet.HColDef.WidthGap.SetItem(0, hwp.MiliToHwpUnit(115.6))
    pset.HSet.SetItem("ApplyClass", 868)
    pset.HSet.SetItem("ApplyTo", 2)
    hwp.HAction.Execute("MultiColumn", pset.HSet)

image

 

 

윤병현님의 프로필 이미지
윤병현
질문자

감사합니다!
잘 되는듯 하였는데...

코드를 아래와 같이 썼거든요.

        hwp.HAction.GetDefault("MultiColumn", hwp.HParameterSet.HColDef.HSet)
        hwp.HParameterSet.HColDef.type = hwp.ColDefType("Newspaper")
        hwp.HParameterSet.HColDef.Count = 1
        hwp.HParameterSet.HColDef.CreateItemArray("WidthGap", 1)
        hwp.HParameterSet.HColDef.WidthGap.SetItem(0,hwp.MiliToHwpUnit(115.6))
        hwp.HParameterSet.HColDef.LineType = hwp.HwpLineType("None")
        hwp.HParameterSet.HColDef.HSet.SetItem("ApplyClass", 868)
        hwp.HParameterSet.HColDef.HSet.SetItem("ApplyTo", 6)
        hwp.HAction.Execute("MultiColumn", hwp.HParameterSet.HColDef.HSet)
        
            
        hwp.HAction.Run("MoveDocEnd")
        hwp.HAction.Run("MovePageBegin")
        
        # 정답부분은 두 단으로
        hwp.HAction.Run("BreakColDef")
        hwp.HAction.Run("DeleteBack")
        hwp.HAction.GetDefault("MultiColumn", hwp.HParameterSet.HColDef.HSet)
        hwp.HParameterSet.HColDef.Count = 2
        hwp.HParameterSet.HColDef.LineType = hwp.HwpLineType("Solid")
        hwp.HParameterSet.HColDef.HSet.SetItem("ApplyClass", 864)
        hwp.HParameterSet.HColDef.HSet.SetItem("ApplyTo", 5)
        hwp.HAction.Execute("MultiColumn", hwp.HParameterSet.HColDef.HSet)

(들여쓰기는 제대로 되어있습니다)

이부분을 실행할 때,

Traceback (most recent call last):
  File "<stdin>", line 68, in <module>
  File "C:\Users\samsung-user\anaconda3\Lib\site-packages\win32com\gen_py\7D2B6F3C-1D95-4E0C-BF5A-5EE564186FBCx0x1x0\HAction.py", line 35, in Execute
    return self._oleobj_.InvokeTypes(15001, LCID, 1, (11, 0), ((8, 1), (9, 1)),actname      
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^      
pywintypes.com_error: (-2147417851, '서버에서 예외 오류가 발생했습니다.', None, None)    

 

터미널에 이런 오류가 발생합니다..ㅠㅠ 무슨문제일까요??

 

 

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

Count=1에서 오류가 나요.

Count가 1이면 다단을 쓰지 않겠다는 뜻인 같은데...

 

원래 하시려던 작업이 뭐였는지 잘 모르겠지만,

제가 녹화해서 작성한 다단해제 함수를 한 번 보내드려볼게요.

참고해주세요.

def 다단해제():
    pset = hwp.HParameterSet.HColDef
    hwp.HAction.GetDefault("MultiColumnPreset0", pset.HSet)
    pset.type = hwp.ColDefType("Newspaper")
    pset.SameSize = 1
    pset.Count = 1
    pset.Layout = hwp.ColLayoutType("Left")
    pset.SameGap = hwp.MiliToHwpUnit(0.0)
    pset.LineType = hwp.HwpLineType("None")
    pset.LineWidth = hwp.HwpLineWidth("0.1mm")
    pset.LineColor = hwp.RGBColor(0, 0, 0)
    pset.HSet.SetItem("ApplyClass", 832)
    pset.HSet.SetItem("ApplyTo", 6)
    return hwp.HAction.Execute("MultiColumnPreset0", pset.HSet)
    
윤병현님의 프로필 이미지
윤병현

작성한 질문수

질문하기