WebView2のPDF印刷倍率が反映されない問題を修正|Runtime 152以降の対処法

WebView2で CoreWebView2PrintSettings.ScaleFactor を指定しているにもかかわらず、生成したPDFの印刷倍率が変わらない場合は、アプリ側の計算処理だけでなく、実際に使用しているWebView2 Runtimeのバージョンを確認してください。

Microsoftは、2026年8月3日に公開したPreview Runtime 152.0.4181.0で、PDF印刷時にカスタム倍率が正しく反映されない問題を修正したと明記しています。したがって、基本的な対処は、WebView2 Runtimeを修正済みの152系以降へ更新し、アプリを完全に終了してから再起動し、PDFを再出力することです。 (Microsoft Learn)

目次

WebView2のPDF印刷でカスタム倍率が反映されない問題を修正

今回の不具合では、ScaleFactor に有効な値を設定しても、PDF出力時に倍率が無視され、標準の100%相当で印刷されることがあります。

たとえば、次のようなコードを実行しても、0.8と1.0で生成結果に差が出ないケースです。

var printSettings =
    webView2.CoreWebView2.Environment.CreatePrintSettings();

printSettings.ScaleFactor = 0.8;

await webView2.CoreWebView2.PrintToPdfAsync(
    outputPath,
    printSettings);

Microsoftのリリースノートでは、この問題について「PDF印刷のカスタムスケール係数を正しく適用するよう修正した」と案内されています。修正が明記された最初のバージョンは、Preview Runtime 152.0.4181.0です。 (Microsoft Learn)

確認項目内容
修正が明記されたRuntimePreview Runtime 152.0.4181.0
公開日2026年8月3日
対象となる問題PDF印刷時にカスタム倍率が無視される
基本的な対処修正版Runtimeへ更新し、アプリを再起動
更新後の確認50%、100%、150%などでPDFを比較

2026年8月27日にはMicrosoft Edge Stable 152.0.4191.53が公開されています。Evergreen WebView2 RuntimeはMicrosoft Edge Stableと同系統の更新を受け取るため、本番環境ではPreview版へ固定するのではなく、最新の安定版Evergreen Runtimeを適用し、実際に使用中のバージョンが152系以降になっていることを確認するのが現実的です。 (Microsoft Learn)

不具合が発生したときの主な症状

WebView2 PDF印刷倍率の不具合では、次のような症状が見られます。

  • ScaleFactor を0.5、0.8、1.2などに変更してもPDFの内容サイズが変わらない
  • 印刷倍率を小さくしても改ページ位置やページ数が変わらない
  • PrintToPdfAsync は成功し、PDFファイルも正常に作成される
  • 余白や背景印刷など、ほかの設定は反映されることがある
  • 同じコードでもWebView2 Runtimeのバージョンによって結果が異なる
  • 開発PCでは直っているが、利用者のPCでは倍率が反映されない

PDFファイル自体は作成されるため、アプリの処理が正常に完了したように見える点が、この問題を切り分けにくくしています。

特に、PrintToPdfAsync の戻り値が true であっても、それはPDFの書き込み処理が完了したことを示すものであり、指定したレイアウトや倍率が意図どおり反映されたことまでは保証しません。

ScaleFactorの正しい指定方法

CoreWebView2PrintSettings.ScaleFactor は、パーセントではなく倍率で指定します。

設定可能な範囲は0.1から2.0で、標準値は1.0です。範囲外の値を設定した場合は、現在の値が変更されず、ArgumentException が発生します。 (Microsoft Learn)

印刷したい倍率ScaleFactorに設定する値
10%0.1
50%0.5
80%0.8
100%1.0
120%1.2
150%1.5
200%2.0

次のように、80%を指定するために 80 を設定してはいけません。

// 誤り
printSettings.ScaleFactor = 80;

ユーザーがパーセント単位で入力する画面では、100で割ってから設定します。

int scalePercent = 80;

printSettings.ScaleFactor = scalePercent / 100.0;

有効範囲外の値で例外が発生している場合は、今回のRuntime不具合ではなく、値の変換処理を修正する必要があります。

一方、0.81.2 といった有効な値を設定しているのに出力結果が変わらない場合は、Runtimeのバージョンや印刷設定の受け渡しを確認してください。

実際に使用しているWebView2 Runtimeを確認する

最初に確認すべきなのは、PCにインストールされているバージョンではなく、アプリが現在使用しているWebView2 Runtimeのバージョンです。

C#で実行中のRuntimeを確認する

WebView2の初期化後に、BrowserVersionString を記録します。

await webView2.EnsureCoreWebView2Async();

string runtimeVersion =
    webView2.CoreWebView2.Environment.BrowserVersionString;

Debug.WriteLine($"WebView2 Runtime: {runtimeVersion}");

BrowserVersionString では、現在の CoreWebView2Environment が使用しているRuntimeのバージョンを取得できます。Previewチャンネルを使用している場合は、チャンネル名が含まれることがあります。 (Microsoft Learn)

ログが次のようになっている場合は、152系のRuntimeを使用しています。

WebView2 Runtime: 152.0.4191.53

次のように151以前のバージョンが表示された場合は、修正版が適用されていない可能性があります。

WebView2 Runtime: 151.0.4129.107

バージョン判定をアプリに組み込む場合は、チャンネル名を除いた数値部分を比較します。

string versionText =
    webView2.CoreWebView2.Environment.BrowserVersionString;

string numericPart = versionText
    .Split(' ', StringSplitOptions.RemoveEmptyEntries)[0];

if (Version.TryParse(numericPart, out Version? runtimeVersion))
{
    Version fixBaseline = new Version(152, 0, 4181, 0);

    if (runtimeVersion < fixBaseline)
    {
        Debug.WriteLine(
            "PDF印刷倍率の修正前Runtimeを使用している可能性があります。");
    }
}

152.0.4181.0 は修正が明記されたPreview Runtimeの基準です。本番環境では、その時点で提供されている最新の安定版Runtimeを使用してください。

PowerShellでEvergreen Runtimeを確認する

Evergreen Runtimeを使用しているPCでは、レジストリの pv 値でもインストール済みバージョンを確認できます。

$runtimeId = "{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}"

$paths = @(
    "HKLM:\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\$runtimeId",
    "HKLM:\SOFTWARE\Microsoft\EdgeUpdate\Clients\$runtimeId",
    "HKCU:\Software\Microsoft\EdgeUpdate\Clients\$runtimeId"
)

foreach ($path in $paths) {
    if (Test-Path $path) {
        $item = Get-ItemProperty $path

        [pscustomobject]@{
            RegistryPath = $path
            Version      = $item.pv
        }
    }
}

Microsoftは、Evergreen Runtimeのインストール有無とバージョンを確認する方法として、該当レジストリの pv 値、または GetAvailableCoreWebView2BrowserVersionString APIの利用を案内しています。 (Microsoft Learn)

ただし、Fixed Version Runtimeはこのレジストリを使用しません。アプリが実際に読み込んだRuntimeを確認するには、BrowserVersionString のログを優先してください。

WebView2 Runtimeを更新する手順

更新方法は、アプリがEvergreen RuntimeとFixed Version Runtimeのどちらを使用しているかによって異なります。

配布方式更新方法注意点
Evergreen Runtime自動更新、Bootstrapper、Standalone Installerを利用アプリの再起動が必要
Fixed Version Runtimeアプリに同梱するRuntime一式を差し替えるアプリの再配布が必要
Preview環境Beta、Dev、Canaryなどで先行検証本番配布には使用しない
社内管理端末更新ポリシーやWSUSの設定を確認自動更新が停止している場合がある

Evergreen Runtimeを使用している場合

Evergreen Runtimeは、通常はMicrosoftの更新機構によって自動的に更新されます。更新されていない場合は、公式のEvergreen BootstrapperまたはStandalone Installerを使用して最新Runtimeを適用します。

オンライン環境では、Bootstrapperが端末のアーキテクチャを判定し、適切なWebView2 Runtimeをダウンロードします。オフライン環境では、x86、x64、ARM64に対応したStandalone Installerを配布できます。 (Microsoft Learn)

サイレントインストールする場合のコマンド例は次のとおりです。

MicrosoftEdgeWebView2Setup.exe /silent /install

オフライン用Standalone Installerでは、次の形式になります。

MicrosoftEdgeWebView2RuntimeInstallerX64.exe /silent /install

管理者権限で実行するとマシン単位、通常権限で実行するとユーザー単位でインストールされます。

Fixed Version Runtimeを使用している場合

Fixed Version Runtimeでは、WindowsにインストールされているEvergreen Runtimeを更新しても、アプリが使用するRuntimeは変わりません。

アプリに同梱しているRuntimeを、修正済みの152系以降へ差し替える必要があります。

確認するポイントは次のとおりです。

  • 新しいFixed Version Runtimeをダウンロードしているか
  • Runtimeのファイル一式を正しいフォルダーへ展開しているか
  • BrowserExecutableFolder が古いフォルダーを参照していないか
  • アプリのインストーラーに新しいRuntimeが含まれているか
  • 更新後の BrowserVersionString が想定したバージョンになっているか

.NETアプリでFixed Version Runtimeを指定する例は次のとおりです。

string fixedRuntimePath =
    Path.Combine(
        AppContext.BaseDirectory,
        "FixedRuntime",
        "152");

var environment =
    await CoreWebView2Environment.CreateAsync(
        browserExecutableFolder: fixedRuntimePath);

await webView2.EnsureCoreWebView2Async(environment);

フォルダーを差し替えても、設定ファイルやコード内のパスが旧バージョンを参照していると、修正前Runtimeが使われ続けます。

SDKの更新だけでは解決しない

今回修正されたのはWebView2 Runtime側の動作です。

NuGetの Microsoft.Web.WebView2 パッケージを更新しても、利用者のPCで実際に読み込まれるRuntimeが古いままであれば、PDF印刷倍率の問題は解消しません。

次の2つは分けて管理してください。

  • WebView2 SDK:アプリをビルドするためのAPIやライブラリ
  • WebView2 Runtime:Webコンテンツの描画やPDF生成を実際に処理する実行環境

SDKのバージョンだけを確認せず、必ず BrowserVersionString で実行中のRuntimeを確認することが重要です。

更新後はアプリを完全に再起動する

Evergreen Runtimeの新しいバージョンがダウンロードされても、起動中のアプリは従来のWebView2環境を使い続けることがあります。

Microsoftのドキュメントでも、新しいRuntimeを使用するには、以前のWebView2環境への参照をすべて解放するか、アプリを再起動する必要があると説明されています。 (Microsoft Learn)

更新後は、次の手順で再確認してください。

  1. PDFを表示しているアプリを終了する
  2. タスクマネージャーでアプリ本体が終了したことを確認する
  3. 必要に応じて関連サービスや常駐プロセスも再起動する
  4. アプリを再起動する
  5. BrowserVersionString を再度記録する
  6. PDFを新しいファイル名で出力する

ウィンドウを閉じてもバックグラウンドに常駐するアプリでは、単に画面を閉じただけではRuntimeが切り替わらない場合があります。

長時間起動する業務アプリでは、NewBrowserVersionAvailable イベントを利用し、更新後の再起動を利用者へ案内する設計も有効です。

修正版RuntimeでPDFを出力するC#コード例

次のコードでは、印刷倍率をパーセントで受け取り、WebView2の倍率へ変換してPDFを出力します。

using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;

private async Task<string> ExportPdfAsync(
    string outputPath,
    int scalePercent)
{
    if (scalePercent is < 10 or > 200)
    {
        throw new ArgumentOutOfRangeException(
            nameof(scalePercent),
            "印刷倍率は10~200%で指定してください。");
    }

    await webView2.EnsureCoreWebView2Async();

    string runtimeVersion =
        webView2.CoreWebView2.Environment.BrowserVersionString;

    Debug.WriteLine(
        $"WebView2 Runtime: {runtimeVersion}");

    string fullPath = Path.GetFullPath(outputPath);
    string? outputDirectory = Path.GetDirectoryName(fullPath);

    if (!string.IsNullOrEmpty(outputDirectory))
    {
        Directory.CreateDirectory(outputDirectory);
    }

    var printSettings =
        webView2.CoreWebView2.Environment.CreatePrintSettings();

    printSettings.ScaleFactor = scalePercent / 100.0;
    printSettings.ShouldPrintBackgrounds = true;
    printSettings.ShouldPrintHeaderAndFooter = false;

    bool succeeded =
        await webView2.CoreWebView2.PrintToPdfAsync(
            fullPath,
            printSettings);

    if (!succeeded)
    {
        throw new InvalidOperationException(
            "PDFの出力に失敗しました。別の印刷処理が実行中でないか確認してください。");
    }

    return fullPath;
}

呼び出し例は次のとおりです。

string outputPath = Path.Combine(
    Environment.GetFolderPath(
        Environment.SpecialFolder.DesktopDirectory),
    "webview2-scale-80.pdf");

await ExportPdfAsync(outputPath, 80);

PrintToPdfAsync は、同一のWebView2で複数のPDF印刷処理を同時実行できません。別のPDF印刷処理が進行中の場合、処理が失敗して false が返ることがあります。印刷ボタンを連続で押せないようにするなど、アプリ側でも多重実行を防止してください。 (Microsoft Learn)

また、ページの読み込み途中でPDFを生成すると、画像、Webフォント、非同期取得したデータが欠けることがあります。NavigationCompleted だけでなく、アプリ固有のデータ描画が完了してから印刷を開始してください。

印刷倍率が直ったか確認する方法

PDFビューアーの「ページ幅に合わせる」や「ウィンドウに合わせる」が有効になっていると、異なる倍率で生成したPDFでも画面上では同じ大きさに見えます。

確認時は、PDFビューアーの表示倍率を100%に固定してください。

比較用のPDFを3種類作成する

同じHTML、同じ用紙サイズ、同じ余白設定で、次の3種類を出力します。

await ExportPdfAsync("scale-50.pdf", 50);
await ExportPdfAsync("scale-100.pdf", 100);
await ExportPdfAsync("scale-150.pdf", 150);

確認する項目は次のとおりです。

確認項目期待する変化
文字や画像の大きさ50%は小さく、150%は大きくなる
1ページに入る情報量小さい倍率ほど増える
改ページ位置倍率に応じて変化する
PDFの用紙サイズ用紙設定が同じなら基本的に変わらない
余白同じ設定なら固定される
Runtimeログ修正済みバージョンが表示される

ページ数だけで判定すると、コンテンツ量や改ページ指定によって差が出ないことがあります。文字、画像、表の幅、改ページ位置を含めて比較してください。

更新しても倍率が反映されない場合の確認ポイント

修正版Runtimeへ更新しても問題が残る場合は、次の順序で切り分けます。

原因確認方法対処
アプリが古いRuntimeを使用中BrowserVersionString を記録アプリを完全終了して再起動
Fixed Versionのパスが古いBrowserExecutableFolder を確認新しいRuntimeフォルダーへ変更
SDKだけ更新したRuntimeの実バージョンを確認EvergreenまたはFixed Runtimeを更新
設定オブジェクトを渡していないPrintToPdfAsync の第2引数を確認printSettings を明示的に渡す
倍率をパーセントのまま設定ScaleFactor の値をログ出力80%なら 0.8 に変換
PDFビューアーが自動調整している表示倍率を確認ビューアーを100%表示にする
印刷処理が多重実行されている戻り値と実行状態を記録ボタン無効化や排他制御を行う
CSSが印刷時にレイアウトを変更@media print を確認印刷用CSSを一時的に無効化
物理プリンターだけで発生PrintToPdfAsync と比較プリンタードライバー側も調査

PrintSettingsが実際に渡されているか確認する

次のコードは、印刷設定を渡していないため標準値が使用されます。

await webView2.CoreWebView2.PrintToPdfAsync(outputPath);

次のように、作成した設定オブジェクトを第2引数へ渡す必要があります。

var settings =
    webView2.CoreWebView2.Environment.CreatePrintSettings();

settings.ScaleFactor = 0.8;

await webView2.CoreWebView2.PrintToPdfAsync(
    outputPath,
    settings);

途中で別の設定オブジェクトを作成したり、null を渡したりしていないかも確認してください。

印刷用CSSの影響を確認する

WebView2 Runtimeを更新しても、HTML側の印刷用CSSによって見た目が変わらないことがあります。

特に次の指定を確認してください。

@media print {
    body {
        zoom: 1;
    }

    .document {
        transform: scale(1);
        transform-origin: top left;
    }
}

zoomtransform: scale() を不具合回避のために一時的に追加していた場合、Runtime修正後は ScaleFactor と二重に倍率が適用される可能性があります。

そのほか、次の印刷用CSSも改ページやサイズに影響します。

  • @page
  • page-break-before
  • page-break-after
  • break-before
  • break-after
  • break-inside
  • 固定幅の width
  • overflow: hidden
  • 絶対配置
  • 固定された高さ

切り分け時は、一時的に印刷用CSSを最小構成にして、WebView2の ScaleFactor だけで差が出るか確認してください。

Microsoft Edgeの更新だけで判断しない

Microsoft EdgeブラウザとWebView2 Runtimeは、同じEdge系の技術を使用していますが、アプリが実際に利用する実行環境はWebView2 Runtimeです。

Microsoft Edgeのバージョンが152になっていても、企業ポリシー、オフライン環境、Fixed Version指定などによって、アプリが151以前のRuntimeを使用している可能性があります。

反対に、Microsoft Edgeの更新が制限されていても、WebView2 Runtimeは別の更新ポリシーで更新される場合があります。MicrosoftもEdgeとWebView2 Runtimeには別の更新ポリシーがあると説明しています。 (Microsoft Learn)

そのため、「Edgeを更新したから直っているはず」と判断せず、アプリ内で BrowserVersionString を取得してください。

Preview Runtimeを本番環境へそのまま配布しない

修正が最初に案内された152.0.4181.0はPreview Runtimeです。

Preview RuntimeやMicrosoft EdgeのBeta、Dev、Canaryチャンネルは、修正の先行検証や将来バージョンとの互換性確認に利用します。本番環境では、安定版WebView2 Runtimeを使用することが推奨されています。 (Microsoft Learn)

実務では、次の流れが安全です。

  1. 検証端末で152.0.4181.0以降のRuntimeを使用する
  2. 50%、100%、150%のPDFを比較する
  3. 印刷用CSSや既存の回避コードとの競合を確認する
  4. 最新の安定版EvergreenまたはFixed Version Runtimeで再テストする
  5. 段階的に利用者へ展開する
  6. 展開後もRuntimeバージョンをログへ記録する

業務帳票や請求書など、印刷位置が重要なアプリでは、Runtime更新前後のPDFを目視確認するだけでなく、ページ数、文字位置、表の幅、改ページ位置も比較してください。

WebView2 PDF印刷倍率の問題を解消するための確認順序

WebView2のPDF印刷でカスタム倍率が反映されない場合は、次の順序で対応すると効率的です。

まず、BrowserVersionString を取得し、アプリが実際に使用しているWebView2 Runtimeを確認します。152.0.4181.0より古いRuntimeを使用している場合は、最新の安定版Runtimeへ更新してください。

更新後はアプリを完全に終了して再起動し、50%、100%、150%など差が分かりやすい倍率でPDFを再生成します。

それでも変化しない場合は、次の点を確認します。

  • ScaleFactor に0.1から2.0の値を設定しているか
  • パーセントを100で割っているか
  • PrintToPdfAsync に設定オブジェクトを渡しているか
  • Fixed Version Runtimeの参照先が古くないか
  • PDFビューアーが表示サイズを自動調整していないか
  • 印刷用CSSや一時的な倍率回避コードが残っていないか
  • PDF印刷処理を同時実行していないか

今回の問題は、CSSやPDFビューアーだけではなく、WebView2 Runtime側の不具合としてMicrosoftが修正したものです。まずRuntimeを更新し、そのうえでアプリの設定値と生成結果を確認することが、最も確実な対処になります。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次