markdownPDF / app.py
codelion's picture
Update app.py
0d53c5f verified
raw
history blame
3.54 kB
# 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)