This commit is contained in:
2024-06-05 23:34:58 +02:00
parent 7bb14c21c1
commit ca460d5fba
5 changed files with 194 additions and 82 deletions

23
.vscode/launch.json vendored Normal file
View 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
}
]
}

Binary file not shown.

114
app/app.py Normal file
View 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
View 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>

View File

@@ -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")