2009-08-28 16 views
29

Intento generar automáticamente un archivo SVG destinado a imprimirse en un tamaño determinado (A4). Deseo usar un camino en él, que solo permita 'unidades de usuario', no 'unidades absolutas'.SVG y DPI, unidades absolutas y unidades de usuario: Inkscape vs. Firefox vs. ImageMagick

Me parece que es imposible 'publicar' un archivo SVG que tenga unidades absolutas (por ejemplo, tamaño del documento) y una ruta en cualquier parte, porque no puedo hacer que funcione correctamente en todos los visores.

¿Hay alguna manera de obtener consistencia en la representación, como especificar un 'PPP predeterminado'?

O pongo otra cosa: ¿Puedo obtener mi ejemplo a continuación para renderizar el mismo en todos los visores sin abandonar en absoluto las unidades absolutas?

Relacionado: ¿Hay alguna manera de forzar cualquiera de las siguientes aplicaciones para representar la imagen de la misma forma que una de las otras? (Por ejemplo, he intentado la opción -density de 'convertir', pero no pude obtener la salida para que coincida con la salida de Firefox o Inkscape'.)


Ejemplo:

He creado un archivo SVG, con tres cuadrados negros (rect) con una diagonal de color rojo (ruta):

  • izquierda: cuadrado y diagonal en unidades de usuario
  • Medio: cuadrado y diagonal en pulgadas (me parecía la opción más lógica, pero es no permitido)
  • Derecha: cuadrado en mm, diagonal en unidades de usuario

que hace de manera diferente en diferentes espectadores:

  • Inkscape: 90 DPI, todos los cuadrados mismo tamaño, los partidos diagonales rojas
  • Firefox: 96 DPI ?, últimas cuadrados a grande (o diagonal a corto)
  • convertir: 72 DPI, este último cuadrados a pequeña (o diagonal a largo)

Code:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<svg 
    xmlns:svg="http://www.w3.org/2000/svg" 
    xmlns="http://www.w3.org/2000/svg" 
    version="1.1" 
    width="200mm" 
    height="100mm" 
    > 
    <g transform="translate(50,50)"> 
    <rect 
     width="100." 
     height="100." 
     x="10" 
     y="10" /> 
    <path style="stroke: #ff0000" d="M 10 10 L 110 110" /> 
    </g> 
    <g transform="translate(200,50)"> 
    <rect 
     width="1.111in" 
     height="1.111in" 
     x="0.1111in" 
     y="0.1111in" /> 
    <path style="stroke: #ff0000" d="M 0.1111in 0.1111in L 1.111in 1.111in" /> 
    </g> 
    <g transform="translate(350,50)"> 
    <rect 
     width="1.111in" 
     height="1.111in" 
     x="0.1111in" 
     y="0.1111in" /> 
    <path style="stroke: #ff0000" d="M 10 10 L 110 110" /> 
    </g> 
</svg> 

Inkscape (mi defecto 'espectador'):

Alt text

Firefox (tenga en cuenta que la línea roja no llega a la esquina inferior derecha. Hice una captura de pantalla y recortada especie de forma arbitraria):

Firefox

ImageMagick (convertir, no hay opciones además de los nombres de archivos dados):

Alt text

+0

Encontré http://stackoverflow.com/questions/1132269/can-i-use-mixed-units-with-path-element útil para explicar el problema. – BlackShift

+1

Inkscape [0.92] (http://wiki.inkscape.org/wiki/index.php/Release_notes/0.92#Important_changes): la resolución predeterminada se cambió de 90 ppp a 96 ppp, para que coincida con el estándar de CSS. – qwert2003

Respuesta

25

Todas las medidas en un ruta etiqueta están en unidades de usuario.

No se puede especificar unidades absolutas dentro de una ruta etiqueta, que es la razón por la ruta en la plaza central no hace.

La forma más sencilla que he encontrado es para configurar las unidades usando viewbox:

  • Establecer el ancho & altura en pulgadas.
  • Luego configure la vista para que sea la misma.
  • Esto establece que la unidad de usuario sea de una pulgada.
  • Todos los tamaños a continuación, se especifican en pulgadas (nota: Solía ​​minúscula l en la etiqueta de ruta para especificar un movimiento relativo)

Esto muestra correctamente en Inkscape y Firefox.

<svg 
    xmlns:svg="http://www.w3.org/2000/svg" 
    xmlns="http://www.w3.org/2000/svg" 
    version="1.1" 
    width="8in" 
    height="4in" 
    viewBox="0 0 8 4"> 

    <g transform="translate(4,0.5)"> 
     <rect 
      width="1.111" 
      height="1.111" 
      x="0.1111" 
      y="0.1111" /> 
     <path d="M 0.1111,0.1111 l 1.111 1.111" style="stroke: #ff0000;stroke-width:0.01" /> 
    </g> 
</svg> 
+0

¡De hecho, parece que funciona como se esperaba! Las imágenes producidas por inkscape, ff y convertir todas tienen el mismo aspecto pero tienen un tamaño diferente que corresponde a las proporciones de 96:90:72 en los ppp predeterminados. Al menos en inkscape esto es fácil de cambiar, ¿alguien tiene idea de cómo convertir para producir lo mismo ?. Tanto Inkscape como Convert pueden crear archivos PDF que imprimen una caja con una línea de 1.1111 pulgadas de tamaño. – BlackShift

+0

Quizás no entiendo la opción de densidad de convertir. Esto funciona: para cambiar los ppp predeterminados de 72 a FFs 96, debe especificar sqrt (96 * 72) = 83.1 como densidad (para el archivo de entrada). Entonces 'convert -density 83.1 inputfile.svg outputfile.png' da la misma imagen que firefox. – BlackShift

+0

@BlackShift El comando 'convert' de ImageMagick toma un argumento' -densidad XX' (antes de especificar el archivo de entrada) para establecer la resolución. – Caleb

1

he tenido un problema similar usando Apache Batik para incrustar un archivo SVG en un archivo PDF utilizando iText. iText usa 72   DPI, el estándar para PDF, mientras que Batik usa 96.

Para que la imagen aparezca correctamente, es decir, para escalar, en el archivo PDF, debe dividir el ancho = x cm altura = y cm en el encabezado SVG por 1.33 (96/72).