File size: 4,104 Bytes
a733e17 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
#!/usr/bin/env python3
# https://huggingface.co/spaces/MisterAI/GenDoc_05
# /home/user/python_pptx/python_pptx.py_02
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
class PresentationGenerator:
def __init__(self):
self.theme_colors = {
"title": "1F4E79", # Bleu foncé
"subtitle": "277BC0", # Bleu clair
"text": "2A2A2A", # Gris foncé
"background": "FFFFFF", # Blanc
"accent": "98C1D9" # Bleu pastel
}
self.default_font = "Calibri"
def parse_presentation_content(self, content):
slides = []
current_slide = None
lines = content.split('\n')
for line in lines:
line = line.strip()
if line == "#Debut Slide Titre#":
current_slide = {'type': 'title', 'title': ''}
elif line == "#Debut Slide Ressources Utiles#":
if current_slide:
slides.append(current_slide)
current_slide = {'type': 'resources', 'title': 'Ressources Utiles', 'points': []}
elif line.startswith("#Debut Slide"):
if current_slide:
slides.append(current_slide)
current_slide = {'type': 'content', 'title': '', 'points': []}
elif line.startswith("## Titre:"):
if current_slide:
current_slide['title'] = line[8:].strip()
elif line.startswith("### Points:"):
if current_slide:
current_slide['points'] = []
elif line.startswith("- ") and current_slide:
if current_slide:
current_slide['points'].append(line[2:].strip())
elif line == "#Fin Slide Ressources Utiles#" or line.startswith("#Fin Slide"):
if current_slide:
slides.append(current_slide)
current_slide = None
return slides
def create_presentation(self, slides):
prs = Presentation()
# Determine the maximum content slide for font size adjustment
max_content_length = max(len(" ".join(slide['points'])) for slide in slides if slide['type'] == 'content')
# Set font sizes based on the maximum content length
base_font_size = 32
title_font_size = 44
if max_content_length > 300: # Example threshold
base_font_size = 24
title_font_size = 36
# Title Slide
title_slide = prs.slides.add_slide(prs.slide_layouts[0])
title_slide.shapes.title.text = slides[0]['title']
title_slide.shapes.title.text_frame.paragraphs[0].font.size = Pt(title_font_size)
title_slide.shapes.title.text_frame.paragraphs[0].font.name = self.default_font
title_slide.shapes.title.text_frame.paragraphs[0].font.color.rgb = self.rgb_to_tuple(self.theme_colors["title"])
for slide in slides[1:]:
content_slide = prs.slides.add_slide(prs.slide_layouts[1])
content_slide.shapes.title.text = slide['title']
content_slide.shapes.title.text_frame.paragraphs[0].font.size = Pt(title_font_size)
content_slide.shapes.title.text_frame.paragraphs[0].font.name = self.default_font
content_slide.shapes.title.text_frame.paragraphs[0].font.color.rgb = self.rgb_to_tuple(self.theme_colors["subtitle"])
if slide['points']:
body = content_slide.shapes.placeholders[1].text_frame
body.clear()
for point in slide['points']:
p = body.add_paragraph()
p.text = point
p.font.size = Pt(base_font_size)
p.font.name = self.default_font
p.font.color.rgb = self.rgb_to_tuple(self.theme_colors["text"])
return prs
def rgb_to_tuple(self, hex_color):
# Convert hex color to RGB tuple
hex_color = hex_color.lstrip('#')
return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
|