import gradio as gr from wand.image import Image import tempfile import os import subprocess def convert_eps_to_svg(eps_file): """ Convert EPS file to SVG using multiple methods """ if eps_file is None: return None, "Please upload an EPS file" try: # Create temporary file for output with tempfile.NamedTemporaryFile(delete=False, suffix='.svg') as tmp_svg: svg_path = tmp_svg.name # Method 1: Try using Inkscape (best for vector preservation) try: result = subprocess.run( ['inkscape', eps_file.name, '--export-type=svg', f'--export-filename={svg_path}'], capture_output=True, text=True, timeout=30 ) if result.returncode == 0 and os.path.exists(svg_path) and os.path.getsize(svg_path) > 0: return svg_path, "Conversion successful using Inkscape! Download your SVG file below." except Exception as e: print(f"Inkscape method failed: {e}") # Method 2: Try using Ghostscript to convert EPS to PDF, then PDF to SVG try: with tempfile.NamedTemporaryFile(delete=False, suffix='.pdf') as tmp_pdf: pdf_path = tmp_pdf.name # EPS to PDF with Ghostscript subprocess.run( ['gs', '-dNOPAUSE', '-dBATCH', '-sDEVICE=pdfwrite', f'-sOutputFile={pdf_path}', eps_file.name], check=True, capture_output=True, timeout=30 ) # PDF to SVG with Inkscape subprocess.run( ['inkscape', pdf_path, '--export-type=svg', f'--export-filename={svg_path}'], check=True, capture_output=True, timeout=30 ) os.unlink(pdf_path) if os.path.exists(svg_path) and os.path.getsize(svg_path) > 0: return svg_path, "Conversion successful using Ghostscript + Inkscape! Download your SVG file below." except Exception as e: print(f"Ghostscript method failed: {e}") # Method 3: Fallback to Wand/ImageMagick (rasterizes to PNG first) with tempfile.NamedTemporaryFile(delete=False, suffix='.png') as tmp_png: png_path = tmp_png.name with Image(filename=eps_file.name, resolution=300) as img: img.format = 'png' img.save(filename=png_path) # Convert PNG to SVG using potrace subprocess.run( ['convert', png_path, 'pnm:-'], stdout=subprocess.PIPE, check=True ) with Image(filename=png_path) as img: img.format = 'svg' img.save(filename=svg_path) os.unlink(png_path) return svg_path, "Conversion successful using ImageMagick (rasterized)! Download your SVG file below." except Exception as e: return None, f"Error during conversion: {str(e)}" # Create Gradio interface with gr.Blocks(title="EPS to SVG Converter") as app: gr.Markdown("# EPS to SVG Converter") gr.Markdown("Upload an EPS file to convert it to SVG format using Ghostscript and ImageMagick.") with gr.Row(): with gr.Column(): eps_input = gr.File( label="Upload EPS File", file_types=[".eps"], type="filepath" ) convert_btn = gr.Button("Convert to SVG", variant="primary") with gr.Column(): status_output = gr.Textbox(label="Status", interactive=False) svg_output = gr.File(label="Download SVG") convert_btn.click( fn=convert_eps_to_svg, inputs=[eps_input], outputs=[svg_output, status_output] ) gr.Markdown(""" ### How to use: 1. Upload an EPS file using the file picker 2. Click 'Convert to SVG' button 3. Download the converted SVG file ### Requirements: - Ghostscript (for EPS processing) - ImageMagick (for format conversion) - Python Wand library (ImageMagick binding) """) if __name__ == "__main__": app.launch(server_name="0.0.0.0", server_port=7860)