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

Django pdf파일 페이지 계산하기(PyPDF2) & 마이페이지, 주문 상세 페이지 구현

by 지식을 쌓는 개구리 2023. 8. 5.

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 %}