반응형

목차

  1. 기능
  2. 소스코드
  3. 오류
  4. 남은 부분

기능

1. My Page에서 구매한 책을 다운로드할 수 있도록 기능을 추가하였습니다.

내용도 추가하려 했으나 코드 구현의 한계 및 오류로 제목만 출력되게 일단은 만들었습니다.

 

2. 디자인 수정

삐뚤삐뚤했던 부분들을 균일하게 수정하였고, 영어이던 부분은 되도록 한글화 진행하였습니다.


소스코드

1. PDF 다운로드

from flask import Flask, flash, render_template, request, redirect, url_for, session, Response
from flask_mysqldb import MySQL
from flask_paginate import Pagination
import MySQLdb.cursors
import re
import random
from datetime import datetime
from statistics import mean
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import inch
from reportlab.pdfgen import canvas
from io import BytesIO
from urllib.parse import quote
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from os.path import join, dirname

@app.route('/download_pdf')
def download_pdf():
    books = request.args.getlist('book')
   
    buffer = BytesIO()
    p = canvas.Canvas(buffer, pagesize=letter)

    font_path = join(dirname(__file__), 'static', 'fonts', 'NanumGothic.ttf')
    pdfmetrics.registerFont(TTFont('NanumGothic', font_path))
   
    # PDF 안 제목
    p.setFont("NanumGothic", 16)
    p.drawString(2.75 * inch, 10.5 * inch, books[0])
       
    # PDF 파일 저장 및 파일 이름 설정
    p.showPage()
    p.save()
    buffer.seek(0)
    filename = f"{books[0]}.pdf"
    quoted_filename = quote(filename)  # 파일 이름 URL 인코딩
    return Response(buffer, mimetype='application/pdf', headers={
        'Content-Disposition': f'attachment; filename={quoted_filename}; filename*=UTF-8\'\'{quoted_filename}'  # Content-Disposition Header에 filename* 속성 추가
    })

 

2. 회원 정보 수정 CSS 추가

/* center the content in the main div */
main {
    display: flex;
    justify-content: center;
  }
.content {
  display: flex;
  justify-content: center;
  background-color: #ffffff;
  padding: 10px;
  font-size: 23px;
}
 /* style for the contentbar */
    .contentbar input[type="password"],
    .contentbar input[type="text"],
    .contentbar input[type="email"],
    .contentbar input[type="date"],
    .contentbar input[type="tel"] {
  width: 50%;
}
.contentbar {
  justify-content: center;
  align-items: center;
  background-color: #ffffff;
  padding: 20px;
  border: 1px solid #ccc;
  border-radius: 5px;
  width: 600px;
  margin-top: 50px;
  margin-bottom: 50px;
}
 
  /* style for the form inputs */
  label {
    display: block;
    margin-bottom: 5px;
    font-weight: bold;
  }
 
  input[type="text"],
  input[type="password"],
  input[type="email"],
  select,
  input[type="date"],
  input[type="tel"] {
    padding: 5px;
    margin-bottom: 10px;
    width: 100%;
    border: 1px solid #ccc;
    border-radius: 3px;
    box-sizing: border-box;
  }
  select {
    width: 50%;
  }
  /* style for the submit button */
  input[type="submit"] {
    background-color: rgb(55, 0, 255);
    color: white;
    padding: 10px 20px;
    border: none;
    border-radius: 5px;
    cursor: pointer;
    font-size: 16px;
  }
 
  input[type="submit"]:hover {
    background-color: rgb(55, 0, 255);
  } 

오류

1. PDF 다운로드 시 폰트가 없어서 내려받기 실패 오류 발생

  > 해당 프로젝트 폴더에 폰트 폴더 생성 및 나눔 고딕 폰트를 넣어 놓고 해당 폰트로 내려받기 실행 (해결)

 

2. 이전에 댓글을 남기면 오류가 발생하던 오류

  > MySQL 테이블에 자동 생성부분을 체크 하지않아 값이 생성되지 않았습니다. 때문에 댓글을 추가할 때만 오류가 발생했었고, 현재는 해결되었습니다.

 

이 외에는 CSS 수정이 주를 이뤄서 오류가 크게 없었습니다.


남은 부분

- 발표 PPT 제작

- 기타 소소한 부분 수정

반응형