コマンドによる SVG から PDF への変換#
Linux のコマンドを用いて SVG ファイルを PDF ファイルへ変換する方法を調査した結果、うまくいった方法をメモする。
背景#
この調査をした元の目的は、 Python でグラフを生成するライブラリ Plotly で描画したグラフを PDF 形式のベクター画像にして TeX のドキュメントに挿入することだった。しかし、Plotly では PDF ファイルを正しく生成できなかったため、 PDF と同じくベクター画像の SVG ファイルを Plotly に出力させ、その SVG ファイルを PDF ファイルへ変換することにした。
最初はソフトウェア Inkscape を用いて手動で変換を行っていたが、グラフを追加・変更するのが面倒な上に、バイナリの PDF ファイルが Git の履歴に増えていくのを抑制したくなったため、 Plotly で SVG ファイルを生成して PDF ファイルへ変換するまでを全てコマンドで自動化することにした。
Note
調査した結果完成したスクリプト: numerical-analysis-note リポジトリの make_pdf_plot.py
svg2pdf の適用#
Python パッケージ svglib を用いて SVG ファイルを PDF ファイルへ変換する。
svglib のインストール
Python パッケージ svglib をインストールする。
$ pip3 install svglib
適用
svglib パッケージに含まれるコマンドラインツール svg2pdf を以下のように用いる。
$ svg2pdf <SVGファイルパス> -o <PDFファイルの出力先のパス>
テキストのパスへの変換(オプション)#
svg2pdf で生成される PDF ファイルではテキストがフォントの埋め込みもされていない状態で含まれるため、 PDF の表示が環境依存してしまう。その問題を、PDF にフォントを埋め込むか、PDF 内のテキストをパスに変換することで解決する。ここでは、 Ghostscript を用いてPDF 内のテキストをパスに変換する方法を記載する。
Ghostscript のインストール
Ghostscript を単体でインストールする方法は調べていないため不明。私は Island of TeX の texlive リポジトリ にて管理されている Docker イメージに含まれる Ghostscript を使用している。
適用
$ gs -dNoOutputFonts -sDEVICE=pdfwrite -o <変換後のPDFファイルの出力先パス> <入力となるPDFファイルのパス>
Todo
現状はグラフの画像に使用しているだけのためテキストをパスに変換するという方法で困っていないが、フォントを埋め込む方法もそのうち必要になるかもしれない。