2009-08-28 9 views
29

Próbuję automatycznie wygenerować plik SVG przeznaczony do wydrukowania na określonym formacie (A4). Chciałbym użyć w niej ścieżki, która zezwala tylko na "jednostki użytkownika", a nie "jednostki bezwzględne".SVG i DPI, jednostki bezwzględne i jednostki użytkownika: Inkscape vs. Firefox vs. ImageMagick

Wydaje mi się, że to niemożliwe, aby „opublikować” plik SVG, który ma jednostkach bezwzględnych (np Document Size) i ścieżkę wszędzie, bo nie mogę zmusić go do prawidłowej pracy całej widzów.

Czy istnieje sposób na uzyskanie spójności w renderowaniu, na przykład określenie "domyślnego DPI"?

Lub inaczej: czy mogę uzyskać poniższy przykład, aby wyświetlać ten sam obraz we wszystkich przeglądarkach, nie rezygnując w ogóle z jednostek absolutnych?

Powiązany: Czy istnieje sposób na wymuszenie którejkolwiek z poniższych aplikacji, aby renderować obraz w taki sam sposób, jak jeden z pozostałych? (Np Próbowałem opcję „Convert” -density, ale nie mogłem dostać wyjście pasujące do wyjścia Inkscape'a lub Firefox.)


Przykład:

Został utworzony jeden plik SVG, z trzech czarnych kwadratów (rect) z czerwonym ukośnym (Path):

  • lewej: kwadrat i przekątnej w jednostkach użytkownika
  • Bliski: kwadrat i przekątna w calach (wydawało mi się najbardziej logicznym wyborem, ale jest niedozwolone)
  • prawej: kwadrat w mm, przekątna w jednostkach użytkownika

co czyni różnie w różnych widzów:

  • Inkscape: 90 DPI, wszystkie kwadraty tej samej wielkości, czerwone ukośne meczów
  • Firefox: 96 DPI ?, ostatnie kwadraty duży (lub ukośnie do krótkich)
  • Konwersja: 72 DPI ostatnie kwadraty mała (lub skośnie do długości)

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 (mój default 'widz'):

Alt text

Firefox (zauważ, że czerwona linia nie osiągnie dolny prawy róg. Zrobiłem zrzut ekranu i przycięte rodzaj arbitralnie):

Firefox

ImageMagick (konwersja, żadnych opcji oprócz nazw plików podane):

Alt text

+0

Znalazłem http://stackoverflow.com/questions/1132269/can-i-use-mixed-units-with-path-element przydatne do wyjaśnienia problemu. – BlackShift

+1

Inkscape [0.92] (http://wiki.inkscape.org/wiki/index.php/Release_notes/0.92#Important_changes): Domyślna rozdzielczość została zmieniona z 90dpi na 96dpi, aby pasowała do standardu CSS. – qwert2003

Odpowiedz

25

Wszystkie wymiary w ścieżki tagu są w jednostkach użytkownika.

Nie można określić jednostkach bezwzględnych obrębie ścieżki tagu, dlatego ścieżka w środkowym placu nie czyni.

Najprostszym sposobem znalazłem to, aby ustawić jednostki używając viewbox:

  • ustawić szerokość & wysokość w calach.
  • Następnie ustawić widok tak, aby był taki sam.
  • Ustawia jednostkę użytkownika na jeden cal.
  • Wszystkie rozmiary są następnie podano w calach (Uwaga: użyłem małą l znacznika ścieżki w celu określenia względnego ruchu)

ten wyświetla poprawnie w Inkscape i 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

To rzeczywiście wydaje się działać zgodnie z oczekiwaniami! Obrazy tworzone przez inkscape, ff i convert all wyglądają tak samo, ale mają inny rozmiar, który odpowiada proporcji 96:90:72 w domyślnej dpi. Przynajmniej w inkscape jest to łatwe do zmienienia, każdy ma pomysł, jak przekonwertować go do produkcji tego samego ?. Zarówno inkscape, jak i convert mogą tworzyć pliki PDF, które drukują pudełko z linią o rozmiarze 1.1111 cala. – BlackShift

+0

Być może nie rozumiem opcji -density z convert. Działa to: aby zmienić domyślną rozdzielczość od 72 do FF 96, musisz określić sqrt (96 * 72) = 83,1 jako gęstość (dla pliku wejściowego). Tak więc "convert-density 83.1 inputfile.svg outputfile.png" daje taki sam obraz, jak robi to Firefox. – BlackShift

+0

Komenda 'convert' programu BrowserShift ImageMagick pobiera argument' -density XX' (przed określeniem pliku wejściowego), aby ustawić rozdzielczość. – Caleb

1

miałem podobny problem przy użyciu Apache Batik osadzić plik SVG w pliku PDF za pomocą iText. iText używa 72   DPI, standardu dla PDF, podczas gdy Batik używa 96.

Aby obraz był prawidłowo wyświetlany, tzn. na skali, w pliku PDF musisz podzielić szerokość = wysokość x cm = y cm w nagłówku SVG o 1,33 (96/72).

Powiązane problemy