본문 바로가기
Project/pre-print-project

ec2에서 파일 가져오기 & 파이썬 스크립트로 원격 프린트 진행하기

by 지식을 쌓는 개구리 2024. 8. 22.

여는 글

프리프린트 예약서비스 개발을 거의 마무리하고 이제 마지막으로

오늘 들어온 주문을 새벽 1시에 모두 정리하여 csv로 주문서를 포맷팅하고 pdf파일을 모두 ec2내부의 특정 폴더에 둔다 -> ec2-crontab 스케줄러로 파이썬 스크립트 실행

ec2에 존재하는 파일을 로컬 컴퓨터의 폴더로 매일 새벽 1시 5분에 가져온 뒤 -> ec2-crontab 스케줄러로 파이썬 스크립트 실행

그 폴더에 존재하는 모든 pdf를 출력해야하는 과제가 남았다. -> 새벽 1시 10분에 이것도 스케줄러로 실행할 예정, 윈도우 스케줄러로.

 

일단 3일에 걸쳐서 .bat 파일과 파이썬 스크립트로 원격 프린트를 진행하는 방법을 모두 성공했고

csv 주문 표를 읽고 이를 기반 커스텀 pdf생성 및 출력 & 주문 파일 출력까지 모두 성공했다.

차례대로 과정을 알아보자

 

1. bat 파일 기반 프린트 원격 출력하기

@echo off
setlocal enabledelayedexpansion
set "PDF_FOLDER=C:\Users\Owner\Downloads\files"

for %%f in ("%PDF_FOLDER%\*.pdf") do (
    start "" /min "C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe" /n /t "%%f" "Samsung X4305 Series (192.168.0.154)"
    timeout /t 5
)

이는 bat파일을 기반으로 프린트를 원격 진행하는 코드이다. 문법을 모두 알 필욘 없고 중요한 부분만을 보자면 아래와 같다.

- PDF_FOLDER라는 변수를 만들어, PDF 파일들이 저장된 폴더 경로를 지정했다.

- for문이 하나 보일텐데, 지정된 폴더 내의 모든 PDF 파일들을 하나씩 처리하기 위해 for 루프를 사용한 것이다. %%f는 각각의 파일 이름을 가리키는 변수로써 사용한 것.

start...부분부터는 Adobe Acrobat 프로그램을 최소화 상태로 실행하여 PDF 파일을 지정된 프린터로 인쇄하게 하는 것.

  • /n 옵션은 매번 새로운 Acrobat 인스턴스를 실행하도록 강제한다.
  • /t "%%f" "Samsung X4305 Series (192.168.0.154)"는 현재 PDF 파일을 지정된 네트워크 프린터로 인쇄하라는 명령이다.

- 추가로 타임아웃을 두어 각 PDF 파일을 인쇄한 후, 5초 동안 대기하도록 했다.

=> 최종적으로 지정된 폴더에 있는 모든 PDF 파일을 네트워크 프린터를 통해 자동으로 인쇄하도록 한다.

 

[결과]

=> 배치파일 실행하면?

=> 잘 출력하는 것을 볼 수 있다.

 

 

2. python 파일 기반 프린트 원격 출력하기

import os
import subprocess
import time

# PDF 파일이 위치한 폴더 경로
pdf_folder = r"C:\Users\Owner\Downloads\files"

# 프린터 이름
printer_name = "Samsung X4305 Series (ip정보임. 비밀)"

# Adobe Acrobat 실행 파일 경로
acrobat_path = r"C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe"

# PDF 폴더의 모든 PDF 파일에 대해 순차적으로 프린트 명령 실행
for pdf_file in os.listdir(pdf_folder):
    if pdf_file.endswith(".pdf"):
        pdf_path = os.path.join(pdf_folder, pdf_file)
        subprocess.run([acrobat_path, "/n", "/t", pdf_path, printer_name])
        time.sleep(5)  # 5초 대기

=> 다음으로 파이썬 코드 기반 특정 폴더에 있는 모든 PDF 파일을 지정된 프린터로 자동으로 인쇄하는 방법이다.

=> 배치파일과 매커니즘은 비슷하다.

먼저, PDF 파일들이 위치한 폴더 경로(pdf_folder)와 사용할 프린터의 이름(printer_name), 그리고 Adobe Acrobat 실행 파일의 경로(acrobat_path)를 설정해주고 이후, os.listdir() 함수를 사용해 해당 폴더에 있는 모든 파일을 순회하면서 .pdf 확장자로 끝나는 파일들을 찾는다. 각 PDF 파일의 전체 경로를 생성한 후, subprocess.run() 함수를 이용해 Adobe Acrobat을 최소화된 상태에서 실행하고, 지정된 프린터로 인쇄를 수행한다. 인쇄 작업 사이에 time.sleep(5)을 사용해 5초씩 대기 시간을 주어, 프린터가 안정적으로 각 파일을 처리할 수 있도록 했다.

 

[결과]

=> 실행하면 역시나,

=> 잘 출력되는 모습

 

 

 

3. 커스텀 pdf생성 방법 & 흑백/컬러 구분해서 출력하기

import os
import subprocess
import time
import pandas as pd
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Paragraph

# PDF 파일이 위치한 폴더 경로
pdf_folder = r"C:\Users\Owner\Downloads\files"

# 프린터 이름
printer_name = "Samsung X4305 Series (장치 ip임, 비밀)"

# Adobe Acrobat 실행 파일 경로
acrobat_path = r"C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe"

# CSV 파일 경로
csv_file = os.path.join(pdf_folder, "customers.csv")

# CSV 파일 읽기
df = pd.read_csv(csv_file)

def set_printer_color_mode(printer_name, color_mode):
    is_color = "$True" if color_mode == "C" else "$False"
    subprocess.run([
        "powershell",
        "-Command",
        f'Set-PrintConfiguration -PrinterName "{printer_name}" -Color {is_color}'
    ])

def create_customer_pdf(output_path, user_id, username, locker_number, locker_pw, files):
    doc = SimpleDocTemplate(output_path, pagesize=A4)
    styles = getSampleStyleSheet()

    content = []
    text = f"User ID: {user_id}\nUsername: {username}\nLocker Number: {locker_number}\nLocker PW: {locker_pw}\nFiles: {files}"
    paragraph = Paragraph(text.replace("\n", "<br/>"), styles["Normal"])
    content.append(paragraph)

    doc.build(content)

for index, row in df.iterrows():
    user_id = row['User ID']
    username = row['Username']
    locker_number = row['Locker Number']
    locker_pw = row['Locker PW']
    color_mode = row['Color']
    files = row['Files']

    # 프린터 컬러 모드 설정
    set_printer_color_mode(printer_name, color_mode)

    # 임시로 고객 정보를 포함한 PDF 생성
    customer_pdf = os.path.join(pdf_folder, f"customer_info_{user_id}.pdf")
    create_customer_pdf(customer_pdf, user_id, username, locker_number, locker_pw, files)

    # 고객 정보 PDF 프린트
    subprocess.run([acrobat_path, "/n", "/t", customer_pdf, printer_name])
    time.sleep(5)  # 5초 대기

    # 고객의 파일들을 프린트
    if files.startswith('"') and files.endswith('"'):
        files = files[1:-1]
    file_list = files.split(', ')
    
    for pdf_file in file_list:
        pdf_path = os.path.join(pdf_folder, pdf_file.strip())
        subprocess.run([acrobat_path, "/n", "/t", pdf_path, printer_name])
        time.sleep(5)  # 5초 대기

    # 임시로 생성된 고객 정보 PDF 삭제
    os.remove(customer_pdf)

print("모든 작업이 완료되었습니다.")

=> 위 2번 코드에서 더 고도화 하여 프리프린트 예약서비스에 맞춘 파이썬 스크립트이다.

역시나 특정 폴더에 있는 CSV 파일을 읽어, 고객 정보를 기반으로 PDF 파일을 생성하고, 각 고객의 파일과 함께 지정된 프린터로 인쇄하는 작업을 수행한다. 여기선 컬러/흑백 조작 & 커스텀 고객정보 pdf생성도 가능함

 

먼저, pdf_folder, printer_name, acrobat_path, csv_file 경로를 설정하고, pandas를 사용해 CSV 파일(customers.csv)을 읽어온다. 각 행의 데이터를 순회하면서 고객의 ID, 사용자명, 사물함 번호, 사물함 비밀번호, 그리고 인쇄할 파일 목록과 컬러 모드(컬러 또는 흑백)를 가져온다.

이후, set_printer_color_mode 함수를 호출해 PowerShell을 사용하여 프린터의 컬러 모드를 설정한다.

그런 다음 create_customer_pdf 함수로 고객 정보를 포함한 임시 PDF 파일을 생성한다. 이 파일은 고객의 ID, 이름, 사물함 정보 등을 담고 있고,,,

생성된 PDF 파일과 함께, 고객이 인쇄할 파일 목록을 순차적으로 인쇄한다. 각 파일은 Adobe Acrobat을 통해 인쇄되며, 인쇄 후에는 5초 대기 시간을 둔다. 모든 파일을 인쇄한 후, 임시로 생성된 고객 정보 PDF 파일을 삭제한다. 이 작업을 CSV 파일의 모든 행에 대해 반복하여 수행하면서 작업을 마무리 하는 것

 

[결과]

=> 잘 출력되고 이젠 흑백/컬러 설정도 되는 것을 확인할 수 있다!

 

=> 현재는 서비스 운영을 위해 이렇게 윈도우 스케줄러 설정을 해두었고, 매일 새벽 1시 5분에 실행될 수 있게 하였다.

=> 스케줄러가 실행되고

=> 커스텀 주문 pdf출력후 해당 고객의 파일이 잘 출력되는 것을 확인할 수 있다!

 

4. EC2에서 주문 파일 생성 및 EC2파일을 로컬 폴더로 가져오는 방법

순서가 안맞긴 하지만 마지막으로 EC2에서 어떻게 자동화로 오늘의 주문 pdf를 모두 정리하고 csv파일로 주문표를 만드는 코드를 어떻게 크론탭으로 자동화 했는지,

어떻게 ec2에 있는 csv와 pdf파일을 자동화 스케줄러로 가져오는지 짧게 살펴보자

 

[EC2에서 주문 파일 생성]

=> 다음과 같이 py는 이미 작성해두었고 이를 실행하니 잘 진행되는 것을 확인할 수 있다.

=> crontab을 편집하여 규칙을 추가하고

=> 그 때에 맞게 정상적으로 주문 파일을 아카이빙 db로 이동시키고 주문표csv작성 및 pdf파일 이동이 이뤄진다.

 

이 크론탭 설정법도 이전 블로그 포스팅으로 정리해두었다. 필요한 경우 확인 바람

https://choiet.tistory.com/52

 

AWS EC2에서 주기적으로 Python 스크립트 실행하기(매우간단) - ec2 자동화 & ec2스케줄링 (crontab)

여는 글EC2에 배포한 프로젝트에서 파일을 주기적으로 삭제해야 한다거나, 주기적으로 이용자들에게 메일을 보내야한다거나,문자를 보내야한다거나...=> 이런 주기적으로 진행해야할 업무가 있

choiet.tistory.com

 

 

 

 

[EC2의 파일을 로컬 컴퓨터로 가져오기]

import subprocess

# SCP 명령어에 필요한 정보 설정
pem_key_path = r"C:\Users\Owner\Documents\My-Project\aws-preprint-service-key.pem"
ec2_ip = "비밀"
remote_folder_path = "/home/ubuntu/pre-print-service/media/files"
local_save_path = r"C:\Users\Owner\Downloads"

# SCP 명령어 구성
scp_command = [
    "scp",
    "-i", pem_key_path,
    "-r",
    f"ubuntu@{ec2_ip}:{remote_folder_path}",
    local_save_path
]

# SCP 명령어 실행
try:
    subprocess.run(scp_command, check=True)
    print("파일 다운로드가 완료되었습니다.")
except subprocess.CalledProcessError as e:
    print(f"SCP 명령 실행 중 오류가 발생했습니다: {e}")

=> 이제 우리의 ec2에서 주문파일csv와 주문 파일인 pdf파일들을 모두 가져와야한다.

=> SCP(Secure Copy Protocol)를 사용해 지정된 EC2 인스턴스의 원격 폴더에서 로컬 컴퓨터로 파일을 안전하게 다운하는 코드이다.

이전에 작성한 블로그 포스팅을 참고하자

https://choiet.tistory.com/54

 

preprint 예약 서비스 배포진행(RDS 연결 추가) & 결제테스트 & ec2->로컬로의 파일 이동 테스트

0728 문제인식결제기능 구현을 모두 완료하였기에, iamport를 통한 결제 서비스가 잘 진행이 되는지 테스트하기 위해서,,또한 ec2에 올라간 파일들을 특정 시간에 자동으로 로컬 컴퓨터로 이동시키

choiet.tistory.com

=> ec2->로컬로의 파일이동 테스트 부분을 참고하면 됨

 

=> 실행하면? 정상적으로 ec2에서 파일을 가져오고

 

=> 해당 폴더 경로에 잘 들어온 것을 확인할 수 있다.

 

=> 현재는 이렇게 윈도우 스케줄러 설명을 진행해서 매일 오전 1시에 자동 실행되게 설정해두었다.

 

 

마치는 글

정말 다 개발을 완료했다. 이제 개인정보 처리방침 및 환불, 결제 규정 및 다양한 운영에 필요한 문서들을 완성하고

최종 pg사 심사 및 카드사 계약만 완료하면 서비스 준비가 모두 마무리 된다.