Spaces:
Runtime error
Runtime error
| import os | |
| from pptx import Presentation | |
| from pptx.util import Inches, Pt | |
| from pptx.enum.text import PP_ALIGN | |
| from pptx.dml.color import RGBColor | |
| def create_ppt(slides_data, output_path): | |
| """ | |
| Creates a premium, highly stylized PowerPoint presentation. | |
| """ | |
| prs = Presentation() | |
| # Define colors | |
| bg_color = RGBColor(15, 23, 42) # #0F172A (Deep Navy) | |
| accent_color = RGBColor(59, 130, 246) # #3B82F6 (Bright Blue) | |
| text_color = RGBColor(248, 250, 252) # #F8FAFC (Near White) | |
| def apply_slide_background(slide): | |
| background = slide.background | |
| fill = background.fill | |
| fill.solid() | |
| fill.fore_color.rgb = bg_color | |
| def add_header_bar(slide): | |
| # Add a decorative accent bar at the top | |
| left = Inches(0) | |
| top = Inches(0) | |
| width = prs.slide_width | |
| height = Inches(0.1) | |
| shape = slide.shapes.add_shape(1, left, top, width, height) # 1 is Rectangle | |
| shape.fill.solid() | |
| shape.fill.fore_color.rgb = accent_color | |
| shape.line.fill.background() | |
| # 1. Title Slide | |
| title_layout = prs.slide_layouts[0] | |
| slide = prs.slides.add_slide(title_layout) | |
| apply_slide_background(slide) | |
| add_header_bar(slide) | |
| title = slide.shapes.title | |
| subtitle = slide.placeholders[1] | |
| title.text = slides_data[0].get("title", "Research Presentation") if slides_data else "Research Presentation" | |
| subtitle.text = "Generated by RepoAgent · Easy Mode" | |
| # Style title | |
| title.text_frame.paragraphs[0].font.color.rgb = text_color | |
| title.text_frame.paragraphs[0].font.bold = True | |
| subtitle.text_frame.paragraphs[0].font.color.rgb = accent_color | |
| # 2. Content Slides | |
| for slide_info in slides_data[1:]: | |
| # Use a blank layout to have full control | |
| blank_layout = prs.slide_layouts[6] | |
| slide = prs.slides.add_slide(blank_layout) | |
| apply_slide_background(slide) | |
| add_header_bar(slide) | |
| # Title | |
| left = Inches(0.5) | |
| top = Inches(0.4) | |
| width = prs.slide_width - Inches(1) | |
| height = Inches(1) | |
| txBox = slide.shapes.add_textbox(left, top, width, height) | |
| tf = txBox.text_frame | |
| p = tf.paragraphs[0] | |
| p.text = slide_info.get("title", "Key Point") | |
| p.font.bold = True | |
| p.font.size = Pt(32) | |
| p.font.color.rgb = accent_color | |
| # Content | |
| left = Inches(0.5) | |
| top = Inches(1.5) | |
| width = prs.slide_width - Inches(1) | |
| height = prs.slide_height - Inches(2) | |
| contentBox = slide.shapes.add_textbox(left, top, width, height) | |
| ctf = contentBox.text_frame | |
| ctf.word_wrap = True | |
| for idx, point in enumerate(slide_info.get("content", [])): | |
| if idx == 0: | |
| p = ctf.paragraphs[0] | |
| else: | |
| p = ctf.add_paragraph() | |
| p.text = f"• {point}" | |
| p.font.size = Pt(18) | |
| p.font.color.rgb = text_color | |
| p.space_after = Pt(10) | |
| # Save the presentation | |
| prs.save(output_path) | |
| return output_path | |