
Contents
- 昨日は
SVG の中で単位をmm に変換してたけど、viewBoxを使えば済んだ - vector-effect
属性で線の太さを固定 - Firefox + Acrobat
で PDF 化 - SVG
のソース
昨日は SVG の中で単位を mm に変換してたけど、viewBox を使えば済んだ
結果は同じですが、昨日の- 昨日:SVG
内に、 mm をピクセル単位に変換するJavaScript の関数を埋め込み。mm → 25.4で割ってインチ → 96 を掛けてピクセル。この関数を使い、 SVG 全体のサイズ、各オブジェクトの位置を印刷用サイズ(mm)からピクセルに換算して指定した。 - 今日:SVG
の width、heightは指定せず、viewBox だけ「0 0 210 297」と設定。これで A4 縦用紙にPDF 出力すれば、SVG 内の単位がmm と一致するので換算不要。各オブジェクトの位置もmm の値をそのまま入力すればOK。
今回は方眼紙なので、各オブジェクトを手動で入力せず
vector-effect 属性で線の太さを固定
線種はrect, line { stroke-width: 0.5; /* 0.5px = 0.36pt = 0.127mm */ /* 1px = 0.72 pt */ /* 1pt = 1/72 inch = 25.4 / 72 mm */ stroke: black; vector-effect: non-scaling-stroke; }
↓ 出力した

Firefox + Acrobat で PDF 化
↓ 今日作った»
Firefox

Firefox

SVG のソース
今日は何だか雑然としたメモですが、要するに「印刷時も想定した<?xml version="1.0"?> <svg xmlns="http://www.w3.org/2000/svg"> <style> rect, line { stroke-width: 0.5; /* 0.5px = 0.36pt = 0.127mm */ /* 1px = 0.72 pt */ /* 1pt = 1/72 inch = 25.4 / 72 mm */ stroke: black; vector-effect: non-scaling-stroke; } rect { fill: none; } </style> <script type="text/javascript"> // <![CDATA[ function set(elem, ary) { for (var i = 0, len = ary.length; i < len; i+=2) { elem.setAttribute(ary[i], ary[i+1]); } } var svg = document.documentElement, ns = svg.namespaceURI, rect1 = document.createElementNS(ns, 'rect'), line1 = document.createElementNS(ns, 'line'), paperWidth = 210, paperHeight = 297, marTop = 30, marLeft = marRight = marBottom = 20, n = 20; set(svg, ['viewBox', '0 0 ' + paperWidth + ' ' + paperHeight]); var limX = Math.floor((paperWidth - marLeft - marRight) / n); for (var i = 0; i < limX; i++) { var line2 = line1.cloneNode(), x = n * (i+1) + marLeft; set(line2, [ 'x1', x, 'y1', marTop, 'x2', x, 'y2', paperHeight - marBottom ]); svg.appendChild(line2); } var limY = Math.floor((paperHeight - marTop - marBottom) / n); for (var i = 0; i < limY; i++) { var line2 = line1.cloneNode(), y = n * (i+1) + marTop; set(line2, [ 'x1', marLeft, 'y1', y, 'x2', paperWidth - marRight, 'y2', y ]); svg.appendChild(line2); } set(rect1, [ 'x', marLeft, 'y', marTop, 'width', paperWidth - marLeft - marRight, 'height', paperHeight - marTop - marBottom ]); svg.appendChild(rect1); // ]]> </script> </svg>