Spaces:
Sleeping
Sleeping
File size: 3,054 Bytes
26b6d1f c096202 26b6d1f c096202 26b6d1f 254147d c096202 26b6d1f abbee29 26b6d1f c096202 26b6d1f c096202 26b6d1f 254147d b6b9260 26b6d1f c096202 254147d c096202 26b6d1f c096202 26b6d1f c096202 26b6d1f c096202 abbee29 c096202 abbee29 c096202 26b6d1f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
import fitz # PyMuPDF for PDF manipulation
import gradio as gr
import tempfile
import re
# Convert inches to pixels for dimension scaling
def inches_to_pixels(inches, dpi=300):
return int(inches * dpi)
# Convert PDF to SVG with specified dimensions and thickness scaling
def pdf_to_svg(pdf_file, width_in, height_in, thickness_scale=1.0):
try:
# Open the PDF and load the first page
pdf_document = fitz.open(pdf_file.name)
page = pdf_document.load_page(0)
# Render PDF page as SVG data using a high-resolution matrix
svg_data = page.get_svg_image(matrix=fitz.Matrix(8, 8)) # 8x scaling for high fidelity
# Ensure we have valid SVG data
if not svg_data:
print("Error: SVG data extraction failed.")
return None
# Adjust stroke width in the SVG data if thickness scaling is applied
if thickness_scale != 1.0:
svg_data = re.sub(
r'stroke-width="([\d.]+)"',
lambda match: f'stroke-width="{float(match.group(1)) * thickness_scale}"',
svg_data
)
# Convert width and height to pixels at 300 DPI for SVG scaling
width_px = inches_to_pixels(width_in)
height_px = inches_to_pixels(height_in)
# Embed dimensions into the SVG
svg_data = re.sub(r'width="([\d.]+)pt"', f'width="{width_px}px"', svg_data)
svg_data = re.sub(r'height="([\d.]+)pt"', f'height="{height_px}px"', svg_data)
# Save SVG data to a temporary file
temp_svg_path = tempfile.mktemp(suffix=".svg", prefix="enhanced_diagram_")
with open(temp_svg_path, 'w') as svg_file:
svg_file.write(svg_data)
return temp_svg_path # Return path of the saved SVG
except Exception as e:
print(f"Error during SVG conversion: {str(e)}")
return None
# Gradio Interface with width and height inputs
def adjust_and_convert_pdf(pdf_file, width_in, height_in, thickness_scale=1.0):
svg_path = pdf_to_svg(pdf_file, width_in, height_in, thickness_scale=thickness_scale)
# Handle cases where the SVG path is None
if svg_path is None:
return "Error: Unable to convert PDF to editable SVG."
return svg_path # Return the SVG file path for download
# Gradio interface with width, height, and thickness scale inputs
iface = gr.Interface(
fn=adjust_and_convert_pdf,
inputs=[
gr.File(label="Upload PDF"),
gr.Number(label="Width (inches)", value=5.0),
gr.Number(label="Height (inches)", value=4.0),
gr.Slider(minimum=1, maximum=3, step=0.1, value=1.0, label="Thickness Scale")
],
outputs=gr.File(label="Editable SVG"),
title="PDF to Fully Editable SVG Converter for CorelDRAW",
description="Upload a PDF to convert it to a fully editable SVG with specific width and height dimensions in inches. Ideal for CorelDRAW editing."
)
# Launch the interface on Hugging Face Spaces
iface.launch() |