2009-08-28 22 views
29

特定のサイズ(A4)で印刷するためのSVGファイルを自動生成しようとしています。私は、絶対単位ではなく、 'ユーザ単位'しか許さないパスを使用したいと考えています。SVGとDPI、絶対単位とユーザー単位:InkscapeとFirefoxの比較ImageMagick

絶対単位(例:ドキュメントサイズ)とパス(どこでも)を持つSVGファイルを '公開'することはできません。なぜなら、視聴者間で正しく動作することができないからです。

「デフォルトDPI」を指定するなど、レンダリングの一貫性を得る方法はありますか?

別の言い方をすると、絶対ユニットを放棄することなく、すべての視聴者に同じようにレンダリングするための下の例を得ることができますか?

関連する他のアプリケーションと同じようにイメージをレンダリングする方法はありますか? (Egは、私は「変換」の-densityオプションを試してみましたが、私はInkscapeの者またはFirefox」出力と一致する出力を得ることができませんでした。)


例:私は1つのSVGファイルを作成しました

  • 左::四角やユーザー単位での対角
  • 中:赤対角線(パス)で3つの黒い四角形(矩形)の正方形とインチで対角(私に最も論理的な選択だったようで、しかしです許可されていません)
  • 右:別の視聴者には異なるレンダリングユーザー単位のミリメートルの広場、対角線

  • のInkscape:90 DPI、すべての正方形と同じ大きさ、赤対角線試合
  • のFirefox:96
  • 大きい(又は短い対角)で変換することが正方形後者DPI?:(長いまたは対角)72 DPI、後者の正方形小へ

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は(私のデフォルトの '視聴者):

Alt text

Firefoxの(赤い線が右下隅に到達しないことに注意してください。 I)のスクリーンショットを作り、ソートの任意トリミング:

Firefox

ImageMagickの(所与のファイル名以外はオプションを変換しない):

Alt text

+0

問題の説明に役立つhttp://stackoverflow.com/questions/1132269/can-i-use-mixed-units-with-path-elementが見つかりました。 – BlackShift

+1

Inkscape [0.92](http://wiki.inkscape.org/wiki/index.php/Release_notes/0.92#Important_changes):CSSの標準と一致するように、デフォルト解像度が90dpiから96dpiに変更されました。 – qwert2003

答えて

25

パスタグのすべての寸法ユーザー単位です。

あなたは、中央広場にパスがレンダリングされません理由ですパスタグ内の絶対単位を指定することはできません。

私が見つけた最も簡単な方法は、ビューボックス使用して単位を設定することです:

  • インチの幅&高さを設定します。
  • 次に、ビューボックスを同じに設定します。
  • これは、ユーザユニットを1インチに設定します。
  • すべてのサイズは、次に、インチ単位で指定されている(注:私は相対移動を指定するパスタグに小文字のLを使用)

これはInkscapeのと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

これは実際には期待通りに動作するようです! inkscape、ff、convertで生成された画像はすべて同じように見えますが、デフォルトのdpiの96:90:72の比率に対応するサイズは異なります。少なくともinkscapeでこれは変更するのは簡単です、誰もがどのように同じものを生産するために変換するか? inkscapeとconvertの両方で、1.1111インチの線でボックスを印刷するpdfを作成することができます。 – BlackShift

+0

おそらく私はconvertからの-densityオプションを理解していません。これは動作します:デフォルトのdpiを72からFFs96に変更するには、密度(入力ファイル用)としてsqrt(96 * 72)= 83.1を指定する必要があります。したがって、 'convert -density 83.1 inputfile.svg outputfile.png'は、firefoxと同じイメージを返します。 – BlackShift

+0

@BlackShift ImageMagickの 'convert'コマンドは解像度を設定するために(入力ファイルを指定する前に)' -density XX'引数をとります。 – Caleb

1

私はiTextを使用してPDFファイルにSVGファイルを埋め込むことApache Batikを使用して同様の問題がありました。 iTextは、PDFの標準である72  を使用していますが、Batikは96を使用しています。

画像を正しく表示するには、PDFファイルで画像を正しく表示するには、幅= x cm高さ= SVGヘッダーのy cm(1.33(96/72))。

関連する問題