2011-07-17 23 views
5

Estoy generando una imagen SVG en python (puro, sin libretas externas aún). Quiero saber cuál será el tamaño de un elemento de texto antes de colocarlo correctamente. ¿Alguna buena idea de cómo hacerlo? Revisé pysvg biblioteca, pero no vi nada como getTextSize()obtener el tamaño del texto svg en python

Respuesta

1

Esto puede ser ser bastante complicado. Para empezar, deberá familiarizarse con chapter on text de la especificación SVG. Suponiendo que se desea obtener el ancho de llanura text elementos, y no textpath elementos, como mínimo habría que:

  • analizar el font selection properties, spacing properties y leer el attibute xml:space, así como la propiedad writing-mode (también puede ser de arriba hacia abajo en lugar de solo de izquierda a derecha y de derecha a izquierda).
  • Basado en lo anterior, abra la fuente correcta y lea los datos de glifos y extraiga los anchos y alturas de los glifos en su cadena de texto. Solo encontrar la fuente puede ser una gran tarea, ver los múltiples lugares donde pueden esconderse los archivos de fuentes.
  • (opcionalmente) Mire a través de la cadena para posible ligatures (dependiendo del idioma), y reemplácelos con el glifo correcto si existe en la fuente.
  • Agregue los anchos para todos los caracteres y espacios, el último dependiendo de las propiedades de espaciado y (opcionalmente) posibles kerning pares.

Una posible solución sería utilizar la biblioteca pango. Puede encontrar enlaces de python para él en py-gtk. Lamentablemente, a excepción de algunos examples, la documentación para los enlaces de python es bastante escasa. Pero se ocuparía de los detalles de la carga de la fuente y de determinar las extensiones de un Layout.

Otra forma es estudiar el renderizador SVG en su navegador. Pero, p. el soporte para el texto SVG en Firefox es limited.

También es instructivo estudiar cómo TeX lo hace, especialmente el concept (pdf) de las cajas (por letras) y pegamento (para el espaciado).

1

Tenía exactamente el mismo problema, pero tenía una fuente de ancho variable. Lo resolví tomando el elemento de texto (fuente y contenido correctos) que quería, lo escribí en un archivo svg y usé Inkscape instalado en mi PC para renderizar el dibujo en un archivo png temporal. Luego leí las dimensiones del archivo png (extraído del encabezado), eliminé los archivos svg y png de temperatura y usé el resultado para colocar el texto donde quería y los elementos que lo rodeaban.

Encontré que la representación en un dibujo, usando un DPI de 90 parecía darme los números exactos que necesitaba, o los números nativos usados ​​en svgwrite como un todo. -D es la bandera que se debe usar para que solo se represente el elemento dibujable, es decir, el texto.

os.cmd(/cygdrive/c/Program\ Files\ \(x86\)/Inkscape/inkscape.exe -f work_temp.svg -e work_temp.png -d 90 -D) 

que utilizan estas funciones para extraer los números png, que se encuentran en este link, tenga en cuenta la mina se corrige ligeramente para python3 (sigue trabajando en python2)

def is_png(data): 
    return (data[:8] == b'\x89PNG\r\n\x1a\n'and (data[12:16] == b'IHDR')) 

def get_image_info(data): 
    if is_png(data): 
     w, h = struct.unpack('>LL', data[16:24]) 
     width = int(w) 
     height = int(h) 
    else: 
     raise Exception('not a png image') 
    return width, height 

if __name__ == '__main__': 
    with open('foo.png', 'rb') as f: 
     data = f.read() 

    print is_png(data) 
    print get_image_info(data) 

Es torpe, pero funcionó

Cuestiones relacionadas