Spaces:
Sleeping
Sleeping
# app.py | |
import gradio as gr | |
import markdown | |
import tempfile | |
import os | |
from weasyprint import HTML | |
from pathlib import Path | |
def convert_markdown_to_pdf(markdown_file): | |
""" | |
Convert uploaded markdown file to PDF and return both preview HTML and PDF path | |
""" | |
if markdown_file is None: | |
return None, None | |
# Read the markdown content | |
markdown_content = markdown_file.decode('utf-8') | |
# Convert markdown to HTML | |
html_content = markdown.markdown(markdown_content) | |
# Wrap HTML content with proper HTML structure and CSS | |
full_html = f""" | |
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta charset="UTF-8"> | |
<style> | |
@page {{ | |
margin: 2.5cm; | |
}} | |
body {{ | |
font-family: Arial, sans-serif; | |
line-height: 1.6; | |
max-width: 800px; | |
margin: 0 auto; | |
padding: 20px; | |
}} | |
h1 {{ color: #2c3e50; margin-top: 1em; }} | |
h2 {{ color: #34495e; margin-top: 0.8em; }} | |
code {{ | |
background-color: #f7f7f7; | |
padding: 2px 5px; | |
border-radius: 3px; | |
font-family: monospace; | |
}} | |
pre {{ | |
background-color: #f7f7f7; | |
padding: 15px; | |
border-radius: 5px; | |
white-space: pre-wrap; | |
font-family: monospace; | |
}} | |
</style> | |
</head> | |
<body> | |
{html_content} | |
</body> | |
</html> | |
""" | |
# Create temporary file for PDF | |
with tempfile.NamedTemporaryFile(delete=False, suffix='.pdf') as pdf_file: | |
pdf_path = pdf_file.name | |
# Convert HTML to PDF using WeasyPrint | |
try: | |
HTML(string=full_html).write_pdf(pdf_path) | |
return full_html, pdf_path | |
except Exception as e: | |
print(f"Error converting to PDF: {e}") | |
if os.path.exists(pdf_path): | |
os.unlink(pdf_path) | |
return None, None | |
def process_file(file): | |
""" | |
Process the uploaded file and return preview and PDF download | |
""" | |
if file is None: | |
return None, None | |
preview_html, pdf_path = convert_markdown_to_pdf(file) | |
if preview_html is None or pdf_path is None: | |
return "Error converting file", None | |
return preview_html, pdf_path | |
# Create Gradio interface | |
with gr.Blocks() as app: | |
gr.Markdown("# Markdown to PDF Converter") | |
gr.Markdown("Upload a markdown file to convert it to PDF. You can preview the result and download the PDF.") | |
with gr.Row(): | |
file_input = gr.File(label="Upload Markdown File", file_types=[".md", ".markdown"]) | |
with gr.Row(): | |
preview = gr.HTML(label="Preview") | |
pdf_output = gr.File(label="Download PDF") | |
file_input.upload( | |
fn=process_file, | |
inputs=[file_input], | |
outputs=[preview, pdf_output] | |
) | |
if __name__ == "__main__": | |
app.launch() |