gpt 도 배웠겠다...
배우니까 무지막지하게 써먹고 싶잖아!
현재 수료중인 '새싹 마케터 과정'에서 매주 금요일에 제출해야하는
식대영수증관련해서 자동화를 해보려한다.
1. 문제
- 매주 월~금 동안 매일 점심먹은 영수증을, 하나의 pdf로 변환하여 제출해야함
- 사진을 업로드 하기만 하면, 알아서 pdf로 만들어주었으면한다.
- 추가로 디벨롭할수 있다면,
구글 드라이브도 알아서 제출하고, 파일까지 첨부하면 좋겠다...
2. 과정
- 모바일로 하고싶었는데 안된다... 웹과 모바일 두가지 버전으로 각각 만들어야겠다.
-gpt는 pdf로 안만들어 준다 .ㅋㅋㅋㅋ 왜지.????
3. 해결(결과물)
- 웹🛜:
간단하게 파이썬코딩을통해 웹으로 프로그램을 만들었다.
replit을 이용해 배포함.
미친 gpt 나 왜 이거 이제했어???
코딩 왜케 잘해???
- 모바일📱
: gpt로 만들고 싶었으나
모바일로는 내 gpt만들기를 할수가 없네.
그래서 그냥 프롬프트만 공유하는 것으로!
# 최종결과물
https://4b9e25f1-f50f-4c0a-9eb5-d3b99e1fae94-00-3qtzio4m89dil.pike.replit.dev/
아래의 링크는 더이상 사용하지 않습니다.
https://4af4c443-b7dc-4e02-93b8-96bb7bf126a2-00-ssds25f8s1hi.worf.replit.dev/
# 최종결과물 코드
#최종코드
from flask import Flask, request, send_file,render_template_string
from PIL import Image
import img2pdf
import io
from datetime import datetime, timedelta
app = Flask(__name__)
# 방문자 수를 저장하는 전역 변수
visitor_count = 0
@app.route("/", methods=["GET", "POST"])
def upload_images():
global visitor_count
visitor_count += 1 # 방문자 수 증가
today_date = datetime.now().strftime("%Y년%m월%d일")
if request.method == "POST":
user_name = request.form.get("name", "홍길동")
uploaded_files = request.files.getlist("files")
if len(uploaded_files) > 5:
return "Maximum 5 files can be uploaded at a time."
image_streams = []
for uploaded_file in uploaded_files:
if uploaded_file.filename == '':
continue
#image = Image.open(uploaded_file.stream)
#image = image.convert("RGB")
#image = image.resize((1024, 768)) # 해상도 조정으로 속도 향상
#image_stream = io.BytesIO()
#image.save(image_stream, format="JPEG", quality=70) # 품질 조정
#image_stream.seek(0)
#image_streams.append(image_stream)
# 이미지 데이터를 빠르게 처리하기 위해 해상도와 품질을 낮춤
image = Image.open(uploaded_file.stream)
image.thumbnail((800, 600)) # 썸네일 생성으로 빠르게 해상도 조정
image_stream = io.BytesIO()
image.save(image_stream, format="JPEG", quality=50) # 품질을 더 낮춤
image_stream.seek(0)
image_streams.append(image_stream)
# 이미지 -> 하나의 PDF로 변환
pdf_stream = io.BytesIO()
pdf_stream.write(img2pdf.convert(image_streams))
pdf_stream.seek(0)
# 오늘 날짜 기준으로 4일 전 날짜 생성
today = datetime.now()
date_4_days_ago = today - timedelta(days=4)
formatted_date = f"{date_4_days_ago.strftime('%Y.%m.%d')}~{today.strftime('%m.%d')}_{user_name}"
return send_file(pdf_stream, download_name=f"{formatted_date}.pdf", as_attachment=True)
return render_template_string('''
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>웹용 영수증 PDF 변환</title>
</head>
<body>
<h1>새싹 마케터 3기_ 식대영수증 pdf변환기 😎😎</h1>
<h4>이름을 입력해주세요. 파일명에 저장돼요.</h4>
<h4>이미지 최대 5장 업로드할 수 있습니다.</h4>
<br>
<br>
<form method="post" enctype="multipart/form-data">
<div style="margin-bottom: 15px;">
<label for="name">이름 입력:</label><br>
<input type="text" name="name" id="name" placeholder="이름을 입력하세요 (선택)">
</div>
<div style="margin-bottom: 15px;">
<label for="files">파일 업로드:</label><br>
<input type="file" name="files" id="files" multiple required>
</div>
<div style="margin-bottom: 15px;">
<input type="submit" value="PDF로 변환하기" style="font-size: 18px; padding: 10px 20px; background-color: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer;">
</div>
</form>
<br>
<br>
<h4>📅오늘 날짜: {{ today_date }}</h4>
<h4>🚀오늘 하루 방문자 수: {{ visitor_count }}</h4>
</body>
</html>
''', visitor_count=visitor_count,today_date=today_date)
if __name__ == "__main__":
# Replit에서 외부에서 접근할 수 있도록 0.0.0.0으로 설정
app.run(debug=True, host="0.0.0.0", port=80)
그리고 아래는 과정이다.
처음엔 이렇게 허전하게 만들었다.
1. 최대 5장의 이미지 업로드와 변환버튼
2. 파일명에 이름을 넣고싶어서 이름을 받는 기능을 추가
3. 매니저님이 요청한 날짜와 이름을 붙여 파일명을 만들도록함.
4. 하다보니까 보기가 좀 안좋아서 깔끔하게 만들어줌.
(친절하게 사용설명적어주고, 버튼 컬러넣고,
버튼 크기 키우고, 세로로 보기좋게 나열함.)
5. 업로드 버튼은 기능과 이름이 일치하지않는것같아 'pdf로 변환'으로 변경하였다.
6. 오늘날짜와 오늘 방문자수를 찍어준다.
맘같아서는 방문자수 데이터도 담아서 유의미하게 뭔가 분석하고 싶었으나..ㅎ
로 접속해서, 배포해준다.
할때마다 켜야하는 불편함이 있지만..
이제 제일 간단하니까. (일전에 써봤다고..)
끝.
####잘돌아간다. 다만 모바일에선 안됨.
from flask import Flask, request, send_file
from PIL import Image
import img2pdf
import io
from datetime import datetime, timedelta
app = Flask(__name__)
@app.route("/", methods=["GET", "POST"])
def upload_images():
if request.method == "POST":
user_name = request.form.get("name", "홍길동")
uploaded_files = request.files.getlist("files")
if len(uploaded_files) > 5:
return "Maximum 5 files can be uploaded at a time."
image_streams = []
for uploaded_file in uploaded_files:
if uploaded_file.filename == '':
continue
image_stream = io.BytesIO(uploaded_file.read())
image_streams.append(image_stream)
# 이미지 -> 하나의 PDF로 변환
pdf_stream = io.BytesIO()
pdf_stream.write(img2pdf.convert(image_streams))
pdf_stream.seek(0)
# 오늘 날짜 기준으로 4일 전 날짜 생성
today = datetime.now()
date_4_days_ago = today - timedelta(days=4)
formatted_date = f"{date_4_days_ago.strftime('%Y.%m.%d')}~{today.strftime('%m.%d')}_{user_name}"
return send_file(pdf_stream, download_name=f"{formatted_date}.pdf", as_attachment=True)
return '''
<h1>이미지 최대 5장 업로드</h1>
<form method="post" enctype="multipart/form-data">
<div style="margin-bottom: 15px;">
<label for="name">이름 입력:</label><br>
<input type="text" name="name" id="name" placeholder="이름을 입력하세요 (선택)">
</div>
<div style="margin-bottom: 15px;">
<label for="files">파일 업로드:</label><br>
<input type="file" name="files" id="files" multiple required>
</div>
<div>
<input type="submit" value="업로드" style="font-size: 18px; padding: 10px 20px; background-color: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer;">
</div>
</form>
'''
if __name__ == "__main__":
#app.run(debug=True) ###요건 웹(컴터)에서 가능
# Replit에서 외부에서 접근할 수 있도록 0.0.0.0으로 설정
app.run(debug=True, host="0.0.0.0", port=80)
댓글