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()