import ezdxf

def dxf_to_svg_string(dxf_filepath):
    doc = ezdxf.readfile(dxf_filepath)
    msp = doc.modelspace()

    min_x, min_y, max_x, max_y = float('inf'), float('inf'), float('-inf'), float('-inf')

    for entity in msp:
        if hasattr(entity, 'dxf'):
            if entity.dxftype() == 'LINE':
                min_x = min(min_x, entity.dxf.start[0], entity.dxf.end[0])
                min_y = min(min_y, entity.dxf.start[1], entity.dxf.end[1])
                max_x = max(max_x, entity.dxf.start[0], entity.dxf.end[0])
                max_y = max(max_y, entity.dxf.start[1], entity.dxf.end[1])
            elif entity.dxftype() == 'CIRCLE':
                cx, cy, r = entity.dxf.center[0], entity.dxf.center[1], entity.dxf.radius
                min_x = min(min_x, cx - r)
                min_y = min(min_y, cy - r)
                max_x = max(max_x, cx + r)
                max_y = max(max_y, cy + r)

    width = max_x - min_x
    height = max_y - min_y

    svg = [
        '<?xml version="1.0" encoding="UTF-8" standalone="no"?>',
        f'<svg xmlns="http://www.w3.org/2000/svg" width="{width}" height="{height}" viewBox="{min_x} {min_y} {width} {height}">'
    ]

    for entity in msp:
        if entity.dxftype() == 'LINE':
            x1, y1 = entity.dxf.start
            x2, y2 = entity.dxf.end
            svg.append(f'<line x1="{x1}" y1="{y1}" x2="{x2}" y2="{y2}" stroke="black" stroke-width="1"/>')
        elif entity.dxftype() == 'CIRCLE':
            cx, cy, r = entity.dxf.center[0], entity.dxf.center[1], entity.dxf.radius
            svg.append(f'<circle cx="{cx}" cy="{cy}" r="{r}" stroke="black" stroke-width="1" fill="none"/>')

    svg.append('</svg>')
    return '\n'.join(svg)
