From b500bfa6c1320f05b43a5c63c7934a69d0bf8a4c Mon Sep 17 00:00:00 2001
From: ValueOn AG
Date: Wed, 29 Apr 2026 23:27:52 +0200
Subject: [PATCH] plan D fixed
---
.../services/serviceAi/mainServiceAi.py | 4 ++
.../renderers/rendererPdf.py | 39 ++++++++++++-------
2 files changed, 30 insertions(+), 13 deletions(-)
diff --git a/modules/serviceCenter/services/serviceAi/mainServiceAi.py b/modules/serviceCenter/services/serviceAi/mainServiceAi.py
index 18ac46bc..3b800fb5 100644
--- a/modules/serviceCenter/services/serviceAi/mainServiceAi.py
+++ b/modules/serviceCenter/services/serviceAi/mainServiceAi.py
@@ -51,6 +51,10 @@ class _ServicesAdapter:
def workflow(self):
return self._context.workflow
+ @workflow.setter
+ def workflow(self, value):
+ self._context.workflow = value
+
@property
def chat(self):
return self._get_service("chat")
diff --git a/modules/serviceCenter/services/serviceGeneration/renderers/rendererPdf.py b/modules/serviceCenter/services/serviceGeneration/renderers/rendererPdf.py
index 31537980..7913a246 100644
--- a/modules/serviceCenter/services/serviceGeneration/renderers/rendererPdf.py
+++ b/modules/serviceCenter/services/serviceGeneration/renderers/rendererPdf.py
@@ -247,13 +247,28 @@ class RendererPdf(BaseRenderer):
removed = False
for idx, flowable in enumerate(story):
fRepr = repr(flowable)
+ if "Image" in fRepr and hasattr(flowable, 'drawWidth') and hasattr(flowable, 'drawHeight'):
+ from reportlab.platypus import Image as ReportLabImage
+ if isinstance(flowable, ReportLabImage):
+ frameH = 650.0
+ frameW = 450.0
+ if flowable.drawHeight > frameH or flowable.drawWidth > frameW:
+ scaleW = frameW / flowable.drawWidth if flowable.drawWidth > frameW else 1.0
+ scaleH = frameH / flowable.drawHeight if flowable.drawHeight > frameH else 1.0
+ s = min(scaleW, scaleH) * 0.9
+ flowable.drawWidth = flowable.drawWidth * s
+ flowable.drawHeight = flowable.drawHeight * s
+ flowable._width = flowable.drawWidth
+ flowable._height = flowable.drawHeight
+ removed = True
+ break
if "Table" in fRepr and hasattr(flowable, '_cellvalues'):
try:
nRows = len(flowable._cellvalues)
nCols = len(flowable._cellvalues[0]) if flowable._cellvalues else 0
if nRows == 1 and nCols == 1:
errPara = Paragraph(
- "[Code block omitted — content too large for PDF page]",
+ "[Code block omitted - content too large for PDF page]",
self._createNormalStyle({}),
)
story[idx] = errPara
@@ -1078,20 +1093,18 @@ class RendererPdf(BaseRenderer):
pilImage = PILImage.open(imageStream)
originalWidth, originalHeight = pilImage.size
- # Calculate available page dimensions (A4 with margins: 72pt left/right, 72pt top, 18pt bottom)
pageWidth = A4[0] # 595.27 points
pageHeight = A4[1] # 841.89 points
- leftMargin = 72
- rightMargin = 72
- topMargin = 72
- bottomMargin = 18
-
- # Use actual frame dimensions from SimpleDocTemplate
- # Frame is smaller than page minus margins due to internal spacing
- # From error message: frame is 439.27559055118115 x 739.8897637795277
- # Use conservative values with safety margin
- availableWidth = 430.0 # Slightly smaller than frame width for safety
- availableHeight = 730.0 # Slightly smaller than frame height for safety
+ # Use page dimensions minus margins with generous safety buffer
+ # A4 = 595.27 x 841.89 pt; frame = page - margins - internal padding
+ _us = getattr(self, '_unifiedStyle', None) or {}
+ _pageMgn = (_us.get('page') or {}).get('marginsPt') or {}
+ marginTop = _pageMgn.get('top', 60)
+ marginBottom = _pageMgn.get('bottom', 60)
+ marginLeft = _pageMgn.get('left', 60)
+ marginRight = _pageMgn.get('right', 60)
+ availableWidth = pageWidth - marginLeft - marginRight - 20 # 20pt safety
+ availableHeight = pageHeight - marginTop - marginBottom - 80 # 80pt safety for header/footer
# Convert original image size from pixels to points
# PIL provides size in pixels, need to convert to points