IronPDF ハウツー TLSウェブサイト & システムログイン C#でのログイン認証の裏で HTML を PDF に変換する カーティス・チャウ 更新日:2026年1月10日 IronPDF をダウンロード NuGet ダウンロード DLL ダウンロード Windows 版 無料トライアル LLM向けのコピー LLM向けのコピー LLM 用の Markdown としてページをコピーする ChatGPTで開く このページについてChatGPTに質問する ジェミニで開く このページについてGeminiに問い合わせる Grokで開く このページについてGrokに質問する 困惑の中で開く このページについてPerplexityに問い合わせる 共有する Facebook で共有 Xでシェア(Twitter) LinkedIn で共有 URLをコピー 記事をメールで送る This article was translated from English: Does it need improvement? Translated View the article in English C#でログイン認証の後ろでHTMLをPDFに変換するには、ネットワーク認証のためにIronPDFのChromeHttpLoginCredentialsを使うか、変換前にSystem.Net.WebClient/HttpClientを使ってHTMLをダウンロードしてください。 このアプローチでは、ネットワーク認証とHTMLフォームログインの両方を効果的に処理します。 クイックスタート: IronPDFを使ってログインの背後でHTMLをPDFに変換 IronPDFのAPIを使ってログインフォームの後ろにあるHTMLページをPDFに変換します。 このガイドでは、認証と保護されたコンテンツ取得のための ChromeHttpLoginCredentials を示します。 ネットワーク認証とHTMLフォームログインの両方を、わかりやすいコード例で扱います。 今すぐ NuGet で PDF を作成してみましょう: NuGet パッケージ マネージャーを使用して IronPDF をインストールします PM > Install-Package IronPdf このコード スニペットをコピーして実行します。 new ChromePdfRenderer { LoginCredentials = new ChromeHttpLoginCredentials("username","password") } .RenderUrlAsPdf("https://example.com/protected") .SaveAs("secure.pdf"); 実際の環境でテストするためにデプロイする 今すぐ無料トライアルでプロジェクトに IronPDF を使い始めましょう 30日間無料トライアル 最小限のワークフロー(5ステップ) C#IronPdfライブラリをダウンロードする。 HTMLをダウンロードしてログインを回避 LoginCredentialsプロパティでネットワーク認証を使用してログインします。 認証用にHTMLフォームを使用 MVCログイン認証の回避策 ログイン認証を処理するためのベストプラクティスは何ですか? . <!コードの概念を示す図またはスクリーンショット --> IronPDFはChromeHttpLoginCredentials APIを通してTLSネットワーク認証(ユーザー名とパスワード)をサポートしています。 さまざまなログインシナリオに関する包括的なガイダンスについては、TLS Website & System Logins tutorial を参照してください。 推奨されるアプローチは、System.Net.WebClientまたはHttpClientを使用してHTMLとアセットをダウンロードすることです。 この方法では、ヘッダー、ログイン、その他の要件をサポートします。 メモリやディスクにダウンロードした後、IronPDFはHTMLをPDFに変換します。 HtmlAgilityPackを使ってスタイルシートや画像などのアセットを抽出し、System.Net.WebClientを使ってダウンロードします。 // Download HTML content from a URL with authentication string html; using (WebClient client = new WebClient()) { // Add authentication headers if needed client.Headers.Add("Authorization", "Bearer " + accessToken); // Download the HTML string html = client.DownloadString("http://www.example.com/protected-content"); } // Load the HTML into an HtmlDocument for parsing HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(html); // Extract all image sources for downloading foreach(HtmlNode img in doc.DocumentNode.SelectNodes("//img")) { string imgSrc = img.GetAttributeValue("src", null); Console.WriteLine($"Found image: {imgSrc}"); // Download each image asset if (!string.IsNullOrEmpty(imgSrc)) { string fileName = Path.GetFileName(imgSrc); client.DownloadFile(imgSrc, fileName); } } // Convert the downloaded HTML to PDF var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("authenticated-content.pdf"); // Download HTML content from a URL with authentication string html; using (WebClient client = new WebClient()) { // Add authentication headers if needed client.Headers.Add("Authorization", "Bearer " + accessToken); // Download the HTML string html = client.DownloadString("http://www.example.com/protected-content"); } // Load the HTML into an HtmlDocument for parsing HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(html); // Extract all image sources for downloading foreach(HtmlNode img in doc.DocumentNode.SelectNodes("//img")) { string imgSrc = img.GetAttributeValue("src", null); Console.WriteLine($"Found image: {imgSrc}"); // Download each image asset if (!string.IsNullOrEmpty(imgSrc)) { string fileName = Path.GetFileName(imgSrc); client.DownloadFile(imgSrc, fileName); } } // Convert the downloaded HTML to PDF var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("authenticated-content.pdf"); $vbLabelText $csharpLabel オーバーロードされたSystem.Uriコンストラクタを使用して、相対URLを絶対URLにリベースします。 HTMLドキュメント内のすべての相対パスをリベースするには、HtmlAgilityPackを使ってヘッダーに<base>タグを追加します。 例. URLとアセットの取り扱いに関する詳細については、ベースURLとアセットのエンコーディングガイドを参照してください。 なぜ HTML コンテンツを最初にダウンロードする必要があるのですか? 変換前にHTMLコンテンツをダウンロードすることで、いくつかの利点が得られます: 1.完全なコントロール:変換前にHTMLを修正したり、リンク切れを修正したり、認証トークンを注入したりできます。 2.資産管理:画像、CSS、JavaScriptファイルなどの外部リソースをダウンロードしてキャッシュする。 3.認証の柔軟性:OAuth、JWTトークン、またはカスタムヘッダを含む任意の.NET認証メカニズムを使用します。 4.パフォーマンス:頻繁にアクセスされるコンテンツをキャッシュし、サーバーの負荷を軽減します。 5.デバッグ: 変換されたHTMLを正確に検査し、問題をトラブルシューティングする。 Cookieとセッションを含む複雑な認証シナリオについては、PDF変換中の認証状態管理について説明したCookieガイドを参照してください。 画像やスタイルシートなどのアセットはどのように扱えばよいですか? 認証されたページを変換する場合、外部アセットも同じ認証を必要とすることがよくあります。 ここでは、HttpClientを使用した包括的なアプローチを紹介します: public async Task<string> DownloadAuthenticatedHtmlWithAssets(string url, string authToken) { using (var client = new HttpClient()) { // Set authentication header client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authToken); // Download the main HTML string html = await client.GetStringAsync(url); // Parse HTML to find assets var doc = new HtmlDocument(); doc.LoadHtml(html); // Create a base URI for resolving relative paths var baseUri = new Uri(url); // Download CSS files var cssLinks = doc.DocumentNode.SelectNodes("//link[@rel='stylesheet']"); if (cssLinks != null) { foreach (var link in cssLinks) { string href = link.GetAttributeValue("href", ""); if (!string.IsNullOrEmpty(href)) { var cssUri = new Uri(baseUri, href); string cssContent = await client.GetStringAsync(cssUri); // Embed CSS directly in the HTML var styleNode = doc.CreateElement("style"); styleNode.InnerHtml = cssContent; doc.DocumentNode.SelectSingleNode("//head").AppendChild(styleNode); // Remove the external link link.Remove(); } } } // Return the modified HTML with embedded assets return doc.DocumentNode.OuterHtml; } } public async Task<string> DownloadAuthenticatedHtmlWithAssets(string url, string authToken) { using (var client = new HttpClient()) { // Set authentication header client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authToken); // Download the main HTML string html = await client.GetStringAsync(url); // Parse HTML to find assets var doc = new HtmlDocument(); doc.LoadHtml(html); // Create a base URI for resolving relative paths var baseUri = new Uri(url); // Download CSS files var cssLinks = doc.DocumentNode.SelectNodes("//link[@rel='stylesheet']"); if (cssLinks != null) { foreach (var link in cssLinks) { string href = link.GetAttributeValue("href", ""); if (!string.IsNullOrEmpty(href)) { var cssUri = new Uri(baseUri, href); string cssContent = await client.GetStringAsync(cssUri); // Embed CSS directly in the HTML var styleNode = doc.CreateElement("style"); styleNode.InnerHtml = cssContent; doc.DocumentNode.SelectSingleNode("//head").AppendChild(styleNode); // Remove the external link link.Remove(); } } } // Return the modified HTML with embedded assets return doc.DocumentNode.OuterHtml; } } $vbLabelText $csharpLabel HTML解析に役立つツールは何ですか? HtmlAgilityPackは、.NET用の最も一般的なHTML解析ライブラリですが、代替ライブラリも存在します: 1.HtmlAgilityPack:一般的なHTMLの解析と操作に最適です。 2.AngleSharp:CSS セレクタをサポートした、最新の標準準拠の HTML パーサーです。 3.CsQuery:jQueryに精通したC#開発者のためのjQueryライクな構文 4.正規表現:単純な抽出作業用(複雑なHTMLにはお勧めしません) ネットワーク認証を使用してログインするにはどうすればよいですか? . <!コードの概念を示す図またはスクリーンショット --> ほとんどのASP.NETアプリケーションはネットワーク認証をサポートしており、HTMLフォームの投稿よりも信頼性があります。 IronPDFはChromeHttpLoginCredentialsクラスを通してベーシック、ダイジェスト、NTLM認証のビルトインサポートを提供します。 その他のヘッダーのカスタマイズについては、HTTP リクエストヘッダーガイドを参照してください。 :path=/static-assets/pdf/content-code-examples/how-to/logins-username-password.cs using IronPdf; using System; ChromePdfRenderer renderer = new ChromePdfRenderer { // setting login credentials to bypass basic authentication LoginCredentials = new ChromeHttpLoginCredentials() { NetworkUsername = "testUser", NetworkPassword = "testPassword" } }; var uri = new Uri("http://localhost:51169/Invoice"); // Render web URL to PDF PdfDocument pdf = renderer.RenderUrlAsPdf(uri); // Export PDF pdf.SaveAs("UrlToPdfExample.Pdf"); $vbLabelText $csharpLabel なぜネットワーク認証はフォーム投稿よりも信頼できるのですか ネットワーク認証は、HTMLフォーム投稿に比べていくつかの利点があります: 1.標準化されたプロトコル:RFC標準に従ったHTTP認証ヘッダを使用します。 2.ブラウザの統合:Chromeレンダリングエンジンは認証をシームレスに処理します。 3.セッション管理:認証チャレンジの自動処理とセッションの永続化 4.セキュリティ:フォームデータではなくヘッダを介して安全に送信される認証情報 5.互換性:ほとんどの企業認証システム(Active Directory、LDAP)で動作します。 ネットワーク認証にはどのような認証情報が必要ですか? 認証の種類によって、必要な認証情報は異なります: // Basic Authentication (most common) var basicAuth = new ChromeHttpLoginCredentials { NetworkUsername = "user@domain.com", NetworkPassword = "password123", AuthenticationType = ChromeHttpLoginCredentials.AuthType.Basic }; // NTLM/Windows Authentication var ntlmAuth = new ChromeHttpLoginCredentials { NetworkUsername = "DOMAIN\\username", // Include domain NetworkPassword = "password123", AuthenticationType = ChromeHttpLoginCredentials.AuthType.Ntlm }; // Custom authentication headers var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.CustomHttpHeaders.Add("X-API-Key", "your-api-key"); renderer.RenderingOptions.CustomHttpHeaders.Add("Authorization", "Bearer " + jwtToken); // Basic Authentication (most common) var basicAuth = new ChromeHttpLoginCredentials { NetworkUsername = "user@domain.com", NetworkPassword = "password123", AuthenticationType = ChromeHttpLoginCredentials.AuthType.Basic }; // NTLM/Windows Authentication var ntlmAuth = new ChromeHttpLoginCredentials { NetworkUsername = "DOMAIN\\username", // Include domain NetworkPassword = "password123", AuthenticationType = ChromeHttpLoginCredentials.AuthType.Ntlm }; // Custom authentication headers var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.CustomHttpHeaders.Add("X-API-Key", "your-api-key"); renderer.RenderingOptions.CustomHttpHeaders.Add("Authorization", "Bearer " + jwtToken); $vbLabelText $csharpLabel 認証失敗のトラブルシューティングはどうすればよいですか? よくある認証の問題と解決策 1.401認証されていません:認証情報と認証タイプを確認してください。 2.403 Forbidden:ユーザは認証されましたが、権限がありません。 3.タイムアウトエラー: 低速な認証システムのために RenderDelay を増やしてください。 4.証明書エラー:TLS/SSL設定を適切に構成する 問題を診断するためのデバッグを可能にします: // Enable detailed logging IronPdf.Logging.Logger.EnableDebugging = true; IronPdf.Logging.Logger.LogFilePath = "IronPdf.log"; IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All; // Test authentication try { var pdf = renderer.RenderUrlAsPdf("https://secure.example.com"); pdf.SaveAs("authenticated.pdf"); } catch (Exception ex) { Console.WriteLine($"Authentication failed: {ex.Message}"); // Check IronPdf.log for detailed error information } // Enable detailed logging IronPdf.Logging.Logger.EnableDebugging = true; IronPdf.Logging.Logger.LogFilePath = "IronPdf.log"; IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All; // Test authentication try { var pdf = renderer.RenderUrlAsPdf("https://secure.example.com"); pdf.SaveAs("authenticated.pdf"); } catch (Exception ex) { Console.WriteLine($"Authentication failed: {ex.Message}"); // Check IronPdf.log for detailed error information } $vbLabelText $csharpLabel HTMLフォームを使ってログインするには? HTMLフォームにデータを送信してログインするには、ChromeHttpLoginCredentialsクラスを使用してください。 IronPDFのChromeHttpLoginCredentials API.を参照してください。 以下の点を考慮してください:。 HTMLフォームのACTION属性で指定されたURLにログインデータを投稿します。 これを HttpLoginCredentials の LoginFormUrl 属性として設定します。 これは、PDFとしてレンダリングしたいURLとは異なる場合があります。 HTMLフォームのすべての入力とテキストエリアを表すデータを送信します。 name属性は、各変数名を定義します(idではありません)。 一部のウェブサイトでは、機械によるログインを積極的に防止しています。 以下は、フォームベースの認証の完全な例です: // Configure form-based login var formLogin = new ChromeHttpLoginCredentials { LoginFormUrl = "https://example.com/login", LoginFormData = new Dictionary<string, string> { {"username", "user@example.com"}, {"password", "securePassword123"}, {"rememberMe", "true"}, {"csrf_token", "abc123"} // Include any hidden fields } }; var renderer = new ChromePdfRenderer { LoginCredentials = formLogin, RenderingOptions = new ChromePdfRenderOptions { RenderDelay = 3000, // Allow time for login redirect EnableJavaScript = true } }; // The actual page you want to convert (after login) var pdf = renderer.RenderUrlAsPdf("https://example.com/dashboard"); pdf.SaveAs("dashboard.pdf"); // Configure form-based login var formLogin = new ChromeHttpLoginCredentials { LoginFormUrl = "https://example.com/login", LoginFormData = new Dictionary<string, string> { {"username", "user@example.com"}, {"password", "securePassword123"}, {"rememberMe", "true"}, {"csrf_token", "abc123"} // Include any hidden fields } }; var renderer = new ChromePdfRenderer { LoginCredentials = formLogin, RenderingOptions = new ChromePdfRenderOptions { RenderDelay = 3000, // Allow time for login redirect EnableJavaScript = true } }; // The actual page you want to convert (after login) var pdf = renderer.RenderUrlAsPdf("https://example.com/dashboard"); pdf.SaveAs("dashboard.pdf"); $vbLabelText $csharpLabel どのようなフォームデータを取得する必要がありますか? HTMLフォームによる認証を成功させるには、すべてのフォーム入力をキャプチャする必要があります: // Use this helper method to extract form fields public Dictionary<string, string> ExtractFormFields(string loginPageHtml) { var formData = new Dictionary<string, string>(); var doc = new HtmlDocument(); doc.LoadHtml(loginPageHtml); // Find all input fields var inputs = doc.DocumentNode.SelectNodes("//input"); if (inputs != null) { foreach (var input in inputs) { string name = input.GetAttributeValue("name", ""); string value = input.GetAttributeValue("value", ""); string type = input.GetAttributeValue("type", "text"); if (!string.IsNullOrEmpty(name)) { // Handle different input types switch (type.ToLower()) { case "checkbox": if (input.Attributes["checked"] != null) formData[name] = "on"; break; case "radio": if (input.Attributes["checked"] != null) formData[name] = value; break; default: formData[name] = value; break; } } } } // Don't forget select elements var selects = doc.DocumentNode.SelectNodes("//select"); if (selects != null) { foreach (var select in selects) { string name = select.GetAttributeValue("name", ""); var selected = select.SelectSingleNode(".//option[@selected]"); if (selected != null && !string.IsNullOrEmpty(name)) { formData[name] = selected.GetAttributeValue("value", ""); } } } return formData; } // Use this helper method to extract form fields public Dictionary<string, string> ExtractFormFields(string loginPageHtml) { var formData = new Dictionary<string, string>(); var doc = new HtmlDocument(); doc.LoadHtml(loginPageHtml); // Find all input fields var inputs = doc.DocumentNode.SelectNodes("//input"); if (inputs != null) { foreach (var input in inputs) { string name = input.GetAttributeValue("name", ""); string value = input.GetAttributeValue("value", ""); string type = input.GetAttributeValue("type", "text"); if (!string.IsNullOrEmpty(name)) { // Handle different input types switch (type.ToLower()) { case "checkbox": if (input.Attributes["checked"] != null) formData[name] = "on"; break; case "radio": if (input.Attributes["checked"] != null) formData[name] = value; break; default: formData[name] = value; break; } } } } // Don't forget select elements var selects = doc.DocumentNode.SelectNodes("//select"); if (selects != null) { foreach (var select in selects) { string name = select.GetAttributeValue("name", ""); var selected = select.SelectSingleNode(".//option[@selected]"); if (selected != null && !string.IsNullOrEmpty(name)) { formData[name] = selected.GetAttributeValue("value", ""); } } } return formData; } $vbLabelText $csharpLabel 正しいフォームアクションの URL を見つけるにはどうすればよいですか? フォームのアクションURLは、認証を成功させるために重要です: public string ExtractFormAction(string loginPageUrl, string loginPageHtml) { var doc = new HtmlDocument(); doc.LoadHtml(loginPageHtml); // Find the login form var form = doc.DocumentNode.SelectSingleNode("//form[contains(@action, 'login') or contains(@id, 'login') or contains(@class, 'login')]"); if (form == null) { // Try finding any form with password field form = doc.DocumentNode.SelectSingleNode("//form[.//input[@type='password']]"); } if (form != null) { string action = form.GetAttributeValue("action", ""); // Resolve relative URLs if (!string.IsNullOrEmpty(action)) { var baseUri = new Uri(loginPageUrl); var actionUri = new Uri(baseUri, action); return actionUri.ToString(); } } // Default to the login page URL if no action found return loginPageUrl; } public string ExtractFormAction(string loginPageUrl, string loginPageHtml) { var doc = new HtmlDocument(); doc.LoadHtml(loginPageHtml); // Find the login form var form = doc.DocumentNode.SelectSingleNode("//form[contains(@action, 'login') or contains(@id, 'login') or contains(@class, 'login')]"); if (form == null) { // Try finding any form with password field form = doc.DocumentNode.SelectSingleNode("//form[.//input[@type='password']]"); } if (form != null) { string action = form.GetAttributeValue("action", ""); // Resolve relative URLs if (!string.IsNullOrEmpty(action)) { var baseUri = new Uri(loginPageUrl); var actionUri = new Uri(baseUri, action); return actionUri.ToString(); } } // Default to the login page URL if no action found return loginPageUrl; } $vbLabelText $csharpLabel フォームベースの認証でよくある問題とは 1.CSRFトークン:多くのフォームには、期限切れの偽造防止トークンが含まれています。 2.JavaScriptの検証:JavaScriptの実行を必要とするフォームがあります。 3.多段階認証:複数のページを必要とするフォーム 4.CAPTCHA保護:人間による検証の課題 5.セッションタイムアウト:すぐに期限切れになるログインセッション ボット対策はどうすればよいですか? 最近のウェブサイトでは、自動ログインに対する保護機能が実装されています: // Strategies for handling anti-bot measures var renderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { // Mimic real browser behavior ViewPortWidth = 1920, ViewPortHeight = 1080, EnableJavaScript = true, RenderDelay = 5000, // Wait for JavaScript // Set a real user agent CustomHttpHeaders = new Dictionary<string, string> { {"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"} } } }; // For sites with rate limiting, add delays between requests System.Threading.Thread.Sleep(2000); // Strategies for handling anti-bot measures var renderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { // Mimic real browser behavior ViewPortWidth = 1920, ViewPortHeight = 1080, EnableJavaScript = true, RenderDelay = 5000, // Wait for JavaScript // Set a real user agent CustomHttpHeaders = new Dictionary<string, string> { {"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"} } } }; // For sites with rate limiting, add delays between requests System.Threading.Thread.Sleep(2000); $vbLabelText $csharpLabel 複雑な認証シナリオを含む包括的なHTMLからPDFへの変換ガイダンスについては、HTML to PDFチュートリアルをご覧ください。 どのように MVC 認証を処理しますか? . <!コードの概念を示す図またはスクリーンショット --> 次の回避策は、.NET MVCビューをプログラムで文字列にレンダリングし、ビューを忠実にレンダリングしながらMVCログインを回避します。 このアプローチは、CSHTML to PDF in MVC CoreやMVC Frameworkを変換するときに効果的です。 // Converts an MVC partial view to a string public static string RenderPartialViewToString(this Controller controller, string viewPath, object model = null) { try { // Set the model var context = controller.ControllerContext; controller.ViewData.Model = model; using (var sw = new StringWriter()) { // Find the partial view var viewResult = ViewEngines.Engines.FindPartialView(context, viewPath); if (viewResult.View == null) { throw new Exception($"Partial view {viewPath} could not be found."); } // Create a view context var viewContext = new ViewContext(context, viewResult.View, context.Controller.ViewData, context.Controller.TempData, sw); // Render the view viewResult.View.Render(viewContext, sw); viewResult.ViewEngine.ReleaseView(context, viewResult.View); return sw.GetStringBuilder().ToString(); } } catch (Exception ex) { // Return error message if there is an exception return ex.Message; } } // Usage in an MVC Controller public ActionResult GeneratePdf() { // Render authenticated view to string var model = new InvoiceViewModel { /* populate model */ }; string html = this.RenderPartialViewToString("~/Views/Invoice/Details.cshtml", model); // Convert to PDF var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(html); // Return PDF file return File(pdf.BinaryData, "application/pdf", "invoice.pdf"); } // Converts an MVC partial view to a string public static string RenderPartialViewToString(this Controller controller, string viewPath, object model = null) { try { // Set the model var context = controller.ControllerContext; controller.ViewData.Model = model; using (var sw = new StringWriter()) { // Find the partial view var viewResult = ViewEngines.Engines.FindPartialView(context, viewPath); if (viewResult.View == null) { throw new Exception($"Partial view {viewPath} could not be found."); } // Create a view context var viewContext = new ViewContext(context, viewResult.View, context.Controller.ViewData, context.Controller.TempData, sw); // Render the view viewResult.View.Render(viewContext, sw); viewResult.ViewEngine.ReleaseView(context, viewResult.View); return sw.GetStringBuilder().ToString(); } } catch (Exception ex) { // Return error message if there is an exception return ex.Message; } } // Usage in an MVC Controller public ActionResult GeneratePdf() { // Render authenticated view to string var model = new InvoiceViewModel { /* populate model */ }; string html = this.RenderPartialViewToString("~/Views/Invoice/Details.cshtml", model); // Convert to PDF var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(html); // Return PDF file return File(pdf.BinaryData, "application/pdf", "invoice.pdf"); } $vbLabelText $csharpLabel なぜ直接変換ではなく、ビューを文字列にレンダリングするのですか? MVCビューを文字列にレンダリングすると、いくつかの重要な利点があります: 1.認証コンテキスト:ビューは認証されたユーザーのコンテキスト内でレンダリングされます。 2.完全なMVCパイプライン:ViewBag、TempData、Htmlヘルパーを含むすべての MVC 機能が動作します。 3.レイアウトサポート:マスターページとレイアウトが正しくレンダリングされます。 4.モデルバインディング:複雑なビューモデルをシームレスに動作させる 5.アクションフィルタ: セキュリティフィルタとロギングフィルタは正常に実行されます。 この MVC 回避策の利点は何ですか? MVC文字列レンダリングアプローチを提供します: セキュリティ: 内部URLを公開したり、認証をバイパスしたりする必要はありません。 パフォーマンス:追加のHTTPリクエストを避ける 一貫性: ユーザーがブラウザで見るものと同じ出力。 柔軟性:PDF変換前にHTMLを修正 テスト:HTML生成を簡単にユニットテストする レンダリング ビューにモデルを渡すには? 以下は、複雑なモデルを含む包括的な例です: public class InvoiceController : Controller { private readonly IInvoiceService _invoiceService; public async Task<ActionResult> DownloadInvoicePdf(int invoiceId) { // Load data within authenticated context var invoice = await _invoiceService.GetInvoiceAsync(invoiceId); if (invoice == null || invoice.UserId != User.Identity.GetUserId()) { return HttpNotFound(); } // Create view model var viewModel = new InvoiceDetailsViewModel { Invoice = invoice, Company = await _invoiceService.GetCompanyDetailsAsync(), LineItems = await _invoiceService.GetLineItemsAsync(invoiceId), TaxDetails = await _invoiceService.GetTaxDetailsAsync(invoiceId) }; // Render to HTML string string html = this.RenderPartialViewToString("~/Views/Invoice/DetailsPdf.cshtml", viewModel); // Add custom styling for PDF html = $@" <html> <head> <style> body {{ font-family: Arial, sans-serif; }} .invoice-header {{ background-color: #f0f0f0; padding: 20px; }} .line-items {{ width: 100%; border-collapse: collapse; }} .line-items th, .line-items td {{ border: 1px solid #ddd; padding: 8px; }} </style> </head> <body> {html} </body> </html>"; // Convert to PDF with options var renderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { MarginTop = 20, MarginBottom = 20, MarginLeft = 10, MarginRight = 10, PrintHtmlBackgrounds = true } }; var pdf = renderer.RenderHtmlAsPdf(html); // Add metadata pdf.MetaData.Author = "Invoice System"; pdf.MetaData.Title = $"Invoice #{invoice.Number}"; pdf.MetaData.CreationDate = DateTime.Now; return File(pdf.BinaryData, "application/pdf", $"Invoice-{invoice.Number}.pdf"); } } public class InvoiceController : Controller { private readonly IInvoiceService _invoiceService; public async Task<ActionResult> DownloadInvoicePdf(int invoiceId) { // Load data within authenticated context var invoice = await _invoiceService.GetInvoiceAsync(invoiceId); if (invoice == null || invoice.UserId != User.Identity.GetUserId()) { return HttpNotFound(); } // Create view model var viewModel = new InvoiceDetailsViewModel { Invoice = invoice, Company = await _invoiceService.GetCompanyDetailsAsync(), LineItems = await _invoiceService.GetLineItemsAsync(invoiceId), TaxDetails = await _invoiceService.GetTaxDetailsAsync(invoiceId) }; // Render to HTML string string html = this.RenderPartialViewToString("~/Views/Invoice/DetailsPdf.cshtml", viewModel); // Add custom styling for PDF html = $@" <html> <head> <style> body {{ font-family: Arial, sans-serif; }} .invoice-header {{ background-color: #f0f0f0; padding: 20px; }} .line-items {{ width: 100%; border-collapse: collapse; }} .line-items th, .line-items td {{ border: 1px solid #ddd; padding: 8px; }} </style> </head> <body> {html} </body> </html>"; // Convert to PDF with options var renderer = new ChromePdfRenderer { RenderingOptions = new ChromePdfRenderOptions { MarginTop = 20, MarginBottom = 20, MarginLeft = 10, MarginRight = 10, PrintHtmlBackgrounds = true } }; var pdf = renderer.RenderHtmlAsPdf(html); // Add metadata pdf.MetaData.Author = "Invoice System"; pdf.MetaData.Title = $"Invoice #{invoice.Number}"; pdf.MetaData.CreationDate = DateTime.Now; return File(pdf.BinaryData, "application/pdf", $"Invoice-{invoice.Number}.pdf"); } } $vbLabelText $csharpLabel 認証ソリューションを実装する前に、IronPDFが正しくインストールされ、ライセンスキーが設定されていることを確認してください。 次に何ができるのかを見てみましょうか? チュートリアルページをご覧ください:PDFを変換するをご覧ください。 よくある質問 コンテンツがログインフォームの後ろにある場合、どのようにHTMLをPDFに変換できますか? IronPDFはログイン認証の後ろでHTMLをPDFに変換するための複数のアプローチを提供します。TLSネットワーク認証のためにChromeHttpLoginCredentials APIを使用したり、適切な認証ヘッダーを持つSystem.Net.WebClientやHttpClientを使用してHTMLコンテンツをダウンロードしてからIronPDFでPDFに変換することができます。 ChromeHttpLoginCredentials とは何ですか? ChromeHttpLoginCredentialsはIronPDFのネットワーク認証APIです。ChromePdfRendererのLoginCredentialsプロパティにユーザー名とパスワードを設定することで使用でき、パスワードで保護されたURLをPDFにレンダリングする際にIronPDFが自動的に認証を行います。 PDF変換でHTMLフォームベースのログインを扱うことはできますか? はい、IronPDFはHTMLフォームベースのログインに対応しています。推奨される方法は、System.Net.WebClientまたはHttpClientを使用してログインプロセスを処理し、認証されたHTMLコンテンツをダウンロードし、IronPDFのRenderHtmlAsPdfメソッドを使用してダウンロードしたHTMLをPDFに変換することです。 認証されたページから画像やスタイルシートなどのHTML資産をダウンロードするにはどうすればよいですか? HtmlAgilityPackを使用して、ダウンロードしたHTMLを解析し、画像やスタイルシートなどのアセットURLを抽出することができます。そしてSystem.Net.WebClientを使用して各アセットを同じ認証ヘッダーでダウンロードし、IronPDFでHTMLパッケージ全体をPDFに変換します。 認証トークンやヘッダーを扱うためのベストプラクティスは何ですか? 認証トークンを使ってIronPDFを使用する場合、HttpClientまたはWebClientを使って認証ヘッダー(ベアラートークンなど)と一緒にHTMLをダウンロードしてください。認証されたHTMLコンテンツをメモリかディスクに保存したら、IronPDFのChromePdfRendererを使ってPDFに変換します。 MVCログイン認証の回避策はありますか? はい、IronPDFはMVCログイン認証シナリオの回避策を提供します。推奨される方法は、まず標準的な.NET HTTPクライアントを使用してHTMLコンテンツを認証してダウンロードし、認証されたHTMLをIronPDFのレンダリングエンジンに直接渡すことです。 カーティス・チャウ 今すぐエンジニアリングチームとチャット テクニカルライター Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。 準備はできましたか? Nuget ダウンロード 17,527,568 | バージョン: 2026.2 リリース NuGet 無料版 総ダウンロード数: 17,527,568 ライセンスを見る