Update: I used chatGPT to help me figure this out. For future people's reference, here's some sample code to help accomplish this:
import streamlit as st
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet
import io
def create_pdf_buffer(elements):
"""Takes a list of ReportLab Flowable elements and returns a PDF buffer."""
buffer = io.BytesIO()
doc = SimpleDocTemplate(buffer, pagesize=letter)
doc.build(elements)
buffer.seek(0)
return buffer
# Streamlit app
st.title("PDF Generator with ReportLab and Streamlit")
# User input
user_list = st.text_area("Enter list items (one per line):").splitlines()
# Only proceed if there's input
if user_list:
styles = getSampleStyleSheet()
elements = []
# Build elements list outside of PDF function
elements.append(Paragraph("Sample PDF Report", styles['Title']))
elements.append(Spacer(1, 12))
for item in user_list:
elements.append(Paragraph(f"- {item}", styles['Normal']))
elements.append(Spacer(1, 6))
# Generate PDF buffer
pdf_buffer = create_pdf_buffer(elements)
# Download button
st.download_button(
label="Download PDF",
data=pdf_buffer,
file_name="report.pdf",
mime="application/pdf"
)