2023 pre-print 개발일지
8/5
PyPDF2 라이브러리를 사용하여 pdf파일 page계산하기
한글파일과 워드파일의 경우는 페이지 수 계산하는 방법이 나와있지 않거나 까다로운 반면
pdf파일의 페이지 수는 PyPDF2 라이브러리와 장고 내부 모듈을 통해 쉽게 계산할 수 있다.
1) PyPDF2와 장고 모듈 import
import PyPDF2
from django.core.files.uploadedfile import InMemoryUploadedFile
=> 이와 같이 pdf파일 페이지 계산에 필요한 라이브러리를 추가해 준다.
2) pdf페이지 계산
if isinstance(file, InMemoryUploadedFile):
pdf = PyPDF2.PdfReader(file)
pages = len(pdf.pages)
=> 위와 같이 작성하면 해당 pdf파일의 페이지 수를 파악할 수 있다.
현재 진행 중인 pre-print 프로젝트에 적용
현재 개발 중인 pre-print 프로젝트에서 이용자가 주문 완료를 했을 때 order테이블에 주문 정보를
입력할 때 order_price의 값을 그냥 기본 값인 200원을 계속 넣어 주었다.
이제는 pdf 파일의 페이지 수당 100원씩 계산하여 정상적인 데이터를 테이블에 저장해 보자
total_pages = 0
for file in files:
if isinstance(file, InMemoryUploadedFile):
pdf = PyPDF2.PdfReader(file)
total_pages += len(pdf.pages)
order_price = total_pages * 100
order = Order.objects.create(order_user=req.user, order_price=order_price, order_pw=pw, order_color=color)
=> 이와 같이 하나의 파일 혹은 여러 파일이 올라왔을 때 전체 페이지 수를 모두 구한 다음
그 페이지 수의 100을 곱하여 해당 주문의 가격으로 저장해 주었다.
=> 테스트 삼아 2개의 파일(각각 2장, 1장)을 올려본 결과 이제껏 200으로 입력된 데이터들과 달리
정상적으로 파일 페이지에 따른 결제가격이 입력된 것을 확인할 수 있다.
추가) 마이페이지, 주문 상세페이지 구현
def print_mypage(req):
if not req.user.is_authenticated:
return redirect('accounts:login')
context = {
'user': req.user
}
return render(req, 'preprint/mypage.html', context)
def print_payment_detail(req):
if not req.user.is_authenticated:
return redirect('accounts:login')
orders = Order.objects.filter(order_user=req.user).order_by('-order_date')
orders_with_files = []
for order in orders:
order_files = OrderFile.objects.filter(order=order)
orders_with_files.append({
'order': order,
'files': order_files,
})
context = {
'orders_with_files': orders_with_files,
}
return render(req, 'preprint/payment_detail.html', context
=> 이와 같이 로그인된 해당 유저를 context로 넘겨 아래와 같은 로그인 페이지를 구현하였다.
{% extends 'base.html' %}
{% block title %}로그인{% endblock %}
{% block content %}
<h1>마이페이지</h1>
<div>
<h3>고객 번호: {{ user.id }}</h3>
<h3>이름: {{ user.username }}</h3>
<h3>이메일: {{ user.email }}</h3>
<h3>전화번호: {{ user.phone }}</h3>
</div>
{% endblock %}
=> 주문 상세페이지는 해당 유저의 주문 파일 묶음을 context로 넘겨주고 해당 주문번호로 파일들이 묶여 나올 수 있도록 하였다.
{% extends 'base.html' %}
{% block title %}로그인{% endblock %}
{% block content %}
<div class="container">
<h1>결제 내역</h1>
{% for order_with_files in orders_with_files %}
<div class="order-div">
<h3>주문 번호: {{ order_with_files.order.id }}</h3>
<p>주문 날짜: {{ order_with_files.order.order_date }}</p>
<p>가격: {{ order_with_files.order.order_price }}</p>
<p>색상: {{ order_with_files.order.order_color }}</p>
<p>PW: {{ order_with_files.order.order_pw }}</p>
<h4>파일:</h4>
<ul>
{% for file in order_with_files.files %}
<li><a href="{{ file.file.url }}">{{ file.file.name }}</a></li>
{% endfor %}
</ul>
</div>
{% endfor %}
</div>
{% endblock %}
'Project > pre-print-project' 카테고리의 다른 글
pre-print 프론트 작업 1, 2차 ( Django 템플릿 언어 & html 상속 사용) (0) | 2023.08.11 |
---|---|
Django 프로젝트 작업 스케줄러로 모델 데이터 삭제하기 (0) | 2023.08.06 |
Django 장고 .gitignore 설정 & 민감한 정보 분리 & 깃허브 재개설 (0) | 2023.08.03 |
Django 장고 form사용 및 user모델 생성, 로그인+로그아웃 & 회원가입 기능 구현 (0) | 2023.08.02 |
장고 media설정 & 파일 업로드, 다운로드 기능 구현 + ERD, 모델 수정 (0) | 2023.07.27 |