Wednesday, July 27, 2022

Generate PDF Report from MySQL (table) via Flask Framework

Это пример того, как создать отчет в формате PDF из базы данных MySQL с помощью Python Flask. Будет создано веб-приложение, используя легкий веб-фреймворк Пайтон Flask. Мы будем генерировать PDF-файл на лету из базы данных MySQL в этом веб-приложении. Ссылка для скачивания будет предоставлена во внешнем интерфейсе или пользовательском интерфейсе, по которой конечные пользователи щелкнут и получат возможность сохранить сгенерированный файл PDF в соответствии с выбранным местом.

Мы собираемся использовать API fpdf для создания отчета в формате PDF. Поскольку мы не сохраняем этот PDF-отчет где-либо в физическом расположении сервера, мы отправим данные в объекте Response в виде вложения.

Отчеты в основном создаются в формате PDF, поскольку файл PDF является документом «только для чтения», который нельзя изменить, не оставив электронного следа, в то время как другие форматы, такие как изображение,слово,Excel и т.д.,можно легко изменить,

не оставив электронного следа.

Ниже Я старался как можно более детально описать файловую конфигурацию для правильной работы  Flask и Пайтон код app.py, db.py, main.py и положение download.html

Installation - Use pip to install flask-mysql : pip install flask-mysql ( in venv )

(.env) boris@boris-All-Series:~/flaskproject$ ls -CRl

.:

total 24

-rw-rw-r-- 1 boris boris   46 июл 27 14:01 app.py

-rw-rw-r-- 1 boris boris  304 июл 27 14:00 db.py

drwxrwxr-x 3 boris boris 4096 июл 27 13:43 download

-rw-rw-r-- 1 boris boris 1462 июл 27 14:09 main.py

drwxrwxr-x 2 boris boris 4096 июл 27 14:05 __pycache__

drwxrwxr-x 2 boris boris 4096 июл 27 13:55 templates

./download:

total 4

drwxrwxr-x 2 boris boris 4096 июл 27 14:10 report

./download/report:

total 4

-rw-rw-r-- 1 boris boris 1980 июл 27 14:10 employee_report.pdf

./__pycache__:

total 8

-rw-rw-r-- 1 boris boris 182 июл 27 14:02 app.cpython-38.pyc

-rw-rw-r-- 1 boris boris 409 июл 27 14:05 db.cpython-38.pyc

./templates:

total 4

-rw-rw-r-- 1 boris boris 199 июл 27 13:46 download.html

=====================================

(.env) boris@boris-All-Series:~/flaskproject/templates$ cat download.html

<!doctype html>

<title>Python Flask File Generate PDF Report from MySQL</title>

<h2>Generate PDF Report from MySQL</h2>

<p>

<a href="{{ url_for('.download_report') }}">Generate Pdf Report</a>

</p>

==============================
(.env) boris@boris-All-Series:~/flaskproject$ cat app.py

from flask import Flask

app = Flask(__name__)

=====================================

(.env) boris@boris-All-Series:~/flaskproject$ cat db.py

from app import app

from flaskext.mysql import MySQL

mysql = MySQL()

# MySQL configurations

app.config['MYSQL_DATABASE_USER'] = 'root'

app.config['MYSQL_DATABASE_PASSWORD'] = '*********'

app.config['MYSQL_DATABASE_DB'] = 'roytuts'

app.config['MYSQL_DATABASE_HOST'] = 'localhost'

mysql.init_app(app)

=================================

(.env) boris@boris-All-Series:~/flaskproject$ cat main.py

import pymysql

from app import app

from db import mysql

from flask import Flask, Response, render_template

from fpdf import FPDF


@app.route('/')

def upload_form():

return render_template('download.html')


@app.route('/download/report/pdf')

def download_report():

conn = None

cursor = None

try:

conn = mysql.connect()

cursor = conn.cursor(pymysql.cursors.DictCursor)

cursor.execute("SELECT emp_id, emp_first_name,  \

                    emp_last_name, emp_designation FROM employee")

result = cursor.fetchall()

pdf = FPDF()

pdf.add_page()

page_width = pdf.w - 2 * pdf.l_margin

pdf.set_font('Times','B',14.0) 

pdf.cell(page_width, 0.0, 'Employee Data', align='C')

pdf.ln(10)

pdf.set_font('Courier', '', 12)

col_width = page_width/4

pdf.ln(1)

        th = pdf.font_size

         for row in result:

pdf.cell(col_width, th, str(row['emp_id']), border=1)

pdf.cell(col_width, th, row['emp_first_name'], border=1)

pdf.cell(col_width, th, row['emp_last_name'], border=1)

pdf.cell(col_width, th, row['emp_designation'], border=1)

pdf.ln(th)

pdf.ln(10)

pdf.set_font('Times','',10.0) 

pdf.cell(page_width, 0.0, '- end of report -', align='C')

return Response(pdf.output(dest='S').encode('latin-1'), \

                        mimetype='application/pdf', \

                        headers={'Content-Disposition':'attachment;  \

                        filename=employee_report.pdf'})

except Exception as e:

print(e)

finally:

cursor.close() 

conn.close()

if __name__ == "__main__":

    app.run()

























Статус таблицы в MySQL Database
































No comments:

Post a Comment