본문 바로가기

방명록

  • 프로필사진 eom 2021.09.16 17:53

    덕분에 많은 것을 배우고 있습니다. 고맙습니다~
    그런데 질문 있습니다.
    qt에서 제공?하는 designer.exe로 (예를들어)윈도우.ui파일을 만들어서
    그 안에 hwpctrl을 QAxWidget에 심고 싶은데.. 제 능력 밖이더군요
    64비트 파이썬으론 불가능하고 32비트 에서 어찌어찌 열리긴 하는데
    만든 윈도우.ui안에는 안담기고 독립된 창으로 열리더군요.

    요지는 QPushButton과 한글창이 같은 창안에 구현될까요 입니다.
    알고계시면 한 수 부탁 드립니다.
    고맙습니다.

    제가 작성한 코드도 같이 올리면 도움이 될까요?
    답변

  • 프로필사진 이범관 2021.09.14 07:11

    안녕하세요
    신명진 선생님
    업무자동화에 넘 많이 도움을 받고 있습니다.

    아래 내용은 여러 아래한글에서 형식이 같은 표를 취합하는 프로그램입니다.
    하나의 아래한글에서 여러개의 표가 있을 경우를 고혀해 취합할 표를 검색어로 선택하도록 했습니다.
    문제는 표의 내용이 엑셀에 paste되었다가 판다스로 concat가 안됩니다.

    최종 결과는 concat된 파일을 엑셀로 저장하여 최종 취합할 파일을 엑셀에서 보는 것입니다.
    다른 좋은 방법 등 의견을 부탁드립니다.
    행복한 추석 보내세요^^

    import os
    from tkinter import *
    from tkinter.filedialog import askopenfilename, askopenfilenames


    root = Tk()
    root.geometry("300x100")
    root.option_add("*궁서체","궁서20")
    ent = Entry(root)
    ent.pack()


    def merge_표():
    import win32com.client as win32
    import pandas as pd
    word = ent.get()
    취합보고서 = askopenfilenames(title="취합보고서를 선택하세요.", initialdir=os.getcwd())

    excel = win32.gencache.EnsureDispatch("Excel.Application")
    excel.Visible = True
    wb = excel.Workbooks.Add()
    ws = wb.Worksheets(1)

    df = pd.DataFrame()

    for i in 취합보고서:
    hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject") # 아래아한글 열기
    hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule") # 보안모듈 실행
    hwp.XHwpWindows.Item(0).Visible = True
    hwp.Open(i)
    hwp.InitScan()

    while True:
    result = hwp.GetText()
    print(result)
    if result[0] == 1:
    break
    elif result[0] == 4 and result[1].startswith(word):
    hwp.MovePos(201)
    hwp.Run("TableCellBlock")
    hwp.Run("TableCellBlockExtend")
    hwp.Run("TableCellBlockExtend")
    hwp.Run("Copy")
    excel.ActiveSheet.Paste()
    excel.Selection.Copy()
    ws.Range("A1").Select()
    df = pd.concat([df, pd.read_clipboard()])
    else:
    pass

    print(df.describe())
    excel.DisplayAlerts = False
    excel.Quit()
    hwp.Run("FileClose")
    hwp.Quit()
    print("연락처 취합을 완료하였습니다.")

    btn = Button(root)
    btn.config(text = "표의 첫셀의 단어를 입력하세요")
    btn.config(command = merge_표)
    btn.pack()
    root.mainloop()
    답변

  • 프로필사진 백승민 2021.09.01 15:04

    안녕하세요
    올려주신 글들 많은 도움 받아 코드 작성하였는데, 잘 되다가 간혹 에러가 뜨는데 어떻게 해결해야 할지 여쭙고자 글 남깁니다!!

    코드는 한글문서 내의 수식을 찾아 삭제하고 그 자리에 수식입력기 내용을 집어 넣는 코드입니다.



    ctrl = hwp.HeadCtrl # 첫 번째 컨트롤(HeadCtrl)부터 탐색 시작.


    while ctrl != None: # 끝까지 탐색을 마치면 ctrl이 None을 리턴하므로.
    nextctrl = ctrl.Next # 미리 nextctrl을 지정해 두고,
    if ctrl.CtrlID == "eqed": # 현재 컨트롤이 "수식eqed"인 경우


    position = ctrl.GetAnchorPos(0) # 해당 컨트롤의 좌표를 position 변수에 저장
    position = position.Item("List"), position.Item("Para"), position.Item("Pos")
    hwp.SetPos(*position) # 해당 컨트롤 앞으로 캐럿(커서)을 옮김
    hwp.FindCtrl() # 해당 컨트롤 선택

    Act = hwp.CreateAction('EquationModify')
    Set = Act.CreateSet()
    Pset = Set.CreateItemSet('EqEdit', 'EqEdit')
    Act.GetDefault(Pset)
    function = Pset.Item('String')


    hwp.Run("SelectCtrl") # 해당컨트롤 선택
    hwp.Run("Delete") # 해당 수식 삭제


    act = hwp.CreateAction("InsertText")
    pset = act.CreateSet()
    pset.SetItem("Text", f"{function}")
    act.Execute(pset) #수식자리에 수식입력기내용 입력



    ctrl = nextctrl # 다음 컨트롤 탐색

    hwp.Run("Cancel") # 완료했으면 선택해제




    에러 내용은
    act.Execute(pset)
    이부분에서
    (-2147023170, '원격 프로시저를 호출하지 못했습니다.', None, None)
    이런 에러가 뜹니다
    답변

    • 프로필사진 Martinii의 회사원코딩 2021.09.09 15:00 신고

      안녕하세요?
      "원격 프로시저를 호출하지 못했습니다." 라는 메시지는 어떤 오류로 인해 한/글과 파이썬의 연결이 종료되었다는 의미입니다.

      아래와 같이 해결해 보시기 바랍니다.

      1. <매번 동일한 시점에 오류가 난다면>

      오류가 발생하는 지점(수식 또는 파일)이 항상 동일한지 여부 체크해 보시고, 동일하다면 오류시점에 삽입하는 수식 문자열이나 파일에 오류가 있는 것으로 간주하시면 됩니다.

      2. <각각 다른 지점에서 오류가 난다면>

      원격프로시저 호출 실패 메시지가 뜨는 시점이 조금씩 다르다면? 버벅이는 프로세스 앞에 sleep 함수를 0.1~0.5초 정도만 줘보세요. 특정 프로세스가 완료되기 전에 파이썬에서 다음 명령어를 실행하려고 해서 COM오류가 나는 경우가 종종 있더라고요.


      -----
      "잘 되다가 간혹 에러가 뜬다"고 말씀하시는 걸 보니ㅜ 수식에 문제는 없어 보이네요. sleep 함수를 적절히 넣는 걸로 해결되지 않을까 생각되기는 합니다.

  • 프로필사진 이오용 2021.08.31 09:07

    안녕하십니까?
    파이썬으로 여러개의 PNG 파일을 빈 한글 문서에 삽입하는 자동화를 시도하고 있습니다.
    PNG 파일들은 동일디렉토리에 들어 있고 for loop로 각 png 파일(이미지 크기는 A4 사이즈 정도)을
    한글 빈문서에 그림 파일로 페이지마다 한개 씩 삽입하고자 합니다.
    블로그에서 소개해 준 hwp.insertPicture 내용 참고하여 진행해 봤는데
    아래와 같은 에러가 발생합니다. 해결 방법 조언 부탁드립니다.

    참고한 코드
    for j in slot_list:
    hwp.MoveToField(j) # 해당 필드로 이동
    hwp.InsertPicture(os.path.join(BASE_DIR, f"{content + j.split('_', maxsplit=1)[1]}.png"), Embedded=True, sizeoption=3) # 이미지 삽입

    ERROR:root:Traceback (most recent call last):
    File "c:/Users/ohyonglee/Downloads/PNG2HPW.py", line 12, in PngToHwp
    hwp.InsertPicture(absfilepath, True, 0)
    File "<COMObject HWPFrame.HwpObject>", line 5, in InsertPicture
    pywintypes.com_error: (-2147352562, '매개 변수의 개수가 잘못되었습니다.', None, None)

    사용 중인 코드
    def PngToHwp(dirpath, hwppath, firstslidepage):
    try:
    hwp = win32.Dispatch("HWPFrame.HwpObject")
    hwp.XHwpWindows.Item(0).Visible = True
    # hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule") # 보안모듈 적용
    # 양식 변경
    hwp.HAction.GetDefault("PageSetup", hwp.HParameterSet.HSecDef.HSet)
    hwp.HParameterSet.HSecDef.PageDef.LeftMargin = hwp.MiliToHwpUnit(0)
    hwp.HParameterSet.HSecDef.PageDef.RightMargin = hwp.MiliToHwpUnit(0)
    hwp.HParameterSet.HSecDef.PageDef.TopMargin = hwp.MiliToHwpUnit(0)
    hwp.HParameterSet.HSecDef.PageDef.BottomMargin = hwp.MiliToHwpUnit(0)
    hwp.HParameterSet.HSecDef.PageDef.HeaderLen = hwp.MiliToHwpUnit(0.0)
    hwp.HParameterSet.HSecDef.PageDef.FooterLen = hwp.MiliToHwpUnit(0.0)
    hwp.HParameterSet.HSecDef.PageDef.GutterLen = hwp.MiliToHwpUnit(0.0)
    hwp.HParameterSet.HSecDef.HSet.SetItem("ApplyClass", 24)
    hwp.HParameterSet.HSecDef.HSet.SetItem("ApplyTo", 3) # 문서 전체 변경
    hwp.HAction.Execute("PageSetup", hwp.HParameterSet.HSecDef.HSet)

    filelist = os.listdir(dirpath)

    # for file in filelist:

    for i in range(1, len(filelist)+1):

    filename = "슬라이드"+repr(i+int(firstslidepage) -1)+'.PNG'
    # os.getcwd()
    filepath = os.path.join(dirpath, filename)
    # filepath = os.path.join(os.getcwd(), file) #현재 폴더에서

    if os.path.splitext(filepath)[1] == '.PNG':

    # print(file)
    image = Image.open(filepath)
    resize_image = image.resize((810, 1140))
    image.thumbnail((810, 1140), Image.ANTIALIAS)
    image.save(filepath)

    #hwp.InsertPicture(absfilepath, True, 0)
    hwp.InsertPicture(print(filepath.replace('\\', "/")), True, 0)

    else:
    print(filename+"이미지 파일이 아닙니다.")

    hwp.SaveAs(hwppath)
    print(hwppath, "- 저장 완료")
    hwp.Quit()
    except:
    logging.error(traceback.format_exc())
    print("PNG2HWP 오류 발생")
    hwp.Quit()
    답변

    • 프로필사진 이오용 2021.08.31 15:54

      홈페이지 관련 예제 강좌 내용에 해결 방법이 제시되어 있는 것 같습니다.
      시간을 갖고 내용을 천천히 살펴보면서 수정해보겠습니다. 고맙습니다.^^

    • 프로필사진 Martinii의 회사원코딩 2021.09.09 15:09 신고

      안녕하세요?
      회신이 조금 늦었습니다.. (모바일로 알림이 오지 않네요ㅜ)

      한/글 인스턴스를 디스패치하실 때 win32.gencache.EnsureDispatch로 진행하시면 디폴트 파라미터가 잘 잡히더라고요.

      근데 그냥 win32.Dispatch로 한/글을 열면 필수파라미터가 아니라도 기본값을 모두 명시해줘야 해서(안 그러면 오류가 나고) 굉장히 귀찮습니다..

      오용님 오류도 이런 경우 같거든요.

      ①EnsureDispatch를 하시거나, 혹은

      ②HwpCtrl API.hwp 파일을 여셔서 모든 매개변수를 입력하셔야 합니다. 예를 들면,

      hwp.InsertPicture(
      Path=이미지경로,
      Embedded=True,
      sizeoption=3,
      Reverse=False,
      watermark=False,
      Effect=0)

      이런 식으로요.
      대소문자 유의하시고요.

    • 프로필사진 2021.09.14 14:36

      비밀댓글입니다

  • 프로필사진 김준 2021.08.18 15:38

    안녕하세요.
    블로그 참고하여 파이썬으로 한글 자동화를 진행중인데요.

    셀에 색을 지정하는 것은 잘 되는데,,,그라데이션을 넣을려고 하면 아무 변화가 없습니다.ㅜ
    혹시 셀에 그라데이션 적용하는 방법을 알 수 있을까요..?

    답변

    • 프로필사진 Martinii의 회사원코딩 2021.09.09 15:43 신고

      안녕하세요?

      저도 이런 경우가 종종 있더라고요. 셀에 그라데이션 적용하기나, 문서 워터마크 삽입이라든지.. 이런 기능은 녹화해서 파이썬으로 실행해봐도 잘 안 되고, 파라미터셋을 아무리 뒤져봐도 적절한 방법이 안 나오고..

      제 경우에는 이런 작업을 할 때 한시적으로 스크립트매크로 녹화를 안 쓰는 슬롯에 하나 해 두고, 녹화한 매크로를 직접 실행하는 파이썬 코드로 진행을 해요. 예를 들면, 5번 슬롯에 그라데이션 적용하는 매크로를 녹화해 두고, 파이썬에서

      hwp.RunScriptMacro(FunctionName="OnScriptMacro_script5()", uMacroType=0, uScriptType=1)

      이런 방식으로 실행하면 오류가 안 나거든요. 꼼수라면 꼼수지만,
      이런 방식으로도 목적달성(?)할 수 있다는 점 참고해 주시기 바랍니다.

      관련 포스팅을 아래 적어둡니다.
      https://employeecoding.tistory.com/160

  • 프로필사진 회사원코딩 2021.08.18 10:39

    금주 이사중으로 답변이나 포스팅이 더딘 점 양해 바랍니다. 감사합니다. 행복한 하루 되세요!!
    답변

  • 프로필사진 김재석 2021.08.11 12:01

    안녕하십니까 회사원 코딩님 덕분에 저도 파이썬을 배우고 있습니다. 좋은 정보를 올려주셔서 너무 감사합니다^^. 요즘 회사원코딩님 글을 보다가 하나 궁금한게 생겼는데.... 죄송하지만 하나 물어봐도 되겠습니까....
    회사원 코딩님 한글표에 이미지 넣기 게시물에서 혹시 이미지를 넣을때 '글자처럼취급 해제' 하고, '글뒤로 보내기'또한 설정해서 넣는게 가능한지요....
    답변

  • 프로필사진 초보 2021.07.26 17:34

    넘 멋진 공간이네요.
    자주 찾아 함께 하겠습니다^^
    답변

  • 프로필사진 김민수 2021.07.16 14:23

    우와 이런것이 있었네요... 저도 공공기관 근무중인 사람인데 많은 도움이 될꺼 같습니다.
    아직 정주행은 안했으나 몇몇글을 보고 설레이는 맘이 드네요
    감사합니다. 정주행 하겠습니다.
    글고 유튜브도 구독했습니다.
    원래 이런글 잘 안남기나 개인노하우를 공유한다는 일이
    참 어려운일 이라고 생각되어 감사한 마음으로 글 남김니다.
    답변

    • 프로필사진 Martinii의 회사원코딩 2021.07.19 23:45 신고

      안녕하세요?
      노하우 공유라고는 하지만, 정돈되지 않은 강의용 습작에 지나지 않습니다ㅜ 맘 굳게 먹고 정리를 좀 해 보고 싶은데 와, 이게 쉽지 않네요ㅜ

      그래도 배운게 자동화인지라, 작업하시면서 자동화해보고 싶으신 게 있으면 방명록이나 이메일 martinii.fun@지메일 남겨주셔요.

      행복한 하루 되시고요ㅎ

  • 프로필사진 기만기만 2021.07.13 20:13

    안녕하세요 파이썬으로 다빈치리졸브 제어하는 https://www.martinii.fun/75 글을 읽었습니다.
    글 서두에 보면 유료 웹북 혹은 e북으로 판매 예정 하신다고 하셨는데 혹시 판매 되고 있나요?
    단축키로 특정작업을 매크로화 하고 싶은데 이 이후의 포스팅이 없어서 문의 드립니다.
    답변

    • 프로필사진 Martinii 2021.07.13 20:40

      안녕하세요?
      아쉽게도 다빈치리졸브 자동화 관련해서 제작하기로 계획했던 전자책이나 동영상강의는 여러 가지 이유로 무기한 연기하고 있습니다. 올해 중에는 착수할 예정이긴 합니다. (배포 말고 제작을요..)

      그래도 당장 어떤 부분이 궁금한지 알려주시면 제가 알고 있는 선에서 가능한한 도움을 드리고 싶습니다.

      문의는 martinii.fun@gmail.com으로 보내주시거나, 민감한 내용이 아니라면 그냥 방명록이나 댓글로 남겨주셔도 됩니다. 확인 후 회신 드리겠습니다.

      행복한 하루 되세요^^