2009-08-28 9 views
29

J'essaie de générer automatiquement un fichier SVG destiné à être imprimé sur une certaine taille (A4). Je souhaite utiliser un chemin qui ne permet que des 'unités d'utilisateurs', pas des 'unités absolues'. Il me semble qu'il est impossible de "publier" un fichier SVG qui a des unités absolues (par exemple la taille du document) et un chemin n'importe où, parce que je ne peux pas le faire fonctionner correctement sur les téléspectateurs.SVG et DPI, unités absolues et unités d'utilisateur: Inkscape vs Firefox vs ImageMagick

Existe-t-il un moyen d'obtenir une certaine cohérence dans le rendu, comme spécifier un «DPI par défaut»? Autrement dit: Puis-je obtenir mon exemple ci-dessous pour rendre le même résultat dans tous les visualiseurs sans pour autant abandonner les unités absolues? Relié: Existe-t-il un moyen de forcer l'une des applications ci-dessous à rendre l'image de la même manière que l'une des autres? (Par exemple, j'ai essayé l'option -density de « convertir », mais je ne pouvais pas obtenir la sortie pour correspondre à la sortie « de Inkscape ou Firefox.)


Exemple:

J'ai créé un fichier SVG, avec trois carrés noirs (rect) avec une diagonale rouge (chemin):

  • gauche: carré et diagonale en unités utilisateur
  • Moyen: carré et diagonale pouces (me semblait le choix le plus logique, mais est pas autorisé)
  • droite: carré en mm, diagonale en unités utilisateur

qui rend différemment dans différents téléspectateurs:

  • Inkscape: 90 DPI, tous les carrés de même taille, Allumettes diagonale rouge
  • Firefox: 96 DPI ?, derniers carrés à grande (ou diagonale courte)
  • Autre: 72 DPI, carrés ci à petit (ou diagonale de long)

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 (mon défaut 'viewer'):

Alt text

Firefox (notez que la ligne rouge ne parvient pas à le coin inférieur droit. J'ai fait une capture d'écran et recadrée sorte de façon arbitraire):

Firefox

ImageMagick (conversion, aucune option en plus des noms de fichiers donnés):

Alt text

+0

J'ai trouvé http://stackoverflow.com/questions/1132269/can-i-use-mixed-units-with-path-element utile pour expliquer le problème. – BlackShift

+1

Inkscape [0.92] (http://wiki.inkscape.org/wiki/index.php/Release_notes/0.92#Important_changes): La résolution par défaut a été modifiée de 90dpi à 96dpi, pour correspondre à la norme CSS. – qwert2003

Répondre

25

Toutes les dimensions dans un chemin tag sont dans les unités d'utilisateur.

Vous ne pouvez pas spécifier unités absolues dans un chemin tag, ce qui explique pourquoi le chemin dans le carré du milieu ne rend pas.

La façon la plus simple que j'ai trouvé est de définir les unités utilisant viewbox:

  • Définissez la largeur & hauteur en pouces.
  • Ensuite, définissez la vue comme identique.
  • Ceci définit l'unité utilisateur à un pouce.
  • Toutes les tailles sont spécifiées en pouces alors (note: je minuscules l dans la balise de chemin pour spécifier un déplacement relatif)

Cette affiche correctement dans Inkscape et 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

Cela semble en effet fonctionner comme prévu! Les images produites par inkscape, ff et convert ont toutes la même apparence mais ont une taille différente qui correspond aux rapports 96:90:72 dans le dpi par défaut. Au moins dans inkscape c'est facile à changer, n'importe qui une idée comment se convertir pour produire le même? À la fois inkscape et convert peuvent créer des pdf qui impriment une boîte avec la ligne qui est 1.1111 pouces. – BlackShift

+0

Peut-être que je ne comprends pas l'option -density de convertir. Cela fonctionne: pour changer le dpi par défaut de 72 à FFs 96, vous devez spécifier sqrt (96 * 72) = 83.1 comme densité (pour le fichier d'entrée). Donc 'convert -density 83.1 inputfile.svg outputfile.png' donne la même image que firefox. – BlackShift

+0

@BlackShift La commande 'convert' d'ImageMagick prend un argument' -density XX' (avant de spécifier le fichier d'entrée) pour définir la résolution. – Caleb

1

J'ai eu un problème similaire en utilisant Apache Batik pour intégrer un fichier SVG dans un fichier PDF à l'aide iText. iText utilise 72   DPI, la norme pour PDF, tandis que Batik utilise 96.

Pour que l'image apparaisse correctement, c'est-à-dire à l'échelle, dans le fichier PDF, vous devez diviser la largeur = x cm hauteur = y cm dans l'en-tête SVG de 1,33 (96/72).

Questions connexes