File size: 4,922 Bytes
679964a
 
 
 
6050e1c
679964a
 
 
 
 
 
e610d6e
6050e1c
 
 
 
 
 
 
 
746a499
6050e1c
 
746a499
 
6050e1c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
679964a
6050e1c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
97
98
99
100
101
102
103
104
105
106
107
108
109
import openai
import json
from pptx import Presentation
import streamlit as st
import os

# Suppress all warnings
import warnings
warnings.filterwarnings("ignore")

# Set your OpenAI API key
openai.api_key = "your api key"

# Streamlit app title and header with improved styling
st.title("🌟 PowerPoint Presentation Generator 🌟")
st.markdown("<h1 style='text-align: center; color: white;'>Welcome to the Future of Presentation Creation!</h1>", unsafe_allow_html=True)

# User Input Section with clickable options
presentation_title = st.text_input("πŸ“ Enter your presentation topic:")

# Predefined topics (hidden from the user)
predefined_topics = ["Artificial Intelligence", "Blockchain Technology", "Space Exploration", "Climate Change", "Future of Work"]

# Display clickable options for predefined topics (hidden)
selected_topic = st.radio("🌐 Choose a predefined topic or enter your own:", ["Select"] + predefined_topics, index=0)

# If a predefined topic is selected, set it as the input
if selected_topic != "Select":
    presentation_title = selected_topic

custom_requirements = st.text_input("πŸ“ Enter your custom requirements you want:", value="informative")
no_of_pages = st.number_input("πŸ“Š Number of slides you want (3-8)", min_value=3, max_value=8, value=3)
least_c = st.number_input("πŸ“Š Minimum points in each slide (3-7)", min_value=3, max_value=7, value=3)
max_c = st.number_input("πŸ“Š Maximum points in each slide (4-7)", min_value=4, max_value=7, value=7)

# Check if any input values are out of range
if no_of_pages > 8 or no_of_pages < 3 or least_c > 7 or least_c < 3 or max_c > 7 or max_c < 4:
    st.warning("Invalid input values. Please ensure that your inputs are within the specified limits.")
else:
    if st.button("Generate Presentation"):
        # Check if the user has entered a topic
        if presentation_title:
            question = (
                f"Create a {no_of_pages}-slide PowerPoint presentation on the topic of {presentation_title}."
                f" Each slide should have {{header}}, {{content}}, should have at least {least_c} points and max {max_c} points in content, be {custom_requirements}, and make content informative. Return as JSON."
            )

            query_json = {
                "input_text": question,
                "output_format": "json",
                "json_structure": {"slides": "{{presentation_slides}}"},
            }

            # Send the query to OpenAI
            completion = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=[{"role": "user", "content": json.dumps(query_json)}],
            )
            
            try:
                response = json.loads(completion.choices[0].message.content)
                
                if "slides" in response:
                    slide_data = response["slides"]
                    prs = Presentation()
                    
                    from pptx.util import Pt
                    from pptx.enum.text import PP_ALIGN
                    
                    for slide in slide_data:
                        slide_layout = prs.slide_layouts[1]
                        new_slide = prs.slides.add_slide(slide_layout)
                        
                        if slide["header"]:
                            title = new_slide.shapes.title
                            title.text = slide["header"]
                        
                        if slide["content"]:
                            shapes = new_slide.shapes
                            body_shape = shapes.placeholders[1]
                            tf = body_shape.text_frame
                            
                            content_text = "\n".join(slide["content"])
                            
                            p = tf.add_paragraph()
                            p.text = content_text
                            p.space_after = Pt(14)
                            p.alignment = PP_ALIGN.LEFT
                    
                    presentation_filename = f"{presentation_title}.pptx"
                    prs.save(presentation_filename)
                    
                    with open(presentation_filename, "rb") as file:
                        st.download_button(
                            label=f"πŸ“₯ Download {presentation_title}",
                            data=file.read(),
                            key=presentation_filename,
                            file_name=presentation_filename
                        )
                    
                    os.remove(presentation_filename)
                else:
                    st.warning("No slides were generated for this presentation.")
                    
            except json.JSONDecodeError as e:
                st.error("Error parsing JSON response from OpenAI.")
        else:
            st.warning("Please enter a presentation topic.")