C#とPuppeteerSharpによるWebページのPDF変換実装

オフライン環境でWebコンテンツを閲覧する必要がある場合、PuppeteerSharpを使用した自動PDF変換が効率的です。C#からChromeをヘッドレスモードで制御し、ページをそのままのレイアウトでPDF化できます。

環境構築

Visual Studio 2022でWPFまたはWinFormsプロジェクトを作成し、NuGetパッケージマネージャーからPuppeteerSharpをインストールします。初回実行時にブラウザバイナリがダウンロードされます。

最小構成の実装

以下は10行程度で完結する基本的なPDF生成コードです。

// ブラウザ実行環境の準備
var fetcher = new BrowserFetcher();
await fetcher.DownloadAsync();

// ヘッドレスブラウザの起動とページ読み込み
var launchConfig = new LaunchOptions { Headless = true };
await using var chrome = await Puppeteer.LaunchAsync(launchConfig);
await using var tab = await chrome.NewPageAsync();
await tab.GoToAsync(urlTextBox.Text);

// カレントディレクトリにPDF出力
var savePath = Path.Combine(Environment.CurrentDirectory, $"{nameTextBox.Text}.pdf");
await tab.PdfAsync(savePath);

ページタイトルの自動取得

ファイル名をWebページのタイトルから動的に生成するには、DOM要素への操作が必要です。

// title要素のテキストを抽出
var titleNode = await tab.QuerySelectorAsync("title");
var textHandle = await titleNode.GetPropertyAsync("innerText");
var pageTitle = await textHandle.JsonValueAsync<string>();

// 無効な文字をアンダースコアに置換
var safeName = string.Join("_", pageTitle.Split(Path.GetInvalidFileNameChars()));
var autoPath = Path.Combine(Environment.CurrentDirectory, $"{safeName}.pdf");
await tab.PdfAsync(autoPath);

出力オプションの詳細設定

PdfOptionsクラスでレイアウトを微調整できます。

  • Format: A4/Letterなどの用紙サイズ
  • Landscape: 横向きモード
  • PageRanges: 印刷範囲の指定(例: "1-5,8")
  • MarginOptions: 四辺の余白設定
  • PrintBackground: 背景グラフィクスの有無
var pdfConfig = new PdfOptions
{
    Format = PaperFormat.A4,
    Landscape = true,
    MarginOptions = new MarginOptions 
    { 
        Top = "1cm", 
        Right = "1cm", 
        Bottom = "1cm", 
        Left = "1cm" 
    },
    PrintBackground = false
};

await tab.PdfAsync(outputPath, pdfConfig);

応用展開

単一ページの変換が安定動作すれば、Recursionを用いた複数ページの一括変換や、ページ内リンクの巡回によるサイト全体のPDF化が実現可能です。ファイル名衝突回避と変換状態の管理が今後の課題です。

タグ: C# PuppeteerSharp PDF生成 Headless Chrome Web自動化

7月4日 20:36 投稿