|
import streamlit as st |
|
import qrcode |
|
from qrcode.image.pil import PilImage |
|
from PIL import Image |
|
import io |
|
import base64 |
|
from urllib.parse import urlparse |
|
|
|
|
|
|
|
def get_image_as_base64(image: Image): |
|
buffer = io.BytesIO() |
|
image.save(buffer, format="PNG") |
|
image_base64 = base64.b64encode(buffer.getvalue()).decode('utf-8') |
|
return image_base64 |
|
|
|
def get_url_filename(url): |
|
parsed_uri = urlparse(url) |
|
domain = '{uri.netloc}'.format(uri=parsed_uri) |
|
main_domain = domain.split('.') |
|
main_domain = main_domain[1] if main_domain[0] == 'www' else main_domain[0] |
|
path = parsed_uri.path.strip('/').replace('/', '_') |
|
return f"{main_domain}_{path}" if path else main_domain |
|
|
|
|
|
|
|
|
|
|
|
st.title("Bulk QR Code Generator") |
|
st.write("This is a simple Streamlit web app for generating QR codes based on user input. You can choose between generating a QR code for a URL or plain text with the ability to generate multiple URLs at once.") |
|
|
|
|
|
qr_content_options = ["URL", "Text"] |
|
|
|
qr_content_type = st.selectbox("Select QR content type", qr_content_options) |
|
|
|
if qr_content_type == "Contact Information": |
|
first_name = st.text_input("First Name") |
|
last_name = st.text_input("Last Name") |
|
phone = st.text_input("Phone Number") |
|
email = st.text_input("Email Address") |
|
content = f"BEGIN:VCARD\nVERSION:3.0\nN:{last_name};{first_name}\nFN:{first_name} {last_name}\nTEL;TYPE=CELL:{phone}\nEMAIL:{email}\nEND:VCARD" |
|
else: |
|
content = st.text_area("Enter your content (one per line for multiple QR codes)", height=150) |
|
|
|
if st.button("Generate QR Code"): |
|
if content: |
|
contents = content.split("\n") |
|
|
|
for i, c in enumerate(contents): |
|
if c.strip(): |
|
|
|
qr = qrcode.QRCode( |
|
version=1, |
|
error_correction=qrcode.constants.ERROR_CORRECT_H, |
|
box_size=10, |
|
border=4 |
|
) |
|
qr.add_data(c) |
|
qr.make(fit=True) |
|
|
|
img = qr.make_image(fill_color="black", back_color="white", image_factory=PilImage) |
|
|
|
|
|
buffer = io.BytesIO() |
|
img.save(buffer, format="PNG") |
|
img_bytes = buffer.getvalue() |
|
|
|
img_base64 = get_image_as_base64(img) |
|
|
|
st.markdown(f"##### {c}") |
|
st.image(img_bytes, caption=f"QR code for {c}", use_column_width=True) |
|
file_name = get_url_filename(c) if qr_content_type == "URL" else f"QR_{i}" |
|
st.markdown(f'<a href="data:image/png;base64,{img_base64}" download="{file_name}.png" style="display:inline-block;background-color:#4CAF50;border:none;color:white;padding:8px 16px;text-align:center;text-decoration:none;font-size:16px;margin:4px 2px;cursor:pointer;">Download QR code</a>', unsafe_allow_html=True) |
|
else: |
|
st.error("Please enter content for the QR code.") |
|
|
|
|
|
|
|
|