본문 바로가기
업무자동화/파이썬-아래아한글 자동화 기초

[QnA] 파이썬으로 PDF인쇄시 한/글 버전, PDF드라이버 선택가능?

by Martinii의 회사원코딩 2021. 7. 14.
 양동훈님의 댓글

우선 제가 대답드리기 조심스러운 부분이 있기는 합니다. 제가 안된다고 했다고 절대로 안 되는 게 아니라, 되는 방법을 제가 못 찾은 것일 수도 있다는 생각 때문입니다. 그래도 제 관점에서 되고 안 되고는 말씀드릴테니, 참고만 해 주시기 바랍니다.

1. 한/글 버전을 선택해서 열 수 있나?

어렵습니다.
다만 최신버전의 한/글이 열리는 게 아니라, (버전이 낮더라도) 최근에 설치한 한/글이 열린다는 점 유의해주세요.

2. AdobePDF, EZ_PDF 등 다른 PDF드라이버 지정 가능한지?

가능합니다. 다만 파이썬 단에서 설정을 바꾸는 건 굉장히 번거로운 일이기 때문에 아래 방법을 추천드립니다.
가장 간편한 방법은, 환경설정의 <기타>탭 하단에 PDF드라이버 선택 메뉴를 활용하는 방법입니다.

PDF 저장시, 기본 출력되는 PDF드라이버를 선택할 수 있습니다.

그밖에도 한/글 액션 중 "Print" 를 사용해서 드라이버를 선택할 수 있는데,
예를 들면 이런 식입니다. 근데 명령을 실행했을 때 팝업이 두 개나 추가로 뜨기 때문에 번거롭습니다ㅜ

def hwp_print(driver="Hancom PDF") act = hwp.CreateAction("Print") pset = act.CreateSet() act.GetDefault(pset) # 프린트 파리미터 초기화 pset.SetItem("Range", 4) # 인쇄범위, 4 == hwp.PrintRange("Custom") pset.SetItem("RangeCustom", "1") # 사용자가 직접 입력한 인쇄 범위 pset.SetItem("UsingPagenum", 1) # 한 쪽, 현재쪽 선택인쇄할 때 사용하는 라인 pset.SetItem("NumCopy", 1) # 인쇄매수 pset.SetItem("PrintMethod", 0) # 인쇄 방법 pset.SetItem("PrinterName", driver) # 프린터 선택(파라미터에서 지정) pset.SetItem("PrintToFile", 0) # 인쇄 결과를 파일로 저장 pset.SetItem("ReverseOrder", 0) # 역순 인쇄 pset.SetItem("Pause", 0) # 끊어 찍기 매수 pset.SetItem("PrintImage", 1) # 그림 개체 pset.SetItem("PrintDrawObj", 1) # 그리기 개체 pset.SetItem("PrintClickHere", 0) # 누름틀 pset.SetItem("Device", 0) pset.SetItem("PrintFormObj", 1) # 양식 개체 출력여부 pset.SetItem("PrintMarkPen", 0) # 형광펜 출력여부 pset.SetItem("PrintMemo", 0) # 메모 출력여부 pset.SetItem("PrintMemoContents", 0) # 메모 내용 출력여부 pset.SetItem("PrintRevision", 1) # 교정부호 출력여부 item_set = pset.CreateItemSet("PrintWatermark", "PrintWatermark") # 워터마크 서브 프로퍼티 설정 item_set.SetItem("WatermarkType", 0) act.Execute(pset)

하여튼 PDF드라이버 선택은 위의 환경설정에서 변경하시면 될 것 같습니다.

3. 하위폴더의 hwp파일을 전부 선택하는 방법?

이것도 간단합니다. 바로 os모듈의 walk 메서드를 사용하는 건데요.
아래 예제코드를 참고하시기 바랍니다.

def 하위폴더의_hwp까지_검색(경로명): hwp_list = [] for dirpath, dirnames, filenames in os.walk(경로명): for filename in filenames: if filename.endswith(".hwp"): hwp_list.append(os.path.join(dirpath, filename)) else: pass return hwp_list 한글파일목록 = 하위폴더의_hwp까지_검색(r"C:\Program Files (x86)\HNC\Office 2020\HOffice110\Shared\HwpTemplate\Style\en-US") print(한글파일목록)

위 명령 실행시 제 PC에서 한글파일목록 리스트는 아래와 같이 저장됩니다.

['C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Book\\Book1.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Book\\Book2.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Book\\Book3.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Book\\Book4.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Book\\Book5.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Letter\\Letter1.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Letter\\Letter2.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Letter\\Letter3.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Letter\\Letter4.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Letter\\Letter5.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Paper\\Paper1.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Paper\\Paper2.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Paper\\paper3.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Present\\Present1.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Present\\Present2.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Present\\Present3.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Present\\Present4.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Present\\Present5.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Report\\Report1.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Report\\Report2.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Report\\Report3.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Report\\Report4.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Thesis\\Thesis2.hwp', 'C:\\Program Files (x86)\\HNC\\Office 2020\\HOffice110\\Shared\\HwpTemplate\\Style\\en-US\\Thesis\\Thesis3.hwp']

그러면 한/글 파일을 여는 코드를 이런 식으로 변경해주시면 되겠죠?

for 한글파일 in 한글파일목록: hwp.Open(한글파일) # 이런저런 작업 또는 PDF저장하는 코드 등 hwp.Clear(option=1) # 수정내용을 버리는 경우 # hwp.Save() # 수정내용을 저장하고 싶은 경우에는 Clear 대신 Save 실행 hwp.Run("FileClose") # 문서 닫기


도움이 되었다면
자유롭게 커피 한 잔 후원해 주실 수 있는
링크를 마련했습니다.

donaricano-btn

행복한 하루 되세요^^

댓글12

  • 빛밤하늘 2021.07.15 20:19

    파이썬 공부하면서 한창 알고리즘 문제만 풀고 있는데
    매우 실용적으로 쓰시는 글들 잘 보고 구독 누르고 갑니다~
    글들 보고 많이 배우겠습니다
    답글

  • 양동훈 2021.07.16 14:32

    안녕하세요~~ 코딩하는 회사원님 덕분에 하위 폴더 포함해서 PDF 로 저장하는것까지 성공했습니다. (일단은 한컴PDF로만 되네요..)
    감사합니다.!
    수정한 코드 포함해서 파이썬 코드를 올릴려고 했는데 길어서 그런지 안올라가네요 ㅎㅎ

    답글

  • 양동훈 2021.07.26 12:30

    안녕하세요~ 프린터 선택해서 출력하는 방법을 일부 선택적으로(?) 해결했습니다. ^^;
    혹시 한글 출력할때 워터마크를 설정하는 방법이 있을까요?
    답글

    • Martinii 2021.07.26 23:12

      저는 스크립트 매크로를 애용합니다. 아래 댓글은 스크립트매크로 녹화 후 SetItem 타입으로 변환한 코드입니다. 우선 녹화를 하셔서 필수파라미터 외에 솎아내시거나, 별 문제 없으면 그대로 쓰시는 걸 추천드립니다^^

  • 양동훈 2021.07.26 14:16

    한글 출력할때 워터마크 설정할때처럼 아래 코드를 넣어봤는데 워터마크가 안나오네요
    act = hwp.CreateAction("Print") # 프린트 액션을 만듬
    pset = act.CreateSet() # 액션에 대한 파라미터 설정들을 초기화 함
    act.GetDefault(pset) # 프린트 파리미터 초기화
    item_set = pset.CreateItemSet("PrintWatermark", "PrintWatermark")
    pset.SetItem("WatermarkType", 2)
    pset.SetItem("String", "대 외 비")
    pset.SetItem("WaterMarkEff", 1)
    답글

    • Martinii 2021.07.26 23:10

      act = hwp.CreateAction("Print")
      pset = act.CreateSet()
      act.GetDefault(pset) # 프린트 파라미터 초기화
      pset.SetItem("Range", 4) # 인쇄범위, 4 == hwp.PrintRange("Custom")
      pset.SetItem("RangeCustom", "1") # 사용자가 직접 입력한 인쇄 범위
      pset.SetItem("UsingPagenum", 1) # 한 쪽, 현재쪽 선택인쇄할 때 사용하는 라인
      pset.SetItem("NumCopy", 1) # 인쇄매수
      pset.SetItem("PrintMethod", 0) # 인쇄 방법
      pset.SetItem("PrinterName", "Hancom PDF") # 프린터
      pset.SetItem("PrintToFile", 0) # 인쇄 결과를 파일로 저장
      pset.SetItem("ReverseOrder", 0) # 역순 인쇄
      pset.SetItem("Pause", 0) # 끊어 찍기 매수
      pset.SetItem("PrintImage", 1) # 그림 개체
      pset.SetItem("PrintDrawObj", 1) # 그리기 개체
      pset.SetItem("PrintClickHere", 0) # 누름틀
      pset.SetItem("Device", 0)
      pset.SetItem("PrintFormObj", 1) # 양식 개체 출력여부 (글2007에 새로 추가)
      pset.SetItem("PrintMarkPen", 0) # 형광펜 출력여부 (글2007에 새로 추가)
      pset.SetItem("PrintMemo", 0) # 메모 출력여부 (글2007에 새로 추가)
      pset.SetItem("PrintMemoContents", 0) # 메모 내용 출력여부 (글2007에 새로 추가)
      pset.SetItem("PrintRevision", 1) # 교정부호 출력여부 (글2007에 새로 추가)

      item_set = pset.CreateItemSet("PrintWatermark", "PrintWatermark") # 워터마크 서브 프로퍼티 설정
      item_set.SetItem("WatermarkType", hwp.WatermarkBrush("Text"))
      item_set.SetItem("PosPage", 0)
      item_set.SetItem("TextWrap", 1)
      item_set.SetItem("AlphaText", 127)
      item_set.SetItem("AlphaImage", 179)
      item_set.SetItem("DrawFillImageType", hwp.DrawFillImage("Zoom"))
      item_set.SetItem("PicEffect", hwp.PicEffect("RealPic"))
      item_set.SetItem("Brightness", 0)
      item_set.SetItem("Contrast", 0)
      item_set.SetItem("String", "대 외 비")
      item_set.SetItem("FontName", "휴먼명조")
      item_set.SetItem("FontType", hwp.FontType("TTF"))
      item_set.SetItem("FontSize", hwp.PointToHwpUnit(80.0))
      item_set.SetItem("FontColor", hwp.RGBColor(0, 0, 0))
      item_set.SetItem("RotateAngle", -45)
      item_set.SetItem("WaterMarkEff", 1)
      item_set.SetItem("ShadowType", hwp.CharShadowType("None"))
      act.Execute(pset)

      테스트해보시고, 농도나 글자모양 등을 적절히 수정해서 사용하시면 될 것 같습니다. 간편하게는 스크립트매크로를 이용하시는 걸 추천드립니다.

  • trossj 2021.07.26 18:10

    안녕하세요~~ 좋은 글 잘 참고하고 있습니다~~
    혹시 스크립트가 포함된 hwp 파일 같은 경우에 간혹 예외적으로 대화 상자가 올라오는데
    대화상자가 올라올 경우 프로그램이 멈춥니다 ㅠㅠ 혹시 이러한 경우 어떻게 해결하셨나요!?

    답글

    • Martinii 2021.07.26 22:40

      파이썬 유저시라면, 오류 타입을 확인하신 후 try-except 구문을 추가하는 방식으로 간단히 예외처리를 추가하시면, 해당 오류로 인한 프로그램 종료를 막으실 수 있습니다. 그런데..

      간혹 예외적으로 올라오는 팝업이 어떤 내용인지요?^^;

  • 양동훈 2021.07.28 16:11

    참고로 프린터 선택하는 것은 아래처럼 해서 선택하게 하였습니다.


    self.lb_printer = QLabel('프린터 : ', self)

    # 프린터 콤보박스 (ezPDF Builder가 있으면 기본프린터로 설정)
    self.cb_printer = QComboBox(self)
    printers = win32print.EnumPrinters(2)
    for i, printer in enumerate(printers):
    self.cb_printer.addItem(printer[2])
    if printer[2] == 'ezPDF Builder Supreme': #ezPDF Builder 가 있으면 기본프린터로 지정
    self.Select_Printer(printer[2])
    self.cb_printer.setCurrentIndex(i)
    self.cb_printer.activated[str].connect(self.Select_Printer)
    답글

  • 양동훈 2021.07.28 16:13

    한가지 또 질문드려도 될까요?
    조판부호 지우는걸 스크립트로 해서 코드가 나왔는데요
    파이썬으로 수정한게 아래처럼 했는데 안되네요 ... 어떻게 해야 할까요? ㅠㅠ

    hwp.HAction.GetDefault("DeleteCtrls", hwp.HParameterSet.HDeleteCtrls.HSet)
    option=hwp.HParameterSet.HDeleteCtrls

    option.CreateItemArray("DeleteCtrlType", 7)
    option.DeleteCtrlType.Item(0, 24) # 감추기
    option.DeleteCtrlType.Item(1, 14) # 꼬리말
    option.DeleteCtrlType.Item(2, 26) # 머리말
    option.DeleteCtrlType.Item(3, 33) # 바탕쪽
    option.DeleteCtrlType.Item(4, 45) # 새 쪽 번호
    option.DeleteCtrlType.Item(5, 47) # 쪽 번호
    option.DeleteCtrlType.Item(6, 49) # 쪽 번호 위치
    hwp.HAction.Execute("DeleteCtrls", hwp.HParameterSet.HInsertFile.HSet);



    이렇게 하니까 이런 에러가 나네요 -_-; 머가 한개 더 필요하다는거 같은데....
    option.DeleteCtrlType.Item(0, 24) # 감추기
    TypeError: Item() takes from 1 to 2 positional arguments but 3 were given

    답글

    • Martinii 2021.07.28 22:18

      .Item 에 들어가는 값을 수정하는 메서드는 모두 동일하게 SetItem 을 사용합니다.

      option.DeleteCtrlType.SetItem(0, 24)

      이런 방식으로 바뀌어야 합니다.
      (오류메시지의 의미는, Item()메서드는 1개 또는 최대 2개의 인자만 받는데 세 개가 주어졌다는 뜻입니다. 첫 번째 인자는 숨겨진 self니까요.)


      그리고... 사실 저는 위 방법을 사용해 본 적은 없고, 컨트롤 일괄삭제를 할 때는 아래 두 가지 방법을 주로 활용하고 있었습니다. 도움이 되었으면 좋겠습니다.

      -------------------------------------

      # %% 1. 모든 수식 찾아 지우기(HeadCtrl & CtrlID 사용)
      ctrl = hwp.HeadCtrl
      while ctrl != None:
      try:
      nextctrl = ctrl.Next
      except com_error: # 지우는 표 안에 누름틀이 한 개 이상 있는 경우 이런 오류가 발생.
      sleep(1)
      nextctrl = ctrl.Next
      if ctrl.CtrlID == "eqed":
      hwp.DeleteCtrl(ctrl)
      ctrl = nextctrl


      #%% 2. 모든 표 삭제(KeyIndicator 활용)
      hwp.Run("MoveDocBegin") # 문서 처음으로 이동
      for i in range(10):
      hwp.Run("SelectCtrlFront") # 첫 번째 컨트롤 선택
      if hwp.KeyIndicator()[-1] == "표": # 현재위치[-1]은 컨트롤 문자열. "표", "그림" 등
      hwp.Run("Delete") # "표"일 경우 삭제


  • 양동훈 2021.07.30 02:03

    감사합니다. 스크립트 이용해서 코드 만들어서 하다 보니 .SetItem 으로 하게 되었네요
    알려주신대로 했더니 잘 되네요 ㅎㅎㅎ
    너무 많은 도움에 매 번 감사합니다.
    답글