flask
This commit is contained in:
23
.vscode/launch.json
vendored
Normal file
23
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Python Debugger: Flask",
|
||||
"type": "debugpy",
|
||||
"request": "launch",
|
||||
"module": "flask",
|
||||
"env": {
|
||||
"FLASK_APP": "makepdf.py",
|
||||
"FLASK_DEBUG": "1"
|
||||
},
|
||||
"args": [
|
||||
"run",
|
||||
],
|
||||
"jinja": true,
|
||||
"autoStartBrowser": false
|
||||
}
|
||||
]
|
||||
}
|
BIN
__pycache__/makepdf.cpython-310.pyc
Normal file
BIN
__pycache__/makepdf.cpython-310.pyc
Normal file
Binary file not shown.
114
app/app.py
Normal file
114
app/app.py
Normal file
@@ -0,0 +1,114 @@
|
||||
import fpdf
|
||||
from flask import Flask, render_template, request
|
||||
import flask
|
||||
import io
|
||||
|
||||
WIDTH = 84
|
||||
HEIGHT = 54
|
||||
|
||||
FOND_PERDU = 5
|
||||
ZONE_TRANQUILLE = 3
|
||||
MARGE = 10
|
||||
|
||||
|
||||
def generateTemplate(width: int, height: int, fondPerdu: int, zoneTranquille: int, marge: int, kind: str = "all") -> fpdf.FPDF:
|
||||
margeDuContenue = marge + fondPerdu
|
||||
|
||||
pdf = fpdf.FPDF("P", "mm", (width + margeDuContenue *
|
||||
2, height + margeDuContenue * 2))
|
||||
pdf.set_font("Arial", "B", 16) # dummy font
|
||||
pdf.set_margins(0, 0)
|
||||
pdf.set_auto_page_break(False)
|
||||
pdf.add_page()
|
||||
|
||||
if (kind in ["all", "zc"]):
|
||||
pdf.set_draw_color(255, 0, 0) # red
|
||||
pdf.rect(margeDuContenue, margeDuContenue, width, height)
|
||||
|
||||
pdf.set_draw_color(0, 0, 255) # blue
|
||||
pdf.rect(
|
||||
margeDuContenue - fondPerdu,
|
||||
margeDuContenue - fondPerdu,
|
||||
width + fondPerdu * 2,
|
||||
height + fondPerdu * 2,
|
||||
)
|
||||
|
||||
pdf.set_draw_color(0, 255, 0) # green
|
||||
pdf.rect(
|
||||
margeDuContenue + zoneTranquille,
|
||||
margeDuContenue + zoneTranquille,
|
||||
width - zoneTranquille * 2,
|
||||
height - zoneTranquille * 2,
|
||||
)
|
||||
|
||||
if (kind in ["all", "tc"]):
|
||||
pdf.set_draw_color(0, 0, 0)
|
||||
LINES = [
|
||||
(margeDuContenue, 0, margeDuContenue, marge),
|
||||
(margeDuContenue + width, 0, margeDuContenue + width, marge),
|
||||
(
|
||||
margeDuContenue,
|
||||
height + margeDuContenue * 2,
|
||||
margeDuContenue,
|
||||
height + margeDuContenue * 2 - marge,
|
||||
),
|
||||
(
|
||||
margeDuContenue + width,
|
||||
height + margeDuContenue * 2,
|
||||
margeDuContenue + width,
|
||||
height + margeDuContenue * 2 - marge,
|
||||
),
|
||||
(0, margeDuContenue, marge, margeDuContenue),
|
||||
(0, margeDuContenue + height, marge, margeDuContenue + height),
|
||||
(
|
||||
width + margeDuContenue * 2,
|
||||
margeDuContenue,
|
||||
width + margeDuContenue * 2 - marge,
|
||||
margeDuContenue,
|
||||
),
|
||||
(
|
||||
width + margeDuContenue * 2,
|
||||
margeDuContenue + height,
|
||||
width + margeDuContenue * 2 - marge,
|
||||
margeDuContenue + height,
|
||||
),
|
||||
]
|
||||
for line in LINES:
|
||||
pdf.line(*line)
|
||||
|
||||
return pdf
|
||||
|
||||
|
||||
generateTemplate(WIDTH, HEIGHT, FOND_PERDU,
|
||||
ZONE_TRANQUILLE, MARGE).output("test.pdf")
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
|
||||
@app.route("/")
|
||||
def index():
|
||||
return render_template("index.html")
|
||||
|
||||
|
||||
@app.route("/generate")
|
||||
def generate():
|
||||
try:
|
||||
w = int(request.args.get("width", ""))
|
||||
h = int(request.args.get("height", ""))
|
||||
fp = int(request.args.get("fp", ""))
|
||||
zt = int(request.args.get("zt", ""))
|
||||
m = int(request.args.get("margin", ""))
|
||||
k = request.args.get("kind", "all")
|
||||
if k not in ["all", "tc", "zc"]:
|
||||
raise ValueError("kind is not valid")
|
||||
except (KeyError, ValueError) as e:
|
||||
flask.abort(400)
|
||||
app.logger.debug("w %d ; h %d ; fp %d ; zt %d ; m %d", w, h, fp, zt, m)
|
||||
pdf = generateTemplate(w, h, fp, zt, m, k).output(dest="S")
|
||||
# generateTemplate(w, h, fp, zt, m).output(name="test.pdf")
|
||||
pdf = pdf.encode("latin-1")
|
||||
return flask.send_file(
|
||||
io.BytesIO(pdf),
|
||||
mimetype="application/pdf",
|
||||
download_name="test.pdf",
|
||||
)
|
57
app/templates/index.html
Normal file
57
app/templates/index.html
Normal file
@@ -0,0 +1,57 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<head>
|
||||
<title>PDF template generator</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<style>
|
||||
form {
|
||||
font-size: larger;
|
||||
display: grid;
|
||||
width: 90%;
|
||||
margin: 0;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
-ms-transform: translate(-50%, -50%);
|
||||
transform: translate(-50%, -50%);
|
||||
justify-content: center;
|
||||
justify-items: left;
|
||||
align-items: start;
|
||||
align-content: center;
|
||||
column-gap: 1ch;
|
||||
}
|
||||
|
||||
label {
|
||||
grid-column: 1;
|
||||
justify-self: right;
|
||||
}
|
||||
|
||||
input {
|
||||
grid-column: 2;
|
||||
}
|
||||
|
||||
input[type="number"] {
|
||||
width: 6ch;
|
||||
}
|
||||
|
||||
input[type="submit"] {
|
||||
grid-column: 1 / span 2;
|
||||
justify-self: normal;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<form action="/generate" method="get">
|
||||
<label for="width">Largeur (mm)</label><input required type="number" name="width" id="width" value="84">
|
||||
<label for="height">Hauteur (mm)</label><input required type="number" name="height" id="height" value="54">
|
||||
<label for="fp">Fond perdu (mm)</label><input required type="number" name="fp" id="fp" value="5">
|
||||
<label for="zt">Zone tranquille (mm)</label><input required type="number" name="zt" id="zt" value="3">
|
||||
<label for="margin">Marge (mm)</label><input required type="number" name="margin" id="margin" value="10">
|
||||
<label for="rb_tc">Traits de coupe</label><input required type="radio" value="tc" name="kind" id="rb_tc">
|
||||
<label for="rb_zc">Zone de construction</label><input required type="radio" value="zc" name="kind" id="rb_zc">
|
||||
<label for="rb_all">Tout</label><input required type="radio" value="all" name="kind" id="rb_all" checked>
|
||||
<input type="submit" value="Générer">
|
||||
</form>
|
||||
</body>
|
82
makepdf.py
82
makepdf.py
@@ -1,82 +0,0 @@
|
||||
import fpdf
|
||||
|
||||
WIDHTH = 84
|
||||
HEIGHT = 54
|
||||
|
||||
FOND_PERDU = 5
|
||||
ZONE_TRANQUILLE = 3
|
||||
MARGE = 10
|
||||
|
||||
|
||||
def generateTemplate(
|
||||
width: int, height: int, fondPerdu: int, zoneTranquille: int, marge: int
|
||||
) -> fpdf.FPDF:
|
||||
margeDuContenue = marge + fondPerdu
|
||||
|
||||
pdf = fpdf.FPDF(
|
||||
"P",
|
||||
"mm",
|
||||
(width + margeDuContenue * 2, height + margeDuContenue * 2),
|
||||
)
|
||||
pdf.set_font("Arial", "B", 16) # dummy font
|
||||
pdf.set_margins(0, 0)
|
||||
pdf.set_auto_page_break(False)
|
||||
pdf.add_page()
|
||||
|
||||
pdf.set_draw_color(255, 0, 0) # red
|
||||
pdf.rect(margeDuContenue, margeDuContenue, width, height)
|
||||
|
||||
pdf.set_draw_color(0, 0, 255) # blue
|
||||
pdf.rect(
|
||||
margeDuContenue - fondPerdu,
|
||||
margeDuContenue - fondPerdu,
|
||||
width + fondPerdu * 2,
|
||||
height + fondPerdu * 2,
|
||||
)
|
||||
|
||||
pdf.set_draw_color(0, 255, 0) # green
|
||||
pdf.rect(
|
||||
margeDuContenue + zoneTranquille,
|
||||
margeDuContenue + zoneTranquille,
|
||||
width - zoneTranquille * 2,
|
||||
height - zoneTranquille * 2,
|
||||
)
|
||||
|
||||
pdf.set_draw_color(0, 0, 0)
|
||||
LINES = [
|
||||
(margeDuContenue, 0, margeDuContenue, marge),
|
||||
(margeDuContenue + width, 0, margeDuContenue + width, marge),
|
||||
(
|
||||
margeDuContenue,
|
||||
height + margeDuContenue * 2,
|
||||
margeDuContenue,
|
||||
height + margeDuContenue * 2 - marge,
|
||||
),
|
||||
(
|
||||
margeDuContenue + width,
|
||||
height + margeDuContenue * 2,
|
||||
margeDuContenue + width,
|
||||
height + margeDuContenue * 2 - marge,
|
||||
),
|
||||
(0, margeDuContenue, marge, margeDuContenue),
|
||||
(0, margeDuContenue + height, marge, margeDuContenue + height),
|
||||
(
|
||||
width + margeDuContenue * 2,
|
||||
margeDuContenue,
|
||||
width + margeDuContenue * 2 - marge,
|
||||
margeDuContenue,
|
||||
),
|
||||
(
|
||||
width + margeDuContenue * 2,
|
||||
margeDuContenue + height,
|
||||
width + margeDuContenue * 2 - marge,
|
||||
margeDuContenue + height,
|
||||
),
|
||||
]
|
||||
for line in LINES:
|
||||
pdf.line(*line)
|
||||
|
||||
return pdf
|
||||
|
||||
|
||||
generateTemplate(WIDHTH, HEIGHT, FOND_PERDU, ZONE_TRANQUILLE, MARGE).output("test.pdf")
|
Reference in New Issue
Block a user