ASP.NET MVC で PDF を作成

ASP.NET MVC でチャートを表示するには、 System.Web.Helpers にある Chart クラスを使えばいいことが分かった。

ASP.NET MVC でチャートを表示 - present

ここからさらに、チャートを含んだドキュメントを PDF でダウンロードできるようにしたい。 これを実現するには、iTextSharp を使うのが良さそうだ。 iTextSharp では、PDF に画像を埋め込むのはそう難しくない。

using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Helpers;
using System.Web.Mvc;

namespace PdfSample.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Pdf()
        {
            var pdf = CreatePdf();
            return File(pdf, "application/pdf", "PdfSample.pdf");
        }

        // PDF(バイナリ)を作成
        private byte[] CreatePdf()
        {
            using(var document = new Document(PageSize.A4, 20, 20, 20, 20))
            using(var stream = new MemoryStream())
            using (var writer = PdfWriter.GetInstance(document, stream))
            {
                document.Open();

                // テキストを PDF に書き込む
                document.Add(new Paragraph("PDF Sample"));

                // レーダーチャート画像を PDF に埋め込む
                var chart = CreateRadarChart();
                var image = Image.GetInstance(chart);
                document.Add(image);

                document.Close();

                return stream.ToArray();
            }
        }

        // レーダーチャート画像を作成
        private byte[] CreateRadarChart()
        {
            var chart = new Chart(
                width: 400,
                height: 400,
                theme: ChartTheme.Blue
            );
            chart.AddTitle("チャートサンプル");
            chart.AddSeries(
                name: "能力",
                chartType: "Radar",
                xValue: new[] {
                    "ミート",
                    "パワー",
                    "走力",
                    "肩力",
                    "守備力"
                },
                yValues: new[] {
                    "90",
                    "60",
                    "80",
                    "80",
                    "90"
                }
            );
            return chart.GetBytes();
        }
    }
}

Web ブラウザでアクションを呼び出すと、レーダーチャートが埋め込まれた PDF をダウンロードできる。

f:id:griefworker:20150113200216p:plain