Logo nach y=5 verschoben, Hoehe via image_dimensions() berechnet, Text darunter

This commit is contained in:
Erik Thiele
2026-07-02 15:33:40 +02:00
parent 46b5db964f
commit cae45174ea

43
app.py
View File

@@ -12,6 +12,41 @@ from datetime import datetime
from flask import Flask, render_template, request, jsonify, redirect, url_for, send_file
from fpdf import FPDF
def image_dimensions(filepath):
"""Liest Pixelmasse aus PNG/JPEG/WebP ohne externe Libs.""" # noqa: E501
with open(filepath, 'rb') as f:
head = f.read(24)
if head[:8] == b'\x89PNG\r\n\x1a\n':
import struct
return struct.unpack('>II', head[16:24])
if head[:2] == b'\xff\xd8':
import struct
with open(filepath, 'rb') as f:
data = f.read(8192)
i = 2
while i < len(data) - 1:
if data[i] != 0xFF:
i += 1
continue
marker = data[i+1]
if marker in (0xC0, 0xC1, 0xC2):
h, w = struct.unpack('>HH', data[i+5:i+9])
return w, h
length = struct.unpack('>H', data[i+2:i+4])[0]
i += 2 + length
if head[:4] == b'RIFF' and head[8:12] == b'WEBP':
import struct
with open(filepath, 'rb') as f:
data = f.read(64)
if data[12:16] == b'VP8 ' and len(data) >= 30:
w, h = struct.unpack('<HH', data[26:30])
return (w & 0x3FFF) * 2, (h & 0x3FFF) * 2
if data[12:16] == b'VP8L' and len(data) >= 25:
bits = struct.unpack('<I', data[21:25])[0]
return (bits & 0x3FFF) + 1, ((bits >> 14) & 0x3FFF) + 1
return None, None
app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 5 * 1024 * 1024
CONFIG_FILE = 'druckkalkulation_config.yaml'
@@ -256,8 +291,12 @@ def invoice_pdf():
logo_name = config.get('logo', '')
logo_path = os.path.join('static', logo_name) if logo_name else ''
if logo_name and os.path.exists(logo_path):
pdf.image(logo_path, x=155, y=8, w=40)
logo_bottom = 50
pdf.image(logo_path, x=155, y=5, w=40)
img_w, img_h = image_dimensions(logo_path)
if img_w and img_h:
logo_bottom = 5 + 40 * (img_h / img_w) + 3
else:
logo_bottom = 5 + 25 + 3
else:
pdf.set_font("Arial", "B", 18)
pdf.set_xy(150, 15)