본문 바로가기
아래아한글 자동화/python+hwp 중급

PDF출력시 여러 매수 한 번에 출력하는 방법

by 회사원코딩 2022. 11. 10.
제가 원하는 건 특정 폴더에 새로 저장되는 파일을 한번 읽어서 여러부수를 프린터로 한번에 인쇄하는 기능입니다.

파이썬에서 일반적인 제시방법들은 os.startfile이나 win32api.ShellExecute방법들인데, 모두 한번 읽어 출력하고, 다시 읽어 출력하는 방법으로 원하는 인쇄부수만큼 반복 출력하는 방법뿐이더라구요..

이럴 경우 매번 읽어들이느라 약간씩의 딜레이타임이 발생하는데, 제가 원하는 건 한번 읽어서 인쇄부수를 지정하여 한번에 출력하는 기능을 구현하고 싶습니다.

os.startfile이나 win32api, win32print 등에는 인쇄부수를 정하는 옵션이 (제가 알기로는) 없지만,

파이썬 모듈을 이용하면 비교적 간단히 해결 가능합니다.

바로 PyPdf2를 이용해서 같은 문서를 인쇄부수만큼 병합해서 result.pdf를 만들고,

원래 출력하려던 문서 대신 result.pdf 를 출력하는 방법입니다.

너무 싱거워 보일 수 있지만 제법 속도도 빠르고,

실제로 프린터 내부에서 스풀링을 할 때에도

이 병합작업과 비슷한 시간이 걸릴 거라고 애써 긍정적으로 생각해봅니다.

함수를 한 번 보여드리겠습니다.

시작하기에 앞서 해당 파이썬 환경에 PyPdf2 모듈을 설치해줍시다.

설치가 완료되었으면 작성해놓으신 파이썬 코드에

아래 함수를 추가합니다. 설명은 주석으로 대체합니다.

from PyPDF2 import PdfFileMerger  # PDF를 병합하기 위한 클래스
from pathlib import Path  # 경로입력을 간편하게 하기 위한 모듈


def 인쇄부수만큼_병합(파일전체경로, 부수):
    병합할리스트 = [파일전체경로] * 부수  # 인쇄부수만큼 복사
    병합파일명 = Path(파일전체경로).parent / "result.pdf"  # 병합결과물 경로

    pdf병합기 = PdfFileMerger()  # Merger(병합기) 인스턴스 생성

    for pdf in 병합할리스트:
        pdf병합기.append(pdf)  # 병합기에 전부 넣어줌

    pdf병합기.write(병합파일명.as_posix())  # 병합된 새 PDF파일 생성완료
    pdf병합기.close()  # 병합기 닫기


# <함수 실행방법>
# 출력할_파일경로 = r"C:\Users\smj02\Desktop\PDF병합\sample.pdf"
# 인쇄부수만큼_병합(출력할_파일경로, 5)
#
# # 프린터로 출력 후
#
# (Path(출력할_파일경로).parent / "result.pdf").unlink() # result.pdf 삭제

콘솔에서 함수를 정의하고 제일 아래 라인을 실행해보면?

샘플pdf 출처 : matplotlib/mpl-data/images

인쇄부수만큼 동일파일이 병합된 PDF가 생성되었습니다.

이제, 작성하신 프로그램에서 기존 pdf파일 대신 result.pdf를 출력하시면

큰 딜레이나, 인쇄 도중에 다른 사우 분 출력물이 껴드는 문제 등은

해결될 것으로 생각해봅니다.

병합하는 방법 대신
다른 pdf드라이버로 인쇄부수를 정할 수 있는 방법을
국내외 포털에서 검색해보았는데,
대부분 기존 os나 win32print 모듈 반복실행으로 해결했거나
유료 툴을 사용해야 하더군요ㅜ (Adobe Acrobat, SumatraPDF 등)
비록 제가 이 쪽 전문가는 아니지만, 저라면 병합하는 방법을 쓰겠습니다.

 

도움이 되었길 바랍니다.

행복한 하루 되세요!

 

신명진 드림

반응형

댓글1