SVG(Scalable Vector Graphics)は XML ベースのベクター画像形式であり、拡大縮小しても画質が劣化しないという特性を持つ。Web デザインやアイコン、図表の表現において広く利用されている形式である。一方、PDF(Portable Document Format)は印刷やドキュメント共有に適した形式であり、レイアウトの固定や暗号化、デジタル署名といった機能を備えている。
SVG を PDF に変換する必要が生じる場面としては、Web 用に作成した図表を印刷可能なドキュメントに組み込みたい場合や、複数の SVG ファイルを一つの PDF にまとめて配布したい場合などが考えられる。本記事では、.NET 環境で SVG から PDF への変換を行う方法の一つとして、ある PDF ライブラリを利用した基本的な実装手順を解説する。
ライブラリの概要
本記事で使用するライブラリは、.NET アプリケーションにおいて PDF ドキュメントの作成、読み取り、編集、変換などを可能にするものである。NuGet パッケージとして提供されており、Visual Studio のパッケージマネージャーコンソールから以下のコマンドでインストールできる。
PM> Install-Package Spire.PDF
このライブラリは .NET Framework および .NET Core に対応しており、Windows 環境だけでなくクロスプラットフォームでの動作も想定されている。SVG の読み込み機能はバージョンアップに伴い拡充されており、以前は制限があったヘッダー・フッターへの SVG 配置やストリームからの読み込みもサポートされるようになっている。
SVG から PDF への変換手順
このライブラリを使用した SVG から PDF への変換は、PdfDocument クラスの LoadFromSvg() メソッドと SaveToFile() メソッドを組み合わせることで実現できる。以下に具体的な手順を示す。
手順の概要
-
PdfDocumentオブジェクトを作成する -
LoadFromSvg()メソッドで SVG ファイルを読み込む -
SaveToFile()メソッドで PDF 形式として保存する
C# コード例
using Spire.Pdf;
namespace SvgToPdfSample
{
class Program
{
static void Main(string[] args)
{
// PdfDocument オブジェクトを作成
PdfDocument doc = new PdfDocument();
// SVG ファイルを読み込む
doc.LoadFromSvg(@"C:\input\sample.svg");
// PDF 形式で保存する
doc.SaveToFile(@"C:\output\result.pdf", FileFormat.PDF);
// リソースを解放
doc.Dispose();
}
}
}
このコードは最小限の変換処理を示している。LoadFromSvg() メソッドに SVG ファイルのパスを渡すことで、SVG の内容が PDF ドキュメントとして内部に展開される。その後、SaveToFile() メソッドで FileFormat.PDF を指定して保存することで、PDF ファイルが生成される。
既存 PDF への SVG 画像の配置
SVG を単独の PDF に変換するだけでなく、既存の PDF ドキュメント内の任意の位置に SVG 画像を配置することも可能である。この場合、SVG をテンプレートとして読み込み、PDF ページのキャンバス上に描画するという手順を取る。
手順の概要
- SVG ファイルを読み込んで
PdfTemplateオブジェクトを作成する - 対象となる PDF ファイルを別の
PdfDocumentオブジェクトとして読み込む -
Canvas.DrawTemplate()メソッドで指定位置にテンプレートを描画する - PDF として保存する
C#コード例
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
namespace AddSvgToPdf
{
class Program
{
static void Main(string[] args)
{
// SVG を読み込む
PdfDocument svgDoc = new PdfDocument();
svgDoc.LoadFromSvg(@"C:\input\sample.svg");
// SVG の内容からテンプレートを作成
PdfTemplate template = svgDoc.Pages[0].CreateTemplate();
float width = template.Width;
float height = template.Height;
// 既存の PDF を読み込む
PdfDocument pdfDoc = new PdfDocument();
pdfDoc.LoadFromFile(@"C:\input\target.pdf");
// 指定位置にテンプレートを描画(サイズを 80% に縮小)
pdfDoc.Pages[0].Canvas.DrawTemplate(
template,
new PointF(50, 50),
new SizeF(width * 0.8f, height * 0.8f)
);
// 保存
pdfDoc.SaveToFile(@"C:\output\output.pdf", FileFormat.PDF);
svgDoc.Dispose();
pdfDoc.Dispose();
}
}
}
この方法では、CreateTemplate() メソッドで SVG の内容を再利用可能なテンプレートとして抽出し、DrawTemplate() メソッドで位置とサイズを指定して描画する。複数のページに同じ SVG を配置する場合にも、テンプレートを一度作成するだけで済む。
実装上の注意点
評価版の制限
ライセンス未設定の評価版では、生成される PDF に赤い透かしが追加され、変換可能なページ数が最初の 10 ページに制限される。この制限は製品版ライセンスを適用することで解除される。ライセンスの適用方法には、ライセンスキーをコード内で設定する方法と、ライセンスファイルを読み込む方法がある。
なお、購入したライセンスであっても、展開先のマシンIDがライセンス条件を超過している場合には警告メッセージが表示されることがある。この点はライセンス管理上の仕様として把握しておくとよい。
SVG のスタイル解釈について
過去のバージョンでは、SVG 内のスタイル(特に CSS によるスタイリング)が PDF 変換時に正しく反映されないという問題が報告されていた。この問題はバージョンアップにより修正が進められているが、変換対象の SVG が複雑なスタイルを使用している場合は、事前にテストを行うことが望ましい。SVG の内容によっては、変換結果が元の表示と完全に一致しない可能性がある点は留意しておきたい。
まとめ
本記事で紹介したライブラリを使用することで、C# コードから比較的少ない手順で SVG ファイルを PDF に変換できる。基本的な変換は LoadFromSvg() と SaveToFile() の 2 つのメソッドで完結し、既存 PDF への配置についてもテンプレート機能を利用することで柔軟に対応できる。評価版の制限や SVG の解釈に関する注意点を踏まえた上で、実際の要件に応じた検証を行うことが重要である。