Spaces:
Sleeping
Sleeping
| # 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''' | |
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <style>{styles}</style> | |
| </head> | |
| <body> | |
| {html_content} | |
| </body> | |
| </html> | |
| ''') | |
| # 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) |