Volver a la wiki

Servicio: Conversor EMF → SVG/PNG (stencils Visio)

Ubicación

racks/utils/visio_parser.py — módulo convert_emf_only_svgs() y helpers.

Propósito

Convertir arte bitmap incrustado (EMF) de stencils Visio a formatos renderizables por navegador (PNG/SVG vectorial). Dirigido a fabricantes como Cisco que distribuyen stencils con arte nativo de Windows en lugar de geometría Visio.

Interfaz pública

convert_emf_only_svgs(temp_dir, svg_names, png_width=2400, timeout=600)

Entrada:

Salida:

Comportamiento:

  1. Itera los SVGs detectando svg_is_emf_only().
  2. Extrae EMF de los datos base64 a un subdirectorio _emf2png/.
  3. Lote 1: liboffice convierte todos los EMF a SVG vectorial en una sola invocación.
  4. Rasterizado: rsvg-convert transforma SVG→PNG a png_width px.
  5. Lote 2 (fallback): si rsvg falló, liboffice convierte EMF→PNG directo.
  6. Postprocesa cada PNG exitoso (blanco→transparente, autocrop, escalado).
  7. Borra el SVG original si hay PNG reemplazante.
  8. Limpia el directorio temporal _emf2png/.

Excepciones:

Casos de uso:


svg_is_emf_only(svg_text)

Entrada:

Salida:

Lógica:

Usos:


_postprocess_stencil_png(png_path, min_width=800)

Entrada:

Salida:

Operaciones (todas en C vía Pillow, sin loop por píxel):

  1. Convierte RGBA.
  2. Identifica “casi-blanco” (R≥240 AND G≥240 AND B≥240) con ImageChops.darker() (AND bitwise).
  3. Resta casi-blanco del canal alpha → blanco→transparente.
  4. Autocrop por bbox del alpha.
  5. Si width < min_width, escala (LANCZOS).
  6. Guarda PNG.

Robustez:


Datos de entrada


Datos de salida


Dependencias


Limitaciones y trade-offs

  1. Memoria: LibreOffice puede picar >500 MB con ficheros de 40 MB. No es escalable a stencils muy grandes (>100 MB).
  2. Tiempo: EMF→SVG lleva minutos en lote; EMF→PNG es más rápido pero con menos calidad.
  3. Fallidos se descartan: no hay reintento. Un master sin convertir no aparece en la librería.
  4. Auto-reparación: los stencils importados rotos (pre-fix) no se arreglan sin re-importar.

Integración con flujo de importación

Llamado desde racks.tasks.convert_visio_async() tras libvisio_ng.convert():

  1. Detección: itera SVGs, identifica solo-EMF.
  2. Conversión: convert_emf_only_svgs().
  3. Validación post-conversión: comprueba que no hayan quedado SVGs solo-EMF sin convertir → los descarta con warning.
  4. Metadatos: los nombres de master, altura en U, etc., se preservan (este servicio solo toca imágenes).

Testing


Véase también

Subir