# app.py import gradio as gr import markdown import tempfile import os from weasyprint import HTML, CSS from pathlib import Path def convert_markdown_to_pdf(file_obj): """ Convert uploaded markdown file to PDF and return both preview HTML and PDF path """ if file_obj is None: return None, None try: # Read the markdown content from the file object if hasattr(file_obj, 'name'): # If it's a file path with open(file_obj.name, 'r', encoding='utf-8') as f: markdown_content = f.read() else: # If it's already string content markdown_content = str(file_obj) # Convert markdown to HTML html_content = markdown.markdown( markdown_content, extensions=['extra', 'codehilite'] ) # Create temporary file for PDF pdf_path = tempfile.mktemp(suffix='.pdf') # Define styles styles = ''' @page { size: A4; margin: 2.5cm; } body { font-family: Arial, sans-serif; line-height: 1.6; 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; } p { margin-bottom: 1em; } ''' # Create HTML document html = HTML(string=f'''
{html_content} ''') # Render PDF document = html.render() document.write_pdf(target=pdf_path) return html_content, pdf_path except Exception as e: print(f"Error converting to PDF: {e}") if 'pdf_path' in locals() and 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(share=True)