はじめに
「HTMLからPDFを生成する」方法については、wkhtmltopdf や Python、JavaScript などの外部ツールを用いる記事が多く見られます。
本記事は、Windows 10以降の標準環境で PowerShell+Microsoft Edge を使って実装した際の備忘録です。
社内環境で外部ツールを導入できない場合や、既存環境のみで簡易的にレポートをPDF化したい場合に役立ちます。
Edgeヘッドレスモードとは
ChromiumベースのMicrosoft Edgeには、GUIなしで動くモード(headless) があり、--print-to-pdf オプションを使うと開いたページをPDFとして保存できます。
Google ChromeやBraveなど他のChromium系ブラウザでも同様の機能があります。
動作確認環境
Windows 11/PowerShell 5.1
htmlからpdf変換
# 変換元HTMLと出力先PDF
$htmlPath = "C:\temp\report.html"
$pdfPath = "C:\temp\report.pdf"
# Edgeの実行ファイルパス(環境によって変更)
$edge = "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe"
# HTML → PDF変換
& $edge --headless --disable-gpu --print-to-pdf="$pdfPath" "file:///$htmlPath"
Write-Host "PDF出力完了: $pdfPath" -ForegroundColor Green
実行の流れ
- PowerShellでEdgeのコマンドラインを呼び出し
- 指定HTMLを無表示で開く
- そのままPDF化して保存
file:/// 形式でローカルHTMLを指定するのがポイントです。
HTMLを生成してからPDF化
# データ
$data = 1..5 | ForEach-Object { [PSCustomObject]@{ No = $_; Square = $_ * $_ } }
# CSS
$css = @"
<style>
body{font-family:-apple-system,Segoe UI,Meiryo,Arial; margin:24px;}
h1{margin:0 0 8px 0}
table{border-collapse:collapse; width:100%}
th,td{border:1px solid #ccc; padding:6px; text-align:left}
th{background:#f5f5f5}
footer{margin-top:12px; color:#666; font-size:12px}
</style>
"@
# HTML生成(ConvertTo-HtmlにCSSを差し込み)
$html = $data | ConvertTo-Html -Title 'レポート' -As Table `
-PreContent "<h1>レポート</h1><p>生成日時: $(Get-Date -Format 'yyyy-MM-dd HH:mm')</p>" `
-PostContent "<footer>Generated by PowerShell</footer>"
$html = $html -replace '</head>', "$css`n</head>"
# 保存(スクリプト場所 or 現在ディレクトリ)
$base = if ($PSScriptRoot) { $PSScriptRoot } else { (Get-Location).Path }
$outHtml = Join-Path $base 'report.html'
Set-Content -Path $outHtml -Value $html -Encoding UTF8
Write-Host "HTML出力: $outHtml" -ForegroundColor Green
# そのままPDF化(Edgeのヘッドレス印刷。環境によりパス調整)
$edge = "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe"
if (Test-Path $edge) {
$outPdf = [IO.Path]::ChangeExtension($outHtml, '.pdf')
& $edge --headless --disable-gpu --print-to-pdf="$outPdf" "file:///$outHtml"
Write-Host "PDF出力: $outPdf" -ForegroundColor Green
}
出力されたhtml
ページサイズや余白を調整する
EdgeヘッドレスモードではCSSで印刷用スタイルを設定できます。
@page {
size: A4;
margin: 20mm;
}
このCSSをHTML内に書くことで、PDF出力時の用紙サイズや余白が指定可能です。
注意点
- JavaScriptによる描画が終わる前にPDF化される場合があります →
--virtual-time-budget=3000などで待機時間を設定 - 印刷時のヘッダー・フッター(URLや日付)を消すオプションは現状コマンドラインでは非対応(CSSや印刷設定の工夫で対応)
- ページ分割は
page-break-before/break-afterなどのCSSで調整
他ツールとの比較
他の方法もあるが、今回はPowerShellとEdgeヘッドレスにフォーカスしてみました。
| 方法 | 依存ツール | 再現度 | 実行速度 | 導入難易度 |
|---|---|---|---|---|
| Edgeヘッドレス | Edgeのみ | 高 | 中 | ◎ |
| wkhtmltopdf | wkhtmltopdf | 高 | 高 | △ |
| Pandoc+PDFエンジン | Pandoc, LaTeX等 | 高 | 低〜中 | △ |
| LibreOffice CLI | LibreOffice | 中 | 中 | ○ |
まとめ
- Edge標準機能とPowerShellだけでHTML→PDFが可能
- 外部ライブラリ不要、社内環境でも導入しやすい
- 印刷CSSを駆使すればレイアウトも調整可能
この方法は、日次レポートや自動帳票、CI/CDの成果物作成など、軽量なPDF生成パイプラインに向いています。



