Estoy tratando de agregar algo de texto a un archivo SVG. El texto es dinámico y se muestra sobre un rectángulo que actúa como fondo.
Dado que el texto es dinámico, el ancho del rectángulo de fondo también debe ser dinámico. Entonces, para ser consistente, estoy usando una fuente monoespaciada de ancho fijo (Droid Sans Mono) y calculo el ancho del rectángulo de fondo usando la expresión - (x*6.4)+4)
, donde x
es el número de caracteres en el texto, y se agrega 4 para relleno (2 a la izquierda, 2 a la derecha). Además, suponiendo que ese 6.4
sea el ancho promedio de cada carácter en la Droid Sans Mono
fuente (solo una suposición).
Entonces, para el texto Ruby on Rails
, el número de caracteres es 13, por lo que el ancho del rectángulo de fondo es 13*6.4+4 = 87.2
.
El cual funciona perfectamente en navegadores (Firefox y Chromium) en Ubuntu . Sin embargo, cuando se ve en los mismos navegadores (Firefox y Chrome) en Windows , el texto desborda el rectángulo.
Entonces, mi pregunta es, ¿cómo puedo asegurarme de que la imagen tenga un aspecto uniforme en diferentes sistemas operativos? La imagen tiene un aspecto consistente en todos los navegadores en el mismo sistema operativo.
Incluyo una imagen de ejemplo como referencia:
ACTUALIZAR
Tal vez debería reformular mi pregunta: dentro de un archivo SVG, ¿cómo puedo hacer que una fuente de ancho fijo tome la misma cantidad de píxeles en todas las plataformas, asumiendo que el archivo SVG no se ve afectado por ningún estilo CSS externo y el nivel de zoom es normal?
Además, entiendo que existen tecnologías alternativas (PNG, etc.), pero no todas las preguntas de SVG deben terminar reemplazándolo con PNG . También más que una solución, me interesa entender por qué existe este problema con SVG. Estoy usando una fuente de ancho fijo que se supone que debe tomar la misma cantidad de píxeles en todos los sistemas operativos (¿Es esta suposición incorrecta? ¿Por qué? ¿Qué puedo hacer al respecto?).
capturas de pantalla
Ubuntu 12.04 amd64 / Firefox 13
Ubuntu 12.04 amd64 / cromo 18
Windows 7 de 32 bits (dentro de VirtualBox) / Google Chrome 18
Windows 7 de 32 bits (dentro de VirtualBox) / Firefox 13
Dado que solo ha vinculado el SVG y no proporcionó una captura de pantalla para mostrar cuál es su problema, solo puedo guiarme por lo que veo. La imagen que se muestra en la pregunta se representa incorrectamente porque no es el tipo de letra adecuado, por lo que su representación está desactivada porque su cálculo se basa en un tamaño y espaciado de letra diferente (veo Courier). Si veo el SVG en una pestaña nueva (o sigo el enlace para el enlace directo), se representa correctamente con Droid Sans Mono y el tamaño de rectángulo adecuado.
Básicamente, su problema es un problema de CSS en el que un contenedor principal o un método de llamada incorrecto borran el tipo de letra. En este sentido, estaría de acuerdo con Lollero en que está fuera de tema para GD.
Una forma de manejar esto es almacenar el archivo de fuente en su servidor y renderizarlo usando llamadas PHP GD (bastante trivial). Puede almacenar el resultado con una suma de verificación, etc., de modo que vuelva a representar la imagen solo si el texto cambia y, de lo contrario, use la copia almacenada.
EDITAR:___________
Una captura de pantalla de su archivo svg en win7 64bit firefox:
El contenido de texto sin formato de su archivo SVG (XML)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg version="1.1" baseProfile="basic" xmlns="http://www.w3.org/2000/svg" height="14">
<defs>
<style type="text/css">
<![CDATA[
@import url(https://fonts.googleapis.com/css?family=Droid+Sans+Mono);
]]>
</style>
<linearGradient id="g1">
<stop stop-color="#222" offset="0%"/>
<stop stop-color="#444" offset="100%"/>
</linearGradient>
<linearGradient id="g2">
<stop stop-color="#2a2" offset="0%"/>
<stop stop-color="#0a0" offset="100%"/>
</linearGradient>
</defs>
<!-- Extra rectangles on left & right for the rounded corners -->
<rect x="0" y="0" width="16" height="14" fill="#222" rx="4" ry="4"/>
<rect x="129.6" y="0" width="8" height="14" fill="#0a0" rx="4" ry="4"/>
<rect x="4" y="0" width="87.2" height="14" fill="url(#g1)" />
<rect x="91.2" y="0" width="42.4" height="14" fill="url(#g2)" />
<text x="6.0" y="10" font-size="10.5" font-family="'Droid Sans Mono', monospace" text-anchor="start" fill="#fff">Ruby on Rails</text>
<text x="93.2" y="10" font-size="10.5" font-family="'Droid Sans Mono', monospace" text-anchor="start" fill="#fff">1 vote</text>
</svg>
<img />
etiqueta, por lo que el CSS externo no debería afectar (AFAIK). También he incluido capturas de pantalla. Gracias.
Joonas
Horacio
Joonas
Joonas
Joonas
Horacio
Note also that your jsfiddle example wraps to two lines on my browser (breaks between
yvote
).`--) La solución real es no confiar en el lado del cliente si es posible en mi opinión, pero esta no es la pregunta que se hace.Joonas
Horacio
Joonas
Joonas
scott
Vikrant Chaudhary
@font-face
.