ASP.NET MVC で PDF出力(TuesPechkin)
ASP.NET MVC PDF出力をしたかったので調べていたところ、HTMLのビューをそのままPDFに変換できるライブラリを知ったので、それを使ってPDF出力する方法をまとめます。使用するのは “TuesPechkin” です。
TuesPechkin
上のURLに使い方など諸々が記述されています。TuesPechkinは、実のところ wkhtmltopdf というライブラリの .NET ラッパーのようです。
以下C#の例ですが、VB.NETでも同じようにできるはずです。
使い方
nugetに公開されているので、まずはそれをインストールします。必要なのは、”TuesPechkin” と 動作環境に合わせたもの(“TuesPechkin.Wkhtmltox.Win32″,”TuesPechkin.Wkhtmltox.Win64”,”TuesPechkin.Wkhtmltox.AnyCPU”のいずれか)の2つです。
ということで以下のようにしてインストールします。
Install-Package TuesPechkin
Install-Package TuesPechkin.Wkhtmltox.AnyCPU
データとしては、「公開されているURL」もしくは「HTML形式の文字列」をPDF形式のデータへ変換し、Byte型配列を生成します。複数の対象データを指定し、1つのPDFファイルを生成できます。
サンプルとして、以下の3つのデータから1つのPDFファイルを生成するコードを載せます。
- 外部のURL(https://www.google.co.jp/)
- アクションメソッドのページ(Home/Index)
- 適当なHTML文字列
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult DownloadPdf()
{
var data = CreatePDF();
return File(data, "application/pdf", "test.pdf");
}
// アプリケーションで単一のインスタンスとする
private static IConverter Converter =
new ThreadSafeConverter(
new RemotingToolset<PdfToolset>(
new WinAnyCPUEmbeddedDeployment(
new TempFolderDeployment())));
// PDFのバイトデータを生成
private byte[] CreatePDF()
{
// HomeコントローラーのIndexアクションへのURLを生成
var helper = new UrlHelper(ControllerContext.RequestContext);
var url = helper.Action("Index", "Home", null, Request.Url.Scheme);
// PDFデータを作成
var document = new HtmlToPdfDocument
{
GlobalSettings =
{
// 出力に関する設定
ProduceOutline = true,
DocumentTitle = "test pdf",
PaperSize = PaperKind.A4,
Margins =
{
All = 1.375,
Unit = Unit.Centimeters
}
},
Objects = {
// 必要な数だけデータを設定
new ObjectSettings { PageUrl = url },
new ObjectSettings { PageUrl = "https://www.google.co.jp/" },
new ObjectSettings { HtmlText = "<h1>Hello World!!</h1><p>helo hello ...</p>" },
}
};
// Byte型配列へ変換
byte[] result = Converter.Convert(document);
return result;
}
}
Home/DownloadPdfにアクセスすると、PDFファイルがダウンロードされるはずです。
注意点
使用にはいくつか注意点があります。まず使用する際、Converterは必ずアプリケーション内で単一のインスタンスとなるようにしなければなりません。複数のインスタンスを作成して動きません。(ハマってしまい、1時間ほど悩みましたが、普通に公式ページのサンプルコードのコメントに書いてありました。)
URLのページを直接PDFに変換する方法の場合、JavascriptやCSSなど別ファイルから詠み込んだ分も正常に評価されますが、文字列のHTMLの場合、HTML上に直接展開されているCSS等々以外は反映されませんでした。
このライブラリを使う場合、体裁はCSSで整えることになると思いますが、直接HTML形式の文字列を変換元ソースとして利用する場合には、HTML内に展開しておく必要があります。
以上です。
実施した環境をご教授いただければ幸いです。