kshitij10000 commited on
Commit
55b9c31
Β·
1 Parent(s): 2f20cef

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +119 -80
app.py CHANGED
@@ -3,6 +3,7 @@ import json
3
  import base64
4
  from pptx import Presentation
5
  import streamlit as st
 
6
 
7
  # Suppress all warnings
8
  import warnings
@@ -12,84 +13,122 @@ warnings.filterwarnings("ignore")
12
  openai.api_key = "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"
13
 
14
  # Streamlit app
15
- st.title("PowerPoint Presentation Generator")
16
-
17
- # Display a warning message
18
- st.warning("Warning: If multiple times the file is downloaded, it may return the PowerPoint content in vertical format.")
19
-
20
- # Input for presentation topic
21
- presentation_title = st.text_input("Enter your presentation topic:")
22
- no_of_pages = st.number_input("Number of slides you want", min_value=1, value=1) # Accept and display float values
23
- least_c = st.number_input("Minimum points in each slide", min_value=1, value=1) # Accept and display float values
24
- max_c = st.number_input("Maximum points in each slide", min_value=1, value=1) # Accept and display float values
25
-
26
- if st.button("Generate Presentation"):
27
- # Check if the user has entered a topic
28
- if presentation_title:
29
- question = (
30
- f"generate a {no_of_pages} slide presentation for the topic {presentation_title}."
31
- f" Each slide should have {{header}}, {{content}}, should have at least {least_c} points and max {max_c} points in content. Return as JSON"
32
- )
33
-
34
- query_json = {
35
- "input_text": question,
36
- "output_format": "json",
37
- "json_structure": {"slides": "{{presentation_slides}}"},
38
- }
39
-
40
- # Send the query to OpenAI
41
- completion = openai.ChatCompletion.create(
42
- model="gpt-3.5-turbo",
43
- messages=[{"role": "user", "content": json.dumps(query_json)}],
44
- )
45
-
46
- try:
47
- response = json.loads(completion.choices[0].message.content)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
 
49
- slide_data = response["slides"]
50
-
51
- prs = Presentation()
52
-
53
- from pptx.util import Pt # Import the Pt class from pptx.util
54
- from pptx.enum.text import PP_ALIGN # Import text alignment options
55
-
56
- # Iterate through slide data and populate the presentation
57
- for slide in slide_data:
58
- slide_layout = prs.slide_layouts[1]
59
- new_slide = prs.slides.add_slide(slide_layout)
60
-
61
- if slide["header"]:
62
- title = new_slide.shapes.title
63
- title.text = slide["header"]
64
-
65
- if slide["content"]:
66
- shapes = new_slide.shapes
67
- body_shape = shapes.placeholders[1]
68
- tf = body_shape.text_frame
69
-
70
- # Join the list of content into a single string with line breaks
71
- content_text = "\n".join(slide["content"])
72
-
73
- p = tf.add_paragraph()
74
- p.text = content_text
75
-
76
- # Set the spacing between lines using Pt (point size)
77
- p.space_after = Pt(14) # Adjust the spacing between lines
78
-
79
- # Set text direction to horizontal (left-to-right)
80
- p.alignment = PP_ALIGN.LEFT
81
-
82
- # Save the presentation in PPTX format with the topic name as the file name
83
- presentation_filename = f"{presentation_title}.pptx"
84
- prs.save(presentation_filename)
85
-
86
- # Provide a direct download link
87
- with open(presentation_filename, "rb") as file:
88
- st.markdown(
89
- f"### [Download {presentation_title}]"
90
- f"(data:application/octet-stream;base64,{base64.b64encode(file.read()).decode()})"
91
- )
92
- except json.JSONDecodeError as e:
93
- st.error("Error parsing JSON response from OpenAI.")
94
- else:
95
- st.warning("Please enter a presentation topic.")
 
 
 
 
 
 
 
 
3
  import base64
4
  from pptx import Presentation
5
  import streamlit as st
6
+ import os
7
 
8
  # Suppress all warnings
9
  import warnings
 
13
  openai.api_key = "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"
14
 
15
  # Streamlit app
16
+ st.title("🌟 PowerPoint Presentation Generator 🌟")
17
+ st.markdown("<h1 style='text-align: center; color: white;'>Welcome to the Future of Presentation Creation!</h1>", unsafe_allow_html=True)
18
+
19
+ # Introduction section with improved styling and details
20
+ st.markdown(
21
+ """
22
+ <div class="st-eb">
23
+ <p style="color: black;">Creating presentations has never been this easy and exciting! With our AI-powered model, you can quickly generate presentation content, while the design remains your creative canvas. 🎨</p>
24
+ <p style="color: black;">Here's what we do:</p>
25
+ <ul>
26
+ <li style="color: black;"><strong>You provide the presentation topic</strong>, and we add captivating content.</li>
27
+ <li style="color: black;">Our AI ensures <strong>each slide has the perfect balance of information</strong>.</li>
28
+ <li style="color: black;">Stay tuned for <strong>exciting future features</strong> that will enhance your presentation experience. πŸš€</li>
29
+ </ul>
30
+ </div>
31
+ """,
32
+ unsafe_allow_html=True,
33
+ )
34
+
35
+ # Presentation Limits section with improved styling and details
36
+ st.markdown("<h2>Presentation Limits</h2>", unsafe_allow_html=True)
37
+ st.markdown(
38
+ """
39
+ <div class="st-eb">
40
+ <p style="color: black;">✨ You can create a minimum of 3 and a maximum of 7 slides per presentation.</p>
41
+ <p style="color: black;">✨ Each slide should have between 3 and 7 points of content.</p>
42
+ <p style="color: black;">✨ Minimum 3 points, maximum 7 points. ⚠️</p>
43
+ </div>
44
+ """,
45
+ unsafe_allow_html=True,
46
+ )
47
+
48
+ # Important Notice with improved styling
49
+ st.warning("⚠️ Important Notice: Occasional download issues? Try re-downloading or reach out to us for assistance. We apologize for any inconvenience.")
50
+
51
+ # Input for presentation topic with improved styling
52
+ presentation_title = st.text_input("πŸ“ Enter your presentation topic:")
53
+ no_of_pages = st.number_input("πŸ“Š Number of slides you want (3-8)", min_value=3, max_value=8, value=3)
54
+ least_c = st.number_input("πŸ“Š Minimum points in each slide (3-7)", min_value=3, max_value=7, value=3)
55
+ max_c = st.number_input("πŸ“Š Maximum points in each slide (4-7)", min_value=4, max_value=7, value=7)
56
+
57
+ # Check if any input values are out of range
58
+ 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:
59
+ st.warning("Invalid input values. Please ensure that your inputs are within the specified limits.")
60
+ else:
61
+ if st.button("Generate Presentation"):
62
+ # Check if the user has entered a topic
63
+ if presentation_title:
64
+ question = (
65
+ f"generate a {no_of_pages} slide presentation for the topic {presentation_title}."
66
+ f" Each slide should have {{header}}, {{content}}, should have at least {least_c} points and max {max_c} points in content. Return as JSON"
67
+ )
68
+
69
+ query_json = {
70
+ "input_text": question,
71
+ "output_format": "json",
72
+ "json_structure": {"slides": "{{presentation_slides}}"},
73
+ }
74
+
75
+ # Send the query to OpenAI
76
+ completion = openai.ChatCompletion.create(
77
+ model="gpt-3.5-turbo",
78
+ messages=[{"role": "user", "content": json.dumps(query_json)}],
79
+ )
80
 
81
+ try:
82
+ response = json.loads(completion.choices[0].message.content)
83
+
84
+ slide_data = response["slides"]
85
+
86
+ prs = Presentation()
87
+
88
+ from pptx.util import Pt
89
+ from pptx.enum.text import PP_ALIGN
90
+
91
+ for slide in slide_data:
92
+ slide_layout = prs.slide_layouts[1]
93
+ new_slide = prs.slides.add_slide(slide_layout)
94
+
95
+ if slide["header"]:
96
+ title = new_slide.shapes.title
97
+ title.text = slide["header"]
98
+
99
+ if slide["content"]:
100
+ shapes = new_slide.shapes
101
+ body_shape = shapes.placeholders[1]
102
+ tf = body_shape.text_frame
103
+
104
+ content_text = "\n".join(slide["content"])
105
+
106
+ p = tf.add_paragraph()
107
+ p.text = content_text
108
+
109
+ p.space_after = Pt(14)
110
+ p.alignment = PP_ALIGN.LEFT
111
+
112
+ # Explicitly save the file with the .pptx extension
113
+ presentation_filename = f"{presentation_title}.pptx"
114
+ prs.save(presentation_filename)
115
+
116
+ # Provide a direct download link to the saved file
117
+ if os.path.exists(presentation_filename):
118
+ with open(presentation_filename, "rb") as file:
119
+ file_bytes = file.read()
120
+ st.download_button(
121
+ label=f"πŸ“₯ Download {presentation_title}",
122
+ data=file_bytes,
123
+ file_name=presentation_filename,
124
+ key=f"download_{presentation_filename}",
125
+ )
126
+
127
+ os.remove(presentation_filename)
128
+ else:
129
+ st.error("Error: Presentation file not found.")
130
+
131
+ except json.JSONDecodeError as e:
132
+ st.error("Error parsing JSON response from OpenAI.")
133
+ else:
134
+ st.warning("Please enter a presentation topic.")