Улучшена генерация PDF отчета

- Добавлен OverlayCanvas для отрисовки штампа поверх контента

- Изменено позиционирование штампа

- Добавлены необходимые импорты для работы с Canvas
This commit is contained in:
Vlad 2025-05-11 02:04:27 +03:00
parent 98b0e7ac26
commit e52f7ea5d9

48
app.py
View File

@ -20,7 +20,9 @@ from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer, Image from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer, Image
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch, mm from reportlab.lib.units import inch, mm
from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
from reportlab.platypus import Frame
import sys import sys
import logging import logging
@ -150,6 +152,34 @@ dictConfig({
# Создаем логгер для приложения # Создаем логгер для приложения
logger = logging.getLogger("app") logger = logging.getLogger("app")
class OverlayCanvas(Canvas):
def __init__(self, *args, **kwargs):
Canvas.__init__(self, *args, **kwargs)
self._saved_page_states = []
def showPage(self):
self._saved_page_states.append(dict(self.__dict__))
self._startPage()
def save(self):
for state in self._saved_page_states:
self.__dict__.update(state)
self.draw_overlay() # теперь рисуем поверх
Canvas.showPage(self)
Canvas.save(self)
def draw_overlay(self):
stamp_path = os.path.join(app_path, 'static', 'stamp256.png')
if os.path.exists(stamp_path):
self.drawImage(
stamp_path,
x=400, # настроить по ширине
y=400, # настроить по высоте
width=100,
height=100,
mask='auto'
)
@app.after_request @app.after_request
def after_request(response): def after_request(response):
if request.cookies.get('user_id', None) == None: if request.cookies.get('user_id', None) == None:
@ -1107,6 +1137,19 @@ def generate_pdf_report(vin):
elements.append(Spacer(1, 15*mm)) elements.append(Spacer(1, 15*mm))
# Добавляем штамп поверх таблицы
# stamp_path = os.path.join(app_path, 'static', 'stamp256.png')
# if os.path.exists(stamp_path):
# stamp_img = Image(stamp_path, width=100, height=100)
# stamp_img.hAlign = 'RIGHT'
# stamp_img.vAlign = 'TOP'
# # Размещаем штамп поверх таблицы
# elements.append(stamp_img)
# elements.append(Spacer(1, 15*mm))
# Дисклеймер # Дисклеймер
disclaimer_text = """ disclaimer_text = """
Disclaimer: This report provides information about salvage or junk vehicles; damage from hail, flood or fire; Disclaimer: This report provides information about salvage or junk vehicles; damage from hail, flood or fire;
@ -1120,10 +1163,11 @@ def generate_pdf_report(vin):
elements.append(Spacer(1, 15*mm)) elements.append(Spacer(1, 15*mm))
elements.append(Paragraph(f"© {current_year} SALVAGEDB.COM - All Rights Reserved", styles['SalvageDBFooter'])) elements.append(Paragraph(f"© {current_year} SALVAGEDB.COM - All Rights Reserved", styles['SalvageDBFooter']))
elements.append(Paragraph("Visit SALVAGEDB.COM for more information about vehicle history", styles['SalvageDBFooter'])) elements.append(Paragraph("Visit SALVAGEDB.COM for more information about vehicle history", styles['SalvageDBFooter']))
elements.append(Paragraph("This report is provided as is without any guarantees or warranty.", styles['Disclaimer'])) elements.append(Paragraph('"This report is provided as is without any guarantees or warranty."', styles['Disclaimer']))
# Строим PDF документ # Строим PDF документ
doc.build(elements) # doc.build(elements, onFirstPage=add_stamp_overlay, onLaterPages=add_stamp_overlay)
doc.build(elements, canvasmaker=OverlayCanvas)
# Получаем содержимое буфера # Получаем содержимое буфера
pdf_data = buffer.getvalue() pdf_data = buffer.getvalue()