0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C# で PDF を作成する方法:テキスト・画像・図形・表の挿入

Posted at

企業向けアプリケーションや情報システムにおいて、PDF は最も一般的で、かつ安定したドキュメント出力形式の一つです。財務レポート、契約書、業務統計レポート、システムから自動生成される通知文書など、さまざまな場面で PDF は利用されています。レイアウトが固定され、プラットフォーム間で表示が一致し、容易に改変できないという特長から、バックエンドコードで PDF を動的に生成する処理は、ほぼすべての .NET プロジェクトで必要とされます。

Office 環境への依存や手作業による PDF 組み立てと比べ、専用の PDF コンポーネントを利用することで、開発の複雑さを大幅に軽減できます。本記事では Free Spire.PDF for .NET を例に、C# で PDF ドキュメントを作成する基本から応用までを体系的に解説します。

具体的には、PDF ページを新規作成し、構造化されたテキストを描画し、業務用画像を挿入し、図形要素を描画し、さらにページ分割やスタイル制御に対応した複雑な表を生成する方法を紹介します。完全なサンプルを通して、実際の業務システムにすぐ適用できる形で理解できます。


1. PDF ドキュメントを作成し、構造化されたテキストを描画する

実務では、PDF の 1 ページ目はタイトルや概要説明、レポートの要約を配置するケースが多く、テキストレイアウトの柔軟性が非常に重要です。Free Spire.PDF では、フォント、色、配置、行間などを細かく制御できるテキスト描画 API が提供されています。

以下の例では、PDF ドキュメントを作成し、ページ上にタイトルと本文説明を描画します。

using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;

namespace PdfGenerationTutorial
{
    class AddText
    {
        static void Main(string[] args)
        {
            PdfDocument doc = new PdfDocument();
            PdfPageBase page = doc.Pages.Add();

            // レポートタイトル
            PdfTrueTypeFont titleFont = new PdfTrueTypeFont(
                new Font("Yu Gothic UI", 16f, FontStyle.Bold), true);
            PdfBrush titleBrush = PdfBrushes.DarkSlateBlue;

            page.Canvas.DrawString(
                "2025年度 売上データ分析レポート",
                titleFont,
                titleBrush,
                60,
                40
            );

            // レポート本文説明
            string description =
                "本レポートは、2025年度における当社の主要な売上データを集計・分析したものです。" +
                "主な製品ごとの販売数量、単価、売上金額を中心に構成されています。" +
                "システムにより PDF を自動生成することで、データの一貫性と追跡性を確保でき、" +
                "手作業による集計作業を削減できます。社内報告、経営判断、文書アーカイブなどに適しています。";

            PdfTrueTypeFont bodyFont = new PdfTrueTypeFont(
                new Font("Yu Gothic UI", 11f), true);
            PdfBrush bodyBrush = PdfBrushes.Black;

            RectangleF textArea = new RectangleF(
                60,
                90,
                page.Canvas.ClientSize.Width - 120,
                page.Canvas.ClientSize.Height - 160
            );

            PdfStringFormat textFormat = new PdfStringFormat();
            textFormat.Alignment = PdfTextAlignment.Justify;
            textFormat.LineSpacing = 18f;

            page.Canvas.DrawString(
                description,
                bodyFont,
                bodyBrush,
                textArea,
                textFormat
            );

            doc.SaveToFile("Report_Text.pdf");
            doc.Dispose();
        }
    }
}

このコードを実行すると、次のような PDF が生成されます。

C# で PDF にテキストを描画

タイトルと本文には異なるフォントサイズと色を設定し、RectangleF によって描画領域を明確に指定しています。これにより、テキスト量が変化してもレイアウトが安定し、自動改行も適切に処理されます。


2. PDF に画像を挿入し、視覚要素や透かしとして利用する

テキストだけでなく、画像も PDF ドキュメントでは重要な役割を果たします。企業ロゴ、製品イメージ、承認印、背景透かしなどは、正式な文書で頻繁に使用されます。

以下のコードでは、画像の通常挿入、サイズ指定による表示、半透明の透かしとして配置する 3 つの例を示します。

using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;

namespace PdfGenerationTutorial
{
    class AddImage
    {
        static void Main(string[] args)
        {
            PdfDocument doc = new PdfDocument();
            PdfPageBase page = doc.Pages.Add();

            Image image = Image.FromFile("company_logo.png");
            PdfImage pdfImage = PdfImage.FromImage(image);

            // 左上に会社ロゴを配置
            page.Canvas.DrawImage(pdfImage, 50, 50, 120, 60);

            // ページ中央付近にイメージを配置
            RectangleF imageArea = new RectangleF(50, 150, 220, 140);
            page.Canvas.DrawImage(pdfImage, imageArea);

            // ページ中央に透かしとして配置
            float pageWidth = page.Canvas.ClientSize.Width;
            float pageHeight = page.Canvas.ClientSize.Height;

            float wmWidth = pdfImage.Width * 0.4f;
            float wmHeight = pdfImage.Height * 0.4f;
            float x = (pageWidth - wmWidth) / 2;
            float y = (pageHeight - wmHeight) / 2;

            page.Canvas.Save();
            page.Canvas.SetTransparency(0.25f, 0.25f, PdfBlendMode.Multiply);
            page.Canvas.DrawImage(pdfImage, x, y, wmWidth, wmHeight);
            page.Canvas.Restore();

            doc.SaveToFile("Report_Image.pdf");
            doc.Dispose();
        }
    }
}

生成される PDF の例:

C# で PDF に画像を挿入

SetTransparency メソッドを使用することで、簡単に透かし効果を実現できます。契約書や見積書、社内資料などで、ブランドを表現しつつ本文の可読性を損なわない表現としてよく利用されます。


3. 図形要素を描画してレイアウトを整理・強調する

レポート系の PDF では、線や矩形、円などの簡単な図形を使って、コンテンツ領域を区切ったり、重要な部分を強調したりすることがよくあります。Free Spire.PDF は GDI+ に近い描画インターフェースを提供しており、直感的に利用できます。

using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;

namespace PdfGenerationTutorial
{
    class Shapes
    {
        static void Main(string[] args)
        {
            PdfDocument doc = new PdfDocument();
            PdfPageBase page = doc.Pages.Add();

            // 区切り線
            PdfPen linePen = new PdfPen(Color.DarkGray, 1.5f);
            page.Canvas.DrawLine(linePen, 50, 80, 500, 80);

            // 情報ブロックの背景
            PdfPen rectPen = new PdfPen(Color.SteelBlue, 1f);
            PdfBrush rectBrush = new PdfSolidBrush(Color.AliceBlue);
            page.Canvas.DrawRectangle(rectPen, rectBrush, 50, 100, 200, 90);

            // 強調表示用の円
            PdfPen circlePen = new PdfPen(Color.Orange, 2f);
            PdfBrush circleBrush = new PdfSolidBrush(Color.Moccasin);
            page.Canvas.DrawEllipse(circlePen, circleBrush, 300, 120, 60, 60);

            doc.SaveToFile("Report_Shapes.pdf");
            doc.Close();
        }
    }
}

実行結果の PDF 例:

C# で図形要素を描画

これらの基本的な図形は一見シンプルですが、実際の業務レポートでは、重要なデータ領域を強調したり、全体のレイアウトにメリハリを持たせたりするのに非常に有効です。


4. ページ分割とスタイル制御に対応した業務データ表を生成する

PDF における表は、業務システムで最も頻繁に使われ、かつ最も複雑な要素の一つです。以下の例では、「製品別売上明細表」を想定し、ヘッダーのスタイル設定、行の交互背景、複数ページにまたがる場合のヘッダー繰り返し表示を示します。

using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Tables;
using System.Data;
using System.Drawing;

namespace PdfGenerationTutorial
{
    class DataTableExample
    {
        static void Main(string[] args)
        {
            PdfDocument doc = new PdfDocument();
            PdfPageBase page = doc.Pages.Add();

            DataTable tableData = new DataTable();
            tableData.Columns.Add("No");
            tableData.Columns.Add("製品名");
            tableData.Columns.Add("単価(円)");
            tableData.Columns.Add("販売数量");
            tableData.Columns.Add("売上金額(円)");

            for (int i = 0; i < 25; i++)
            {
                decimal price = 4800m + i * 100;
                int qty = i + 1;
                tableData.Rows.Add(
                    i + 1,
                    $"スマートデバイス 型番-{i + 1}",
                    price,
                    qty,
                    price * qty
                );
            }

            PdfTable table = new PdfTable();
            table.DataSource = tableData;

            table.Style.BorderPen = new PdfPen(Color.Gray, 0.5f);
            table.Style.DefaultStyle.Font =
                new PdfTrueTypeFont(new Font("Yu Gothic UI", 10f), true);
            table.Style.DefaultStyle.StringFormat =
                new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle);

            table.Style.HeaderSource = PdfHeaderSource.Rows;
            table.Style.HeaderRowCount = 1;
            table.Style.ShowHeader = true;
            table.Style.HeaderStyle.BackgroundBrush =
                new PdfSolidBrush(Color.LightSkyBlue);
            table.Style.HeaderStyle.Font =
                new PdfTrueTypeFont(new Font("Yu Gothic UI", 11f, FontStyle.Bold), true);
            table.Style.RepeatHeader = true;

            table.Style.AlternateStyle = new PdfCellStyle();
            table.Style.AlternateStyle.BackgroundBrush =
                new PdfSolidBrush(Color.WhiteSmoke);
            table.Style.AlternateStyle.StringFormat =
                new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle);

            table.Columns[0].Width = 50;
            table.Columns[1].Width = 160;
            table.Columns[2].Width = 90;
            table.Columns[3].Width = 70;
            table.Columns[4].Width = 100;

            table.Draw(page, new PointF(40, 50));

            doc.SaveToFile("Sales_Table.pdf");
            doc.Close();
        }
    }
}

生成される PDF の例:

C# でページ分割対応の業務表を生成

このように、データ行数が 1 ページを超えても、表は自動的に改ページされ、各ページの先頭にヘッダーが繰り返し表示されます。正式な業務レポートに非常に適した機能です。


主要クラス・プロパティ・メソッドまとめ

クラス / プロパティ / メソッド 説明
PdfDocument PDF ドキュメント全体を表すオブジェクト
PdfDocument.Pages.Add() 新しい PDF ページを追加
PdfPageBase PDF 内の 1 ページを表す
page.Canvas テキスト・画像・図形を描画するキャンバス
PdfTrueTypeFont システムフォントを使用した PDF フォント
PdfBrush / PdfPen 塗りつぶしと線描画用
Canvas.DrawString() 指定位置・領域にテキストを描画
PdfStringFormat テキストの配置や行間を制御
RectangleF 描画領域の定義
PdfImage.FromImage() Image を PDF 用画像に変換
Canvas.DrawImage() 画像を描画
Canvas.SetTransparency() 透過度を設定(透かし用)
PdfTable PDF 表を作成
PdfTable.DataSource データソースを設定
PdfTable.Style 表のスタイルを制御
PdfTable.Draw() 表をページに描画
PdfDocument.SaveToFile() PDF をファイルとして保存
PdfDocument.Dispose() / Close() リソース解放

より多くの PDF 操作テクニックについては、Spire.PDF for .NET 公式ドキュメント を参照してください。


まとめ

本記事のサンプルを通して、Free Spire.PDF for .NET を使用した C# での PDF 生成は、単なる API の寄せ集めではなく、体系的に設計できるドキュメント生成プロセスであることが分かります。ページ初期化、レイアウト設計、データ駆動の表出力まで、すべてを明確で保守しやすいコードで実装できます。

長期的に業務レポートや帳票、アーカイブ文書を出力する .NET プロジェクトにとって、この方法は開発効率を高めるだけでなく、ドキュメントの一貫性と専門性を維持する上でも非常に有効です。ページ構成とデータ設計を適切に行えば、PDF 生成をシステムの安定した基盤機能として活用できます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?