
우선 제가 대답드리기 조심스러운 부분이 있기는 합니다. 제가 안된다고 했다고 절대로 안 되는 게 아니라, 되는 방법을 제가 못 찾은 것일 수도 있다는 생각 때문입니다. 그래도 제 관점에서 되고 안 되고는 말씀드릴테니, 참고만 해 주시기 바랍니다.
1. 한/글 버전을 선택해서 열 수 있나?
어렵습니다.
다만 최신버전의 한/글이 열리는 게 아니라, (버전이 낮더라도) 최근에 설치한 한/글이 열린다는 점 유의해주세요.
2. AdobePDF, EZ_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") # 문서 닫기
도움이 되었다면
자유롭게 커피 한 잔 후원해 주실 수 있는
링크를 마련했습니다.

행복한 하루 되세요^^
728x90
반응형
'업무자동화 > 파이썬-아래아한글 자동화 기초' 카테고리의 다른 글
"파이썬(아래한글) 실행중 오류를 해결할 수 없어 문의드립니다." (5) | 2021.07.21 |
---|---|
[QnA] 파이썬으로 PDF인쇄시 한/글 버전, PDF드라이버 선택가능? (12) | 2021.07.14 |
워드의 특수문자 단축키 지정, 한/글로는 어떻게 구현할까? (0) | 2021.07.08 |
[PySide6 GUI] 체크버튼으로 한/글 열고 닫기 (1) | 2021.07.06 |
파이썬 공부하면서 한창 알고리즘 문제만 풀고 있는데
매우 실용적으로 쓰시는 글들 잘 보고 구독 누르고 갑니다~
글들 보고 많이 배우겠습니다
답글
안녕하세요~~ 코딩하는 회사원님 덕분에 하위 폴더 포함해서 PDF 로 저장하는것까지 성공했습니다. (일단은 한컴PDF로만 되네요..)
감사합니다.!
수정한 코드 포함해서 파이썬 코드를 올릴려고 했는데 길어서 그런지 안올라가네요 ㅎㅎ
답글
안녕하세요~ 프린터 선택해서 출력하는 방법을 일부 선택적으로(?) 해결했습니다. ^^;
혹시 한글 출력할때 워터마크를 설정하는 방법이 있을까요?
답글
저는 스크립트 매크로를 애용합니다. 아래 댓글은 스크립트매크로 녹화 후 SetItem 타입으로 변환한 코드입니다. 우선 녹화를 하셔서 필수파라미터 외에 솎아내시거나, 별 문제 없으면 그대로 쓰시는 걸 추천드립니다^^
한글 출력할때 워터마크 설정할때처럼 아래 코드를 넣어봤는데 워터마크가 안나오네요
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)
답글
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)
테스트해보시고, 농도나 글자모양 등을 적절히 수정해서 사용하시면 될 것 같습니다. 간편하게는 스크립트매크로를 이용하시는 걸 추천드립니다.
안녕하세요~~ 좋은 글 잘 참고하고 있습니다~~
혹시 스크립트가 포함된 hwp 파일 같은 경우에 간혹 예외적으로 대화 상자가 올라오는데
대화상자가 올라올 경우 프로그램이 멈춥니다 ㅠㅠ 혹시 이러한 경우 어떻게 해결하셨나요!?
답글
파이썬 유저시라면, 오류 타입을 확인하신 후 try-except 구문을 추가하는 방식으로 간단히 예외처리를 추가하시면, 해당 오류로 인한 프로그램 종료를 막으실 수 있습니다. 그런데..
간혹 예외적으로 올라오는 팝업이 어떤 내용인지요?^^;
참고로 프린터 선택하는 것은 아래처럼 해서 선택하게 하였습니다.
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)
답글
한가지 또 질문드려도 될까요?
조판부호 지우는걸 스크립트로 해서 코드가 나왔는데요
파이썬으로 수정한게 아래처럼 했는데 안되네요 ... 어떻게 해야 할까요? ㅠㅠ
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
답글
.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") # "표"일 경우 삭제
감사합니다. 스크립트 이용해서 코드 만들어서 하다 보니 .SetItem 으로 하게 되었네요
알려주신대로 했더니 잘 되네요 ㅎㅎㅎ
너무 많은 도움에 매 번 감사합니다.
답글