From 0c6098a011ba9eb50f9abc5053fa34515f828ed3 Mon Sep 17 00:00:00 2001 From: Nico Melone Date: Wed, 22 Jan 2025 16:11:17 -0600 Subject: [PATCH] adjusted graph to be svg --- app.py | 36 ++++++++++++++++++++++---------- requirements.txt | 3 ++- static/css/styles.css | 36 ++++++++++++++++++++++++++++++++ static/graph.png | Bin 0 -> 18909 bytes static/graph.svg | 1 + templates/base.html | 12 +++++++++++ templates/report.html | 47 +++++++++++++++++++++--------------------- 7 files changed, 100 insertions(+), 35 deletions(-) create mode 100644 static/css/styles.css create mode 100644 static/graph.png create mode 100644 static/graph.svg create mode 100644 templates/base.html diff --git a/app.py b/app.py index 5d0b32a..1ad5c28 100644 --- a/app.py +++ b/app.py @@ -1,4 +1,5 @@ -import requests +import requests, os +import plotly.graph_objects as go from flask import Flask, render_template, jsonify, make_response from weasyprint import HTML @@ -6,15 +7,17 @@ app = Flask(__name__) @app.route('/report') def report(): - # Prepare graph data - graph_data = [ - { - 'x': [1, 2, 3], - 'y': [10, 20, 30], - 'type': 'scatter' - } - ] - return render_template('report.html', graph_data=jsonify(graph_data)) + # Create Plotly graph + fig = go.Figure(data=[go.Scatter(x=[1, 2, 3], y=[10, 20, 30], mode='lines')]) + # Save the graph as an image + image_path = os.path.join('static', 'graph.svg') + + fig.write_image(image_path) + return render_template('report.html', graph_image=image_path) + +@app.route('/') +def home(): + return render_template('base.html') def get_data(): response = requests.get('https://api.example.com/data') @@ -22,8 +25,19 @@ def get_data(): @app.route('/download-pdf') def download_pdf(): - html = render_template('report.html') + # Create Plotly graph + fig = go.Figure(data=[go.Scatter(x=[1, 2, 3], y=[10, 20, 30], mode='lines')]) + + # Save the graph as an image + this_folder = os.path.dirname(os.path.abspath(__file__)) + image_path = os.path.join(this_folder, 'static', 'graph.svg') + fig.write_image(image_path) + + # Render the HTML template with the graph image + html = render_template('report.html', graph_image="file://" + image_path) + print(html) pdf = HTML(string=html).write_pdf() + response = make_response(pdf) response.headers['Content-Type'] = 'application/pdf' response.headers['Content-Disposition'] = 'inline; filename=report.pdf' diff --git a/requirements.txt b/requirements.txt index 3744fe6..ca2a054 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ flask requests weasyprint -plotly \ No newline at end of file +plotly +kaleido \ No newline at end of file diff --git a/static/css/styles.css b/static/css/styles.css new file mode 100644 index 0000000..a36931d --- /dev/null +++ b/static/css/styles.css @@ -0,0 +1,36 @@ +@page { + size: Letter; + margin: 1in; +} + +body { + font-family: Arial, sans-serif; + margin: 0; + padding: 0; +} + +table { + width: 100%; + border-collapse: collapse; +} + +th, td { + border: 1px solid #ddd; + padding: 8px; + text-align: left; +} + +th { + background-color: #f4f4f4; +} + +.graph-container { + width: 100%; + max-height: 400px; + overflow: hidden; + margin-bottom: 20px; +} + +.page-break { + page-break-before: always; +} \ No newline at end of file diff --git a/static/graph.png b/static/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..a032588f86ec189c3c86cf90f0fb3086b4920628 GIT binary patch literal 18909 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 literal 0 HcmV?d00001 diff --git a/static/graph.svg b/static/graph.svg new file mode 100644 index 0000000..6114cf6 --- /dev/null +++ b/static/graph.svg @@ -0,0 +1 @@ +11.522.531015202530 \ No newline at end of file diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..c6a2238 --- /dev/null +++ b/templates/base.html @@ -0,0 +1,12 @@ + + + + + + Report + + + + {% block content %}{% endblock %} + + diff --git a/templates/report.html b/templates/report.html index 6ceaf04..aec79fc 100644 --- a/templates/report.html +++ b/templates/report.html @@ -1,29 +1,30 @@ -
- - +{% extends "base.html" %} +{% block content %} +

Report

+ {{ graph_image }} + + - - +
+ - - + + - - + + {% for row in table_data %} - - - - + + + + {% endfor %} - -
Header 1Header 2Header 1Header 2
{{ row[0] }}{{ row[1] }}
{{ row[0] }}{{ row[1] }}
+ + -
- - - -
\ No newline at end of file +
+ + + +
+ {% endblock %}