|
|
|
import streamlit as st |
|
import os |
|
import glob |
|
import base64 |
|
import pandas as pd |
|
import fitz |
|
from PIL import Image |
|
from io import BytesIO |
|
from datetime import datetime |
|
from reportlab.pdfgen import canvas |
|
from reportlab.lib.utils import ImageReader |
|
from markdown2 import markdown |
|
|
|
|
|
st.set_page_config( |
|
page_title="Vision & Layout Titans π", |
|
page_icon="π€", |
|
layout="wide" |
|
) |
|
|
|
|
|
def get_files(exts): |
|
files = [] |
|
for ext in exts: |
|
files.extend(glob.glob(f'*.{ext}')) |
|
return sorted([f for f in files if f.lower() != "readme.md"]) |
|
|
|
def image_to_pdf(images, md_files): |
|
buffer = BytesIO() |
|
c = canvas.Canvas(buffer) |
|
|
|
for img_path in images: |
|
img = Image.open(img_path) |
|
width, height = img.size |
|
c.setPageSize((width, height)) |
|
c.drawImage(ImageReader(img), 0, 0, width, height) |
|
c.showPage() |
|
|
|
for md_path in md_files: |
|
with open(md_path, 'r', encoding='utf-8') as f: |
|
md_content = f.read() |
|
html = markdown(md_content) |
|
c.setPageSize((595, 842)) |
|
c.setFont("Helvetica", 10) |
|
c.drawString(50, 800, md_content[:1000]) |
|
c.showPage() |
|
|
|
c.save() |
|
buffer.seek(0) |
|
return buffer |
|
|
|
def render_pdf_gallery(pdf_files): |
|
for pdf_file in pdf_files: |
|
doc = fitz.open(pdf_file) |
|
page = doc.load_page(0) |
|
pix = page.get_pixmap(matrix=fitz.Matrix(0.5, 0.5)) |
|
img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples) |
|
st.image(img, caption=os.path.basename(pdf_file)) |
|
|
|
|
|
st.sidebar.header("Content Management") |
|
|
|
image_files = get_files(['png', 'jpg', 'jpeg']) |
|
pdf_files = get_files(['pdf']) |
|
md_files = get_files(['md']) |
|
|
|
selected_images = st.sidebar.multiselect("Select Images", image_files) |
|
selected_md_files = st.sidebar.multiselect("Select Markdown Files", md_files) |
|
|
|
|
|
if st.sidebar.checkbox("Show PDF Gallery"): |
|
render_pdf_gallery(pdf_files) |
|
|
|
|
|
st.sidebar.subheader("Reorder Content for PDF") |
|
content_df = pd.DataFrame({ |
|
"Content": selected_images + selected_md_files, |
|
"Type": ["Image"] * len(selected_images) + ["Markdown"] * len(selected_md_files), |
|
"Order": range(len(selected_images) + len(selected_md_files)) |
|
}) |
|
|
|
edited_df = st.sidebar.data_editor(content_df, use_container_width=True) |
|
sorted_contents = edited_df.sort_values('Order')['Content'].tolist() |
|
|
|
if st.sidebar.button("Generate PDF"): |
|
sorted_images = [item for item in sorted_contents if item in selected_images] |
|
sorted_md_files = [item for item in sorted_contents if item in selected_md_files] |
|
pdf_buffer = image_to_pdf(sorted_images, sorted_md_files) |
|
st.sidebar.download_button("Download PDF", pdf_buffer, "output.pdf") |
|
|
|
|
|
st.sidebar.subheader("Delete Files") |
|
file_to_delete = st.sidebar.selectbox("Select file to delete", image_files + pdf_files + md_files) |
|
if st.sidebar.button("Delete Selected File"): |
|
os.remove(file_to_delete) |
|
st.sidebar.success(f"Deleted {file_to_delete}") |
|
st.rerun() |
|
|
|
|
|
st.title("Vision & Layout Titans π") |
|
st.markdown("### Manage, View, and Export Your Files Easily!") |
|
|
|
|
|
st.subheader("Selected Images") |
|
for img_path in selected_images: |
|
img = Image.open(img_path) |
|
st.image(img, caption=os.path.basename(img_path)) |
|
|
|
|
|
st.subheader("Selected Markdown") |
|
for md_path in selected_md_files: |
|
with open(md_path, 'r', encoding='utf-8') as f: |
|
md_content = f.read() |
|
st.markdown(md_content[:500] + '...') |
|
|