Spaces:
Running
Running
Merge pull request #138 from barun-saha/visual
Browse files- helpers/pptx_helper.py +54 -9
helpers/pptx_helper.py
CHANGED
@@ -213,6 +213,10 @@ def generate_powerpoint_presentation(
|
|
213 |
|
214 |
except Exception:
|
215 |
# In case of any unforeseen error, try to salvage what is available
|
|
|
|
|
|
|
|
|
216 |
continue
|
217 |
|
218 |
# The thank-you slide
|
@@ -356,7 +360,7 @@ def _handle_default_display(
|
|
356 |
|
357 |
|
358 |
def _handle_display_image__in_foreground(
|
359 |
-
presentation: pptx.Presentation
|
360 |
slide_json: dict,
|
361 |
slide_width_inch: float,
|
362 |
slide_height_inch: float
|
@@ -434,7 +438,7 @@ def _handle_display_image__in_foreground(
|
|
434 |
|
435 |
|
436 |
def _handle_display_image__in_background(
|
437 |
-
presentation: pptx.Presentation
|
438 |
slide_json: dict,
|
439 |
slide_width_inch: float,
|
440 |
slide_height_inch: float
|
@@ -465,7 +469,6 @@ def _handle_display_image__in_background(
|
|
465 |
body_shape = slide.shapes.placeholders[placeholders[0][0]]
|
466 |
|
467 |
title_shape.text = remove_slide_number_from_heading(slide_json['heading'])
|
468 |
-
|
469 |
flat_items_list = get_flat_list_of_contents(slide_json['bullet_points'], level=0)
|
470 |
add_bulleted_items(body_shape.text_frame, flat_items_list)
|
471 |
|
@@ -486,6 +489,39 @@ def _handle_display_image__in_background(
|
|
486 |
width=pptx.util.Inches(slide_width_inch),
|
487 |
)
|
488 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
489 |
_add_text_at_bottom(
|
490 |
slide=slide,
|
491 |
slide_width_inch=slide_width_inch,
|
@@ -495,20 +531,29 @@ def _handle_display_image__in_background(
|
|
495 |
)
|
496 |
|
497 |
# Move picture to background
|
498 |
-
|
499 |
-
|
500 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
501 |
except Exception as ex:
|
502 |
logger.error(
|
503 |
-
'*** Error occurred while
|
504 |
str(ex)
|
505 |
)
|
|
|
506 |
|
507 |
return True
|
508 |
|
509 |
|
510 |
def _handle_icons_ideas(
|
511 |
-
presentation: pptx.Presentation
|
512 |
slide_json: dict,
|
513 |
slide_width_inch: float,
|
514 |
slide_height_inch: float
|
@@ -656,7 +701,7 @@ def _add_text_at_bottom(
|
|
656 |
|
657 |
|
658 |
def _handle_double_col_layout(
|
659 |
-
presentation: pptx.Presentation
|
660 |
slide_json: dict,
|
661 |
slide_width_inch: float,
|
662 |
slide_height_inch: float
|
|
|
213 |
|
214 |
except Exception:
|
215 |
# In case of any unforeseen error, try to salvage what is available
|
216 |
+
logger.error(
|
217 |
+
'An error occurred while processing a slide...continuing with the next one',
|
218 |
+
exc_info=True
|
219 |
+
)
|
220 |
continue
|
221 |
|
222 |
# The thank-you slide
|
|
|
360 |
|
361 |
|
362 |
def _handle_display_image__in_foreground(
|
363 |
+
presentation: pptx.Presentation,
|
364 |
slide_json: dict,
|
365 |
slide_width_inch: float,
|
366 |
slide_height_inch: float
|
|
|
438 |
|
439 |
|
440 |
def _handle_display_image__in_background(
|
441 |
+
presentation: pptx.Presentation,
|
442 |
slide_json: dict,
|
443 |
slide_width_inch: float,
|
444 |
slide_height_inch: float
|
|
|
469 |
body_shape = slide.shapes.placeholders[placeholders[0][0]]
|
470 |
|
471 |
title_shape.text = remove_slide_number_from_heading(slide_json['heading'])
|
|
|
472 |
flat_items_list = get_flat_list_of_contents(slide_json['bullet_points'], level=0)
|
473 |
add_bulleted_items(body_shape.text_frame, flat_items_list)
|
474 |
|
|
|
489 |
width=pptx.util.Inches(slide_width_inch),
|
490 |
)
|
491 |
|
492 |
+
try:
|
493 |
+
# Find all blip elements to handle potential multiple instances
|
494 |
+
blip_elements = picture._element.xpath('.//a:blip')
|
495 |
+
if not blip_elements:
|
496 |
+
logger.warning(
|
497 |
+
'No blip element found in the picture. Transparency cannot be applied.'
|
498 |
+
)
|
499 |
+
return True
|
500 |
+
|
501 |
+
for blip in blip_elements:
|
502 |
+
# Add transparency to the image through the blip properties
|
503 |
+
alpha_mod = blip.makeelement(
|
504 |
+
'{http://schemas.openxmlformats.org/drawingml/2006/main}alphaModFix'
|
505 |
+
)
|
506 |
+
# Opacity value between 0-100000
|
507 |
+
alpha_mod.set('amt', '50000') # 50% opacity
|
508 |
+
|
509 |
+
# Check if alphaModFix already exists to avoid duplicates
|
510 |
+
existing_alpha_mod = blip.find(
|
511 |
+
'{http://schemas.openxmlformats.org/drawingml/2006/main}alphaModFix'
|
512 |
+
)
|
513 |
+
if existing_alpha_mod is not None:
|
514 |
+
blip.remove(existing_alpha_mod)
|
515 |
+
|
516 |
+
blip.append(alpha_mod)
|
517 |
+
logger.debug('Added transparency to blip element: %s', blip.xml)
|
518 |
+
|
519 |
+
except Exception as ex:
|
520 |
+
logger.error(
|
521 |
+
'Failed to apply transparency to the image: %s. Continuing without it.',
|
522 |
+
str(ex)
|
523 |
+
)
|
524 |
+
|
525 |
_add_text_at_bottom(
|
526 |
slide=slide,
|
527 |
slide_width_inch=slide_width_inch,
|
|
|
531 |
)
|
532 |
|
533 |
# Move picture to background
|
534 |
+
try:
|
535 |
+
slide.shapes._spTree.remove(picture._element)
|
536 |
+
slide.shapes._spTree.insert(2, picture._element)
|
537 |
+
except Exception as ex:
|
538 |
+
logger.error(
|
539 |
+
'Failed to move image to background: %s. Image will remain in foreground.',
|
540 |
+
str(ex)
|
541 |
+
)
|
542 |
+
|
543 |
+
return True
|
544 |
+
|
545 |
except Exception as ex:
|
546 |
logger.error(
|
547 |
+
'*** Error occurred while adding image to the slide background: %s',
|
548 |
str(ex)
|
549 |
)
|
550 |
+
return True
|
551 |
|
552 |
return True
|
553 |
|
554 |
|
555 |
def _handle_icons_ideas(
|
556 |
+
presentation: pptx.Presentation,
|
557 |
slide_json: dict,
|
558 |
slide_width_inch: float,
|
559 |
slide_height_inch: float
|
|
|
701 |
|
702 |
|
703 |
def _handle_double_col_layout(
|
704 |
+
presentation: pptx.Presentation,
|
705 |
slide_json: dict,
|
706 |
slide_width_inch: float,
|
707 |
slide_height_inch: float
|