diff --git a/main.py b/main.py index 0669d7f..956e02c 100644 --- a/main.py +++ b/main.py @@ -1,38 +1,54 @@ +import pdfkit from jinja2 import Environment, FileSystemLoader -from weasyprint import HTML -import matplotlib.pyplot as plt -import os -# 1. Generate a chart with matplotlib -os.makedirs("static/charts", exist_ok=True) -chart_path = "static/charts/resp_chart.png" +env = Environment(loader=FileSystemLoader("report_gen")) -plt.plot([1, 2, 3, 4], [1, 4, 2, 5], label="Breath Volume") -plt.legend() -plt.title("Respiratory Chart") -plt.savefig(chart_path) -plt.close() +# Define templates and their unique contexts +pages = [ + ("page_1.html", {"name": "John Doe", "surname": "Moran", "date": "July 29, 2025"}), + ("page_2.html", {"content": "This is page 2 content"}), +] -# 2. Patient data (this would usually come from your DB) -patient_data = { - "name": "Keirstyn Moran", - "age": 34, - "height": 163, - "weight": 56 +# Render each template with its own context +html_pages = [] +for tpl, ctx in pages: + template = env.get_template(tpl) + html_pages.append(template.render(ctx)) + +# Combine with page breaks +final_html = "
".join(html_pages) + +# Wrap in full HTML document +html_doc = f""" + + + + + + + + + {final_html} + + +""" + +print(html_doc) +# Generate PDF +options = { + "page-size": "A4", + "encoding": "UTF-8", + "margin-top": "0mm", + "margin-bottom": "0mm", + "margin-left": "0mm", + "margin-right": "0mm", + "no-outline": None, } +pdfkit.from_string(html_doc, "multi_page_report.pdf", options=options) -context = { - "patient": patient_data, - "indications": "No Respiratory Capacity Limitation", - "chart_path": chart_path -} - -# 3. Render Jinja2 template -env = Environment(loader=FileSystemLoader("templates")) -template = env.get_template("report.html") -html_out = template.render(context) - -# 4. Generate PDF -HTML(string=html_out, base_url=".").write_pdf("lung_report.pdf") - -print("✅ Report generated: lung_report.pdf") \ No newline at end of file +print("✅ PDF generated: multi_page_report.pdf") diff --git a/multi_page_report.pdf b/multi_page_report.pdf new file mode 100644 index 0000000..b66ad50 Binary files /dev/null and b/multi_page_report.pdf differ diff --git a/notebook.ipynb b/notebook.ipynb index 7127967..afa9f57 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 10, + "execution_count": 1, "id": "63f43af5", "metadata": {}, "outputs": [], @@ -15,7 +15,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 2, "id": "b0ee2af1", "metadata": {}, "outputs": [ @@ -31,7 +31,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_71494/3054964805.py:3: FutureWarning: errors='ignore' is deprecated and will raise in a future version. Use to_numeric without passing `errors` and catch exceptions explicitly instead\n", + "/tmp/ipykernel_225163/3054964805.py:3: FutureWarning: errors='ignore' is deprecated and will raise in a future version. Use to_numeric without passing `errors` and catch exceptions explicitly instead\n", " df = df.apply(pd.to_numeric, errors='ignore')\n" ] } @@ -61,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "id": "fbd292c3", "metadata": {}, "outputs": [ @@ -69,7 +69,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "15.634193703216638\n" + "22.369999999999997\n" ] } ], @@ -79,7 +79,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 4, "id": "ef8bc7ac", "metadata": {}, "outputs": [ @@ -138,7 +138,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 5, "id": "06244aa2", "metadata": {}, "outputs": [ @@ -252,7 +252,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 6, "id": "8a1878a0", "metadata": {}, "outputs": [ @@ -327,7 +327,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 7, "id": "7361fb05", "metadata": {}, "outputs": [ @@ -383,7 +383,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 8, "id": "c89478ff", "metadata": {}, "outputs": [ @@ -441,7 +441,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 22, "id": "1db16040", "metadata": {}, "outputs": [ @@ -509,6 +509,575 @@ "\n", "plt.show()" ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "52642f49", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "| \n", + " | MeasurementDate | \n", + "Comment | \n", + "ExternalDeviceId | \n", + "ExternalPatientId | \n", + "FirstName | \n", + "LastName | \n", + "BirthDate | \n", + "Age | \n", + "Ethnicity | \n", + "Gender | \n", + "... | \n", + "Child_XC | \n", + "Child_XC_Unit | \n", + "Child_BIVA_ZRh | \n", + "Child_BIVA_ZXcH | \n", + "Child_PhA | \n", + "Child_PhA_Unit | \n", + "Child_REE_Kcal | \n", + "Child_REE_MJ | \n", + "Child_TEE_Kcal | \n", + "Child_TEE_MJ | \n", + "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", + "2025-09-05T14:56:27.0000000Z | \n", + "NaN | \n", + "10000001583275_0055003f5631501320313557 | \n", + "LD5163301170 | \n", + "Lucy | \n", + "Dibenedetto | \n", + "1997-08-28T00:00:00.0000000Z | \n", + "28 | \n", + "Caucasian | \n", + "Female | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 1 | \n", + "2025-09-03T13:16:22.0000000Z | \n", + "NaN | \n", + "10000001583275_0055003f5631501320313557 | \n", + "NS6479273340 | \n", + "Niyanta | \n", + "Shah | \n", + "1985-03-11T00:00:00.0000000Z | \n", + "40 | \n", + "Other | \n", + "Female | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 2 | \n", + "2025-09-03T13:14:23.0000000Z | \n", + "NaN | \n", + "10000001583275_0055003f5631501320313557 | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "1985-03-11T00:00:00.0000000Z | \n", + "40 | \n", + "NaN | \n", + "NaN | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 3 | \n", + "2025-08-27T20:57:32.0000000Z | \n", + "NaN | \n", + "10000001583275_0055003f5631501320313557 | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "1996-04-05T00:00:00.0000000Z | \n", + "29 | \n", + "NaN | \n", + "NaN | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 4 | \n", + "2025-08-20T14:01:13.0000000Z | \n", + "NaN | \n", + "10000001583275_0055003f5631501320313557 | \n", + "MW4167267833 | \n", + "Monica | \n", + "Wong | \n", + "1985-02-17T00:00:00.0000000Z | \n", + "40 | \n", + "Asian | \n", + "Female | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| ... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "
| 58 | \n", + "2025-04-10T14:10:28.0000000Z | \n", + "NaN | \n", + "10000001583275_0055003f5631501320313557 | \n", + "6473915195 | \n", + "Tristan | \n", + "Walsh | \n", + "1995-12-01T00:00:00.0000000Z | \n", + "29 | \n", + "Caucasian | \n", + "Female | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 59 | \n", + "2025-04-02T21:19:51.0000000Z | \n", + "NaN | \n", + "10000001583275_0055003f5631501320313557 | \n", + "WSC4168020667 | \n", + "Scott | \n", + "Christie | \n", + "1968-08-19T00:00:00.0000000Z | \n", + "56 | \n", + "Caucasian | \n", + "Male | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 60 | \n", + "2025-04-02T15:23:54.0000000Z | \n", + "NaN | \n", + "10000001583275_0055003f5631501320313557 | \n", + "6478809838 | \n", + "Lauren | \n", + "Karatanevski | \n", + "1984-07-07T00:00:00.0000000Z | \n", + "40 | \n", + "Caucasian | \n", + "Female | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 61 | \n", + "2025-03-26T15:47:42.0000000Z | \n", + "NaN | \n", + "10000001583275_0055003f5631501320313557 | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "2002-07-10T00:00:00.0000000Z | \n", + "22 | \n", + "NaN | \n", + "NaN | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 62 | \n", + "2025-03-19T15:10:21.0000000Z | \n", + "NaN | \n", + "10000001583275_0055003f5631501320313557 | \n", + "6478809838 | \n", + "Lauren | \n", + "Karatanevski | \n", + "1984-07-07T00:00:00.0000000Z | \n", + "40 | \n", + "Caucasian | \n", + "Female | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
63 rows × 147 columns
\n", + "| \n", + " | MeasurementDate | \n", + "Comment | \n", + "ExternalDeviceId | \n", + "ExternalPatientId | \n", + "FirstName | \n", + "LastName | \n", + "BirthDate | \n", + "Age | \n", + "Ethnicity | \n", + "Gender | \n", + "... | \n", + "Child_XC | \n", + "Child_XC_Unit | \n", + "Child_BIVA_ZRh | \n", + "Child_BIVA_ZXcH | \n", + "Child_PhA | \n", + "Child_PhA_Unit | \n", + "Child_REE_Kcal | \n", + "Child_REE_MJ | \n", + "Child_TEE_Kcal | \n", + "Child_TEE_MJ | \n", + "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", + "2025-09-05T14:56:27.0000000Z | \n", + "NaN | \n", + "10000001583275_0055003f5631501320313557 | \n", + "LD5163301170 | \n", + "Lucy | \n", + "Dibenedetto | \n", + "1997-08-28T00:00:00.0000000Z | \n", + "28 | \n", + "Caucasian | \n", + "Female | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 1 | \n", + "2025-09-03T13:16:22.0000000Z | \n", + "NaN | \n", + "10000001583275_0055003f5631501320313557 | \n", + "NS6479273340 | \n", + "Niyanta | \n", + "Shah | \n", + "1985-03-11T00:00:00.0000000Z | \n", + "40 | \n", + "Other | \n", + "Female | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 2 | \n", + "2025-09-03T13:14:23.0000000Z | \n", + "NaN | \n", + "10000001583275_0055003f5631501320313557 | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "1985-03-11T00:00:00.0000000Z | \n", + "40 | \n", + "NaN | \n", + "NaN | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 3 | \n", + "2025-08-27T20:57:32.0000000Z | \n", + "NaN | \n", + "10000001583275_0055003f5631501320313557 | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "1996-04-05T00:00:00.0000000Z | \n", + "29 | \n", + "NaN | \n", + "NaN | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 4 | \n", + "2025-08-20T14:01:13.0000000Z | \n", + "NaN | \n", + "10000001583275_0055003f5631501320313557 | \n", + "MW4167267833 | \n", + "Monica | \n", + "Wong | \n", + "1985-02-17T00:00:00.0000000Z | \n", + "40 | \n", + "Asian | \n", + "Female | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
5 rows × 147 columns
\n", + "Endurance
+{{ date }}
++ Pulse Oximetry Assessment +
++ Spirometry Assessment +
++ Active Metabolic Rate Assessment +
+Endurance
+July 29, 2025
+