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

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

HTML 形式のコンテンツを作成するためにすでにかなりの時間と費用を投資している場合、その HTML から PDF を作成したくなるかもしれません。この方法は、重複作業を避けたい人にとって自然な選択です。

この記事では、Docotic.Pdf とその無料の HtmlToPdf アドオンを使用して .NET で HTML を PDF に変換する方法を詳しく説明します。

Docotic.Pdf が適切な選択である理由、アドオンのインストール方法、変換の内部動作については、HTML から PDF への API の概要 ページを参照してください。

HTML から PDF への変換

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

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

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()

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

サンプルコード

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

HTML から 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 オーバーロードを使用するだけです。HTML ファイルを C# または VB.NET コードで PDF に変換する場合も、ベース URL やその他のオプションを使用できます。

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

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

カスタムのページ サイズ、余白、およびスケールを指定する

幅の広いレイアウトを持つ Web ページを扱う場合、出力 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 から 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 のサンプル リポジトリにあります。サンプルコードでは、テンプレート内で変数と Data URI を使用する方法を示します。

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

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

変換オプション を使用すると、ログインが必要な Web ページに対して 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 では、変換前に JS コードを実行できます。コードは 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 を読み込むために安全なリクエストを送信すると、アドオンは、Web サイトの識別を認証し暗号化接続を有効にする 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 のサンプル リポジトリにあります。