このページには自動翻訳されたテキストを含めることができます。

C# と VB.NET で HTML を PDF に変換する

HTML形式のコンテンツ作成に多大な時間と費用を費やしてきたのであれば、そのHTMLからPDFを作成したいと思うかもしれません。このアプローチは、作業の重複を避けたい人にとって自然な選択です。

この記事は、Docotic.Pdfと無料のHtmlToPdfアドオンを使用して、.NETでHTMLをPDFに変換する詳細なガイドです。

Docotic.Pdfが最適な選択肢である理由、アドオンのインストール方法、変換の内部的な仕組みについては、HTML to PDF APIの概要ページをご覧ください。

HTMLからPDFへの変換

シンプルな HTML から PDF への C# 変換

まず、アドオンをインストールします。

Install-Package BitMiracle.Docotic.Pdf.HtmlToPdf

HTML から PDF への API を使用すると、C# 変換コードは次のようになります。

static async Task ConvertUrlToPdfAsync(string urlString, string pdfFileName)
{
    using var converter = await HtmlConverter.CreateAsync();
    using var pdf = await converter.CreatePdfAsync(new Uri(urlString));
    pdf.Save(pdfFileName);
}

非常にシンプルです。PDFドキュメントを生成するには、たった2回の呼び出しが必要です。

このコードはコンバータのインスタンスを作成し、それを使ってHTMLからPDFを生成します。PDFを編集したり、デジタル署名で署名したりできます。簡潔にするため、サンプルコードではドキュメントをそのまま保存しています。

ご覧のとおり、このAPIは非同期であり、同期メソッドは一切提供していません。

同期コードで非同期APIを使用する

同期コードからAPIを呼び出す必要がある場合があります。例えば、コンソールアプリケーションが古いバージョンのC#を使用していて、async Mainメソッドがない場合などです。ご安心ください。アプリ内でアドオンを引き続き使用できます。

次のコードは、通常の同期メソッドでURLをPDFに変換する方法を示しています。

Task.Run(async () =>
{
    using var converter = await HtmlConverter.CreateAsync();
    var uri = new Uri("https://bitmiracle.com/pdf-library/html-pdf/");
    using var pdf = await converter.CreatePdfAsync(uri);
    pdf.Save("output.pdf");
}).GetAwaiter().GetResult();

VB.NETアプリケーションでも同様のコードを使用します。以下は、同期VB.NETコードでHTMLをPDFに変換する方法を示したスニペットです。

Task.Run(
    Async Function()
        Using converter = Await HtmlConverter.CreateAsync()
            Dim uri = New Uri("https://bitmiracle.com/pdf-library/html-pdf/")
            Using pdf = Await converter.CreatePdfAsync(uri)
                pdf.Save("output.pdf")
            End Using
        End Using
    End Function
).GetAwaiter().GetResult()

一般に、非同期メソッドを同期的に呼び出すことは推奨されないため、他に選択肢がない場合にのみラッパーを使用することに注意してください。

サンプルコード

コンソール、Windows フォーム、WPF アプリケーションのサンプルコードをご用意しています。GitHub リポジトリから完全なテストプロジェクトをダウンロードしてください。

HTML to PDF サンプルグループもございます。各サンプルはC#版とVB.NET版で提供されています。

C# と VB.NET で HTML 文字列またはファイルから PDF を作成する

APIを使えば、HTML文字列をPDFに変換するのは簡単です。文字列にはHTML文書全体を含めることも、一部だけを含めることもできます。コンバーターがHTMLコードからPDFを作成します。

using var converter = await HtmlConverter.CreateAsync();

var html = "<body><br><br><br><h1>Hello, World</h1></body>";
using var pdf = await converter.CreatePdfFromStringAsync(html);
pdf.Save("output.pdf");

HTMLには、画像、スクリプト、CSSファイルへの相対参照が含まれる場合があります。これらのコードを適切に変換するには、HTML内のすべての相対リンクにベースURLを指定する必要があります。変換オプションを使用してベースURLを指定する方法は次のとおりです。

using var converter = await HtmlConverter.CreateAsync();

var incompleteHtml = "<img src=\"/images/team.svg\"></img>";

var options = new HtmlConversionOptions();
options.Load.BaseUri = new Uri("https://bitmiracle.com/");

using var pdf = await converter.CreatePdfFromStringAsync(incompleteHtml, options);
pdf.Save("output.pdf");

GitHubリポジトリには完全なテストプロジェクトが含まれています。

HTMLファイルの変換はURLの変換とほぼ同じです。URLの代わりにパスを受け入れるCreatePdfAsyncオーバーロードを使用してください。C#またはVB.NETコードでHTMLファイルをPDFに変換する場合も、ベースURLやその他のオプションがサポートされています。

var sampleHtmlPath = @"C:\path\to\sample.html";
using var pdf = await converter.CreatePdfAsync(sampleHtmlPath);
pdf.Save("output.pdf");

API を使用して SVG 画像を PDF に変換 することもできます。

カスタムページサイズ、余白、スケールを使用する

幅の広いレイアウトのウェブページを扱う場合、出力PDFのサイズを大きくするか、PDFページに収まるようにコンテンツを縮小することができます。拡大されたコンテンツの位置を調整するために、余白を設定することもできます。

適切に拡大されたPDFは、読者がコンテンツを正しく表示するために拡大または縮小する必要がないため、読みやすさが向上します。HTMLドキュメントのフォントサイズが小さく読みにくい場合は、コンテンツを拡大することができます。

デフォルトでは、APIはA4サイズのページでPDFを生成します。余白と拡大は設定されていません。変換オプションを使用して、これらの設定を変更できます。

HTMLからPDFを生成する際に、拡大率と余白を設定する方法をご覧ください。

using var converter = await HtmlConverter.CreateAsync();

var html = "<html><head><style>body { background-color: coral; margin-top: 100px;}</style></head>" +
"<body><h1>Did you notice the margins and the scale?</h1></body></html>";

var options = new HtmlConversionOptions();
options.Page.MarginLeft = 10;
options.Page.MarginTop = 20;
options.Page.MarginRight = 30;
options.Page.MarginBottom = 40;
options.Page.Scale = 1.5;

using var pdf = await converter.CreatePdfFromStringAsync(html, options);
pdf.Save("output.pdf");

Docotic.Pdf サンプル リポジトリには、完全なプロジェクト が含まれています。

HTML to PDF API は、生成されたページに繰り返し可能なフッター / ヘッダーブロックを追加できます。コンバーターは、ページオプション で指定された HTML テンプレートからブロックを作成します。テンプレート内の画像には、インラインスタイルと Data URI を使用することをお勧めします。

コンバーターは、ヘッダーとフッターをページ余白内に配置します。デフォルトのページ余白は小さいため、ヘッダーとフッターの内容が表示されない場合があります。上余白と下余白を明示的に指定することをお勧めします。サイズは、それぞれヘッダーとフッターのサイズと一致させる必要があります。

HTML を PDF に変換し、ヘッダーとフッターを追加する方法をご覧ください。

using var converter = await HtmlConverter.CreateAsync();

var options = new HtmlConversionOptions();
options.Page.HeaderTemplate = File.ReadAllText("header-template.html");
options.Page.MarginTop = 50;

options.Page.FooterTemplate = File.ReadAllText("footer-template.html");
options.Page.MarginBottom = 50;

var url = new Uri("https://www.iana.org/numbers");
using var pdf = await converter.CreatePdfAsync(url, options);
pdf.Save("output.pdf");

テンプレートは通常のHTMLコードを使用し、いくつかの変数をサポートしています。これらの変数は、datetitleurlpageNumbertotalPagesです。ヘッダーテンプレートフッターテンプレートはどちらも同じ変数セットをサポートしています。

完全なテストプロジェクトとテンプレートコードは、Docotic.Pdfサンプルリポジトリにあります。サンプルコードは、テンプレート内の変数とデータURIの使用方法を示しています。

パスワード保護された HTML から PDF への C# 変換

一部のウェブページはアクセスに認証が必要です。HTTP認証が必要なセキュアURLにアクセスすると、ブラウザはユーザー名とパスワードの入力を求めます。

変換オプションを使用すると、ログインが必要なウェブページで認証情報を提供するようAPIに指示できます。

このC#コードは、パスワードで保護されたHTMLをPDFに変換する方法を示しています。

using var converter = await HtmlConverter.CreateAsync();
var url = new Uri("http://httpbin.org/basic-auth/foo/bar");

var options = new HtmlConversionOptions();
options.Authentication.SetCredentials("foo", "bar");

using var pdf = await converter.CreatePdfAsync(url, options);
pdf.Save("output.pdf");

完全な動作サンプルはサンプルリポジトリから入手できます。

ページが正しく動作するためにCookieの設定が必要な場合も、設定は簡単です。必要なCookieをオプションに追加するだけです。手順は以下のとおりです。

var options = new HtmlConversionOptions();
options.Cookies.Add(new Cookie("sessionID", "my-session-ID"));

using var pdf = await converter.CreatePdfAsync(url, options);
pdf.Save("output.pdf");

遅延変換開始

デフォルトでは、読み込み後すぐに変換が開始されます。ページの読み込み後、しばらく更新が続く場合は、HTMLからPDFへの変換を遅らせると効果的です。JavaScriptやAJAX呼び出しによって生成された動的なコンテンツを扱う場合などによく見られます。

Acid 3テストは、変換前に遅延を設定することで効果を発揮するページの好例です。このテストでは、複雑なWebページを正しくレンダリングできるブラウザの能力を評価するために、いくつかのチェックを実行します。これらのチェックには時間がかかります。次のコードで待機時間を変更し、変換結果にどのような影響があるかを確認してください。

var options = new HtmlConversionOptions();
options.Start.SetStartAfterDelay(10 * 1000);

using var converter = await HtmlConverter.CreateAsync();
var url = new Uri("http://acid3.acidtests.org/");
using var pdf = await converter.CreatePdfAsync(url, options);
pdf.Save("output.pdf");

上記のコードは、遅延時間を設けてHTMLをPDFに変換する方法を示しています。遅延時間を追加することで変換結果の品質が向上しますが、遅延時間を追加するとパフォーマンスが低下する可能性があることに注意してください。遅延時間が不十分だと、変換品質に悪影響を与える可能性があります。遅延時間を使用する代わりに、ページの準備が整うまで実行されるスクリプトを使用する方法もあります。

完全なテストプロジェクトは、Docotic.Pdfサンプルリポジトリから入手できます。

変換前にJavaScriptを実行する

アドオンAPIは、変換前にJavaScriptコードを実行する方法を提供します。このコードはHTMLコンテンツを動的に生成または変更できます。例えば、要素を切り替えたり、動的なコンテンツの読み込みを実行したりできます。

次のコードは、JavaScriptが終了するまでHTMLからPDFへの変換を遅延させる方法を示しています。

using var converter = await HtmlConverter.CreateAsync();

var options = new HtmlConversionOptions();
var js = @"document.body.style.backgroundColor = 'green';";
options.Start.SetStartAfterScriptRun(js);

var url = new Uri("https://google.com");
using var pdf = await converter.CreatePdfAsync(url, options);
pdf.Save("output.pdf");

上記のスニペットでは、アプローチを説明するために非常にシンプルなコードを使用しています。より現実的な例については、GitHubリポジトリの対応するサンプルアプリをご覧ください。このアプリは、コンテンツを動的に読み込むページの処理方法を示しています。アプリ内のJavaScriptコードは、新しいコンテンツがなくなるまでページをスクロールします。その後、PDFへの変換が行われます。

SSLエラーを無視して.NETでHTMLをPDFに変換する

HTML を読み込むためのセキュアリクエストを送信する際、アドオンはウェブサイトの ID を認証し、暗号化された接続を可能にする SSL 証明書が有効かつ信頼できるかどうかを確認します。

デフォルトでは、HTML から PDF へのコンバーターが何らかの理由で証明書を信頼できない場合、アドオンは例外をスローします。これは通常、自己署名証明書、失効した証明書、または期限切れの証明書が原因で発生します。

信頼できない証明書を受け入れることのリスクを理解している場合は、エンジンオプション を使用して、アドオンにチェックをバイパスするように指示できます。

var engineOptions = new HtmlEngineOptions
{
    IgnoreSslErrors = true
};
using var converter = await HtmlConverter.CreateAsync(engineOptions);

var url = new Uri("https://self-signed.badssl.com/");
using var pdf = await converter.CreatePdfAsync(url);
pdf.Save("output.pdf");

完全なコードについては、Docotic.Pdf サンプル リポジトリをご覧ください。

既存のPDFにHTMLを重ねる

既存のPDFを変換結果の背景として使用したい場合があります。例えば、フォームの画像があり、その画像の空白部分に何かを重ねたい場合などです。結果は、入力されたフォームのように見えます。これはDocotic.Pdfとアドオンを使用することで実現できます。

このプロセスでは、HTML(オーバーレイコンテンツ)から新しいPDFを作成し、それを既存のPDFと結合します。最終的なドキュメントには、元のコンテンツと新しいオーバーレイの両方が含まれます。このプロセスを示すコードを以下に示します。

using var converter = await HtmlConverter.CreateAsync();

var options = new HtmlConversionOptions();
options.Page.SetSizeInches(4.13, 5.83);

string htmlCode =
    "<div style=\"position: absolute; top: 270px; right: 100px;\">" +
    "I would like to put this here</div>";
using var htmlPdf = await converter.CreatePdfFromStringAsync(htmlCode, options);

using var pdf = new PdfDocument("pdf-to-merge-with.pdf");
var xObj = pdf.CreateXObject(htmlPdf.Pages[0]);

pdf.Pages[0].Canvas.DrawXObject(xObj, 0, 0);
pdf.Save("output.pdf");

オーバーレイのページサイズを指定することが重要です。通常、オーバーレイするページのサイズと同じサイズにする必要があります。その後、オーバーレイコンテンツを含む新しいPDFファイルを作成する必要があります。背景はデフォルトで透明になっていることにご注意ください。必要に応じて、変換前にスクリプトを実行することで背景を変更できます。

上記のコードは以下の処理を行います。

  • HTML から透明なページを持つ PDF ドキュメントを作成します。
  • 既存の PDF を開きます。
  • 変換されたドキュメントの最初のページから、既存のドキュメント内の XObject を作成します。
  • 既存のドキュメントの最初の PDF ページの上に XObject を描画します。

完全なサンプル ソース PDF を含むテスト プロジェクト は、Docotic.Pdf サンプル リポジトリにあります。