CLIEN

본문 바로가기 메뉴 바로가기 보기설정 테마설정
톺아보기 공감글
커뮤니티 커뮤니티전체 C 모두의광장 F 모두의공원 I 사진게시판 Q 아무거나질문 D 정보와자료 N 새로운소식 T 유용한사이트 P 자료실 E 강좌/사용기 L 팁과강좌 U 사용기 · 체험단사용기 W 사고팔고 J 알뜰구매 S 회원중고장터 B 직접홍보 · 보험상담실 H 클리앙홈
소모임 소모임전체 ·굴러간당 ·주식한당 ·아이포니앙 ·MaClien ·방탄소년당 ·일본산당 ·개발한당 ·소시당 ·자전거당 ·이륜차당 ·AI당 ·패스오브엑자일당 ·안드로메당 ·바다건너당 ·나스당 ·클다방 ·곰돌이당 ·가상화폐당 ·키보드당 ·리눅서당 ·사과시계당 ·소셜게임한당 ·물고기당 ·전기자전거당 ·골프당 ·노젓는당 ·걸그룹당 ·콘솔한당 ·노키앙 ·윈폰이당 ·축구당 ·여행을떠난당 ·디아블로당 ·찰칵찍당 ·3D메이킹 ·X세대당 ·ADHD당 ·AI그림당 ·날아간당 ·육아당 ·배드민턴당 ·야구당 ·농구당 ·블랙베리당 ·비어있당 ·FM당구당 ·블록체인당 ·보드게임당 ·활자중독당 ·볼링친당 ·캠핑간당 ·냐옹이당 ·문명하셨당 ·클래시앙 ·요리한당 ·쿠키런당 ·대구당 ·DANGER당 ·뚝딱뚝당 ·개판이당 ·동숲한당 ·날아올랑 ·e북본당 ·갖고다닌당 ·이브한당 ·패셔니앙 ·도시어부당 ·FM한당 ·맛있겠당 ·포뮬러당 ·젬워한당 ·안경쓴당 ·차턴당 ·총쏜당 ·땀흘린당 ·하스스톤한당 ·히어로즈한당 ·인스타한당 ·IoT당 ·KARA당 ·꼬들한당 ·덕질한당 ·어학당 ·가죽당 ·레고당 ·LOLien ·Mabinogien ·임시소모임 ·미드당 ·밀리터리당 ·땅판당 ·헌팅한당 ·오른당 ·영화본당 ·MTG한당 ·소리당 ·적는당 ·방송한당 ·PC튜닝한당 ·그림그린당 ·소풍간당 ·심는당 ·라즈베리파이당 ·품앱이당 ·리듬탄당 ·달린당 ·Sea마당 ·SimSim하당 ·심야식당 ·윈태블릿당 ·미끄러진당 ·나혼자산당 ·스타한당 ·스팀한당 ·파도탄당 ·퐁당퐁당 ·테니스친당 ·테스트당 ·빨콩이당 ·공대시계당 ·터치패드당 ·트윗당 ·창업한당 ·VR당 ·시계찬당 ·WebOs당 ·위스키당 ·와인마신당 ·WOW당
임시소모임
고객지원
  • 게시물 삭제 요청
  • 불법촬영물등 신고
  • 쪽지 신고
  • 닉네임 신고
  • 제보 및 기타 제안
© CLIEN.NET
공지[점검] 잠시후 서비스 점검을 위해 약 30분간 접속이 차단됩니다. (금일 18:15 ~ 18:45)

팁과강좌

PC/모바일 이미지->PDF 변환 텔레그램 봇 만들기 4

2
2023-05-18 22:33:00 수정일 : 2023-05-19 03:13:23 125.♡.34.61
Drimp






LINK

<작동 예시>


Chat GPT-3의 도움으로 만들어 봤습니다.


모바일 텔레그램으로 봇이 있는 채팅방에 이미지 파일들을 보내면 PDF로 합쳐서 다시 보내줍니다.


남들이 만든게 없기도 하고(못 찾았습니다 ㅠㅜ), 보안의 이유도 있어서 직접 만들어봤습니다.

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

    # 합쳐진 PDF 파일 삭제

    merged_pdf.close()

    os.remove(merged_pdf_file)  <- 이 코드가 없으면 텔레그램 봇이 작업한 합쳐진 PDF파일이 작업한 컴퓨터에 남아있게 됩니다. 사용자는 알 수가 없으니 귀중한 정보를 상납하게 되는 꼴...

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



파이썬 설치방법이나 실행방법, 독립 실행파일로 만드는 방법 등은 이미 찾으면 많기 때문에 따로 적지는 않겠습니다.


저는 실행파일 만들어서 안쓰는 컴퓨터에 실행시켜놨어요.


쓸데없는 코드도 있는데, 귀찮아서 정리는 안했습니다.

뭐 키울 프로젝트도 아니고 해서..ㅎㅎ


파이썬은 들여쓰기가 중요하니까 뭐 건들지 마시고 요대로 복사해서 붙여넣기 후 사용하시면 될거에요.

이미지 한 10장까지는 테스트 해봤는데, 그 이상은 안해봤습니다.

애초에 가볍게 쓰기 위한 목적이에요.


써 놓고 보니 이게 팁과 강좌 카테고리가 맞나 고민이네요..?

딱히 강좌랄게 없고 코드만 나열한거라서...


일단 코드는 이렇고 

TOKEN = '123456789:sdSNDFK33jfoeRRjkEKNGORE'

위 부분은 자신의 텔레그램 봇 토큰을 넣는 자리입니다.



import os

import telebot

from fpdf import FPDF

from datetime import datetime

import threading

import time

from PIL import Image

from PyPDF2 import PdfMerger


# 텔레그램 봇 토큰 설정

TOKEN = '123456789:sdSNDFK33jfoeRRjkEKNGORE'


# 텔레그램 봇 인스턴스 생성

bot = telebot.TeleBot(TOKEN)


# 변환된 PDF 파일들을 저장할 리스트

pdf_files = []


# 이미지 처리 중인지 나타내는 플래그

processing_image = False


# PDF 파일을 합치는 동안 사용할 락

merge_lock = threading.Lock()


# 전체 이미지 개수를 저장할 변수

total_image_count = 0


@bot.message_handler(content_types=['photo'])

def handle_photos(message):

    global chatID

    global total_image_count

    chatID = message.chat.id

    # 이미지 파일을 받았을 때 처리하는 함수

    file_id = message.photo[-1].file_id

    file_info = bot.get_file(file_id)

    file_path = file_info.file_path

    total_image_count+=1

    # 이미지 처리 중인 경우 대기

    while not merge_lock.acquire(blocking=False):

        time.sleep(0.5)


    # 이미지 처리 함수 호출

    process_image(message, file_path)


    # Lock 해제

    merge_lock.release()


    # 이미지 처리가 모두 완료된 후 PDF 합치고 보내기

    if not processing_image and len(pdf_files) == total_image_count:

        send_pdf(message)






# 이미지를 받아 처리하는 동작을 수행하는 함수

def process_image(message, file_path):

    global processing_image

    global chatID

    # 이미지 파일을 받았을 때 처리하는 함수

    file_extension = os.path.splitext(file_path)[-1].lower()


    if file_extension in ['.jpg', '.jpeg', '.png']:

        # 이미지 파일을 다운로드하고 PDF로 변환

        downloaded_file = bot.download_file(file_path)


        # 이미지 파일 이름 설정 (타임스탬프 형식)

        timestamp = datetime.now().strftime("%Y%m%d%H%M%S")

        image_file = f"image_{message.id}.jpg"

        pdf_file = f"image_{message.id}.pdf"


        with open(image_file, 'wb') as f:

            f.write(downloaded_file)


        # "처리 중" 메시지 전송

        bot.send_message(message.chat.id, "이미지 처리 중...")


        # 이미지 처리 중 플래그 설정

        processing_image = True


        image = Image.open(image_file)

        image_width, image_height = image.size

    



        pdf = FPDF()

        pdf.add_page()


        # 이미지 크기 조정

        pdf_width = 210  # A4 용지 가로 길이 (mm)

        pdf_height = 297  # A4 용지 세로 길이 (mm)


        image_ratio = image_width / image_height

        pdf_ratio = pdf_width / pdf_height

        # 이미지 크기 조정

        if image_ratio > pdf_ratio:

            # 이미지의 가로 비율이 더 클 경우

            adjusted_width = pdf_width

            adjusted_height = adjusted_width / image_ratio

            y_position = (pdf_height - adjusted_height) / 2  # 세로 가운데 정렬

            pdf.image(image_file, x=0, y=y_position, w=adjusted_width, h=adjusted_height)

        else:

            # 이미지의 세로 비율이 더 클 경우 또는 가로와 세로 비율이 같은 경우

            adjusted_height = pdf_height

            adjusted_width = adjusted_height * image_ratio

            x_position = (pdf_width - adjusted_width) / 2  # 가로 가운데 정렬

            pdf.image(image_file, x=x_position, y=0, w=adjusted_width, h=adjusted_height)


        # PDF 파일 저장

        pdf.output(pdf_file, 'F')


        # 임시 이미지 파일 삭제

        image.close()

        os.remove(image_file)


        # PDF 파일 리스트에 추가

        pdf_files.append(pdf_file)


        # 처리 완료 메시지 전송

        bot.send_message(chatID, "이미지 처리가 완료되었습니다.")


        # 이미지 처리 중 플래그 해제

        processing_image = False



def send_pdf(message):

    global chatID

    # PDF 파일들을 합쳐서 보내는 함수

    

    global total_image_count

    # 전체 PDF 파일 생성

    merged_pdf = PdfMerger()

    #print(pdf_files)

    sorted_pdf_files = sorted(pdf_files)

    #print(sorted_pdf_files)

    for pdf_file in sorted_pdf_files:

        merged_pdf.append(pdf_file)


    # 합쳐진 PDF 파일 저장

    timestamp = datetime.now().strftime("%Y%m%d%H%M%S")

    merged_pdf_file = f'merged_pdf_{timestamp}.pdf'

    merged_pdf.write(merged_pdf_file)


    # 합쳐진 PDF 파일 전송

    with open(merged_pdf_file, 'rb') as f:

        bot.send_document(chatID, f)


    # 합쳐진 PDF 파일 삭제

    merged_pdf.close()

    os.remove(merged_pdf_file)

    cleanup_pdf_files()


    pdf_files.clear()

    

    total_image_count = 0


def cleanup_pdf_files():

    # PDF 파일들을 삭제하는 함수

    for pdf_file in pdf_files:

        os.remove(pdf_file)

    # PDF 파일 리스트 초기화


# 텔레그램 봇 시작

bot.polling()


L


Drimp 님의 게시글 댓글
  • 주소복사
  • Facebook
  • X(Twitter)
댓글 • [4]
storyofthecourt
IP 112.♡.169.186
05-19 2023-05-19 02:04:41
·
귀중한 자료인데 제가 받아들이기에는 어렵군요. 찬찬히 보겠습니다. 항상 이런 프로그램 있었으면 좋겠다고 생각했는데 감사합니다.
Drimp
IP 125.♡.34.61
05-19 2023-05-19 03:13:09
·
@storyofthecourt님
1. 파이썬 설치 방법
2. 코드 에디터 설치 방법 (비주얼 스튜디오 코드)
3. pip install 명령어로 모듈들 설치하는 방법
4. 텔레그램 봇 토큰 발행방법
등등

필요한 배경지식들을 나열하다보니 준비해야 할게 생각보다 많네요 ㄷㄷ...
근데 또 하나씩 찾아보다 보면 재미도 있고 금방 합니다 ㅎㅎ
저처럼 깊이 없이 가볍게 접근하면 뒤돌아서면 잊어버리지만 그래도 이런것도 만들 수 있더라구요.
삭제 되었습니다.
lacsonluxur
IP 121.♡.173.82
05-19 2023-05-19 20:57:47
·
혹시 반대로 pdf 를 jpg 로 변경하는 봇은...ㅎ

이런건 docker 로 만드는 어려울까요?
Drimp
IP 125.♡.34.61
05-19 2023-05-19 22:08:25
·
@MochaLatte님 도커에 대해서는 들어만 보긴 했는데, 파이썬 스크립트 만들고 도커이미지로 만든 다음 실행하면 되는거 아닐까요..?

PDF를 jpg로 변경하는 스크립트를 만드는게 우선이겠지만요.

1. 봇한테 PDF를 보낸다
2. 봇이 PDF의 정보를 읽는다 - 몇 장인지 파악
3. 파이썬 모듈을 이용해서 파일명을 순차적으로 증가시키면서 PDF 장수만큼 매 페이지마다 A4 크기의 이미지로 뽑아낸다.
4. zip으로 만들어서 다시 보내던가, 파일명 순차대로 텔레그램으로 다시 보낸다.

정도 되려나요?
새로운 댓글이 없습니다.
이미지 최대 업로드 용량 15 MB / 업로드 가능 확장자 jpg,gif,png,jpeg,webp
지나치게 큰 이미지의 크기는 조정될 수 있습니다.
목록으로
글쓰기
글쓰기
목록으로 댓글보기 이전글 다음글
아이디  ·  비밀번호 찾기 회원가입
이용규칙 운영알림판 운영소통 재검토요청 도움말 버그신고
개인정보처리방침 이용약관 책임의 한계와 법적고지 청소년 보호정책
©   •  CLIEN.NET
보안 강화를 위한 이메일 인증
안전한 서비스 이용을 위해 이메일 인증을 완료해 주세요. 현재 회원님은 이메일 인증이 완료되지 않은 상태입니다.
최근 급증하는 해킹 및 도용 시도로부터 계정을 보호하기 위해 인증 절차가 강화되었습니다.

  • 이메일 미인증 시 글쓰기, 댓글 작성 등 게시판 활동이 제한됩니다.
  • 이후 새로운 기기에서 로그인할 때마다 반드시 이메일 인증을 거쳐야 합니다.
  • 2단계 인증 사용 회원도 최초 1회는 반드시 인증하여야 합니다.
  • 개인정보에서도 이메일 인증을 할 수 있습니다.
지금 이메일 인증하기
등록된 이메일 주소를 확인하고 인증번호를 입력하여
인증을 완료해 주세요.