# app.py import gradio as gr import markdown import pdfkit import tempfile import os 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 full_html = f""" {html_content} """ # Create temporary files for HTML and PDF with tempfile.NamedTemporaryFile(delete=False, suffix='.html') as html_file: html_file.write(full_html.encode('utf-8')) html_path = html_file.name pdf_path = html_path.replace('.html', '.pdf') # Convert HTML to PDF using pdfkit try: pdfkit.from_file(html_path, pdf_path) os.unlink(html_path) # Clean up temporary HTML file return full_html, pdf_path except Exception as e: print(f"Error converting to PDF: {e}") if os.path.exists(html_path): os.unlink(html_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()