pub_markdown では、rsvg-convert を独自実装している。
このスクリプトは、Pandoc で SVG ファイルを含む DOCX ファイルを生成する際に、標準の rsvg-convert の代替として動作する Puppeteer ベースの SVG→PNG 変換ツールである。
Pandoc が Markdown やその他の形式から DOCX ファイルを生成する際、SVG 画像は直接 DOCX に埋め込むことができない。そのため、以下の流れで処理される。
rsvg-convert を使用)従来の rsvg-convert には以下の制約がある。
Puppeteer を使用することで以下の改善を実現している。
rsvg-convert.exe # Windows 用エントリーポイント
rsvg-convert.cmd # Windows 用バッチファイル (rsvg-convert.exe から起動)
rsvg-convert # Linux 用シェルファイル (エントリーポイント)
rsvg-convert.js # メインの Node.js スクリプト
スクリプトは標準 rsvg-convert と互換性のある以下のオプションをサポートする。
-f png: 出力形式 (PNG 固定)--dpi-x N: 水平解像度 (デフォルト: 96)--dpi-y N: 垂直解像度 (デフォルト: 96)const scale = Math.max(dpiX, dpiY) * 3 / 96;指定された DPI の 3 倍でレンダリングを行い、高精細な出力を実現している。
優先順位に従って SVG の実際のサイズを決定する。
width="100px" height="50px" など単位付き値viewBox="0 0 100 50" の幅・高さSVG で使用される各種単位を正確にピクセルに変換する。
通常の Pandoc 使用時に、システムの rsvg-convert の代わりに本スクリプトが自動的に呼び出される。
pandoc input.md -o output.docxコマンドラインから直接 SVG 変換も可能である。
echo "<svg width='100' height='100'>...</svg>" | node rsvg-convert.js
echo "<svg>...</svg>" | node rsvg-convert.js --dpi-x 300 --dpi-y 300--no-sandbox フラグでセキュリティオーバーヘッドを削減waitUntil:'load' で外部リソースの完全読み込みを保証omitBackground:true で透明背景を維持主要なエラーケースと対応を以下に示す。