認証ログインを介したHTMLからPDFへの変換方法

チャクニット・ビン
チャクニット・ビン
2023年1月25日
更新済み 2024年12月10日
共有:
This article was translated from English: Does it need improvement?
Translated
View the article in English

ログインを扱う最良の方法は、可能であればログインを避け、ファイルまたは文字列から直接HTMLをレンダリングすることです。

IronPDFを始めましょう

今日から無料トライアルでIronPDFをあなたのプロジェクトで使い始めましょう。

最初のステップ:
green arrow pointer



ベストプラクティス

IronPDFはTLSネットワーク認証(ユーザー名とパスワード)をサポートしており、非常に安全です。.NETウェブアプリは簡単に対応できます:ChromeHttpLoginCredentials API

ベストプラクティスは、HTMLおよび任意のアセットをダウンロードするためにSystem.Net.WebClientまたはHttpClientを使用することです。 これは、ヘッダー、ログイン、その他必要なものすべてを完全にサポートしています。メモリやディスクにダウンロードされると、IronPDFはHTMLをPDFに変換します。 スタイルシートや画像などのアセットは、HtmlAgilityPackを使用して発見し、System.Net.WebClientを使用してダウンロードすることもできます。

string html;
using (WebClient client = new WebClient()) {
    html = client.DownloadString("http://www.google.com");
}
HtmlDocument doc = new HtmlDocument();        
doc.LoadHtml(html);
foreach(HtmlNode img in doc.DocumentNode.SelectNodes("//img")) {
    Console.WriteLine(img.GetAttributeValue("src", null));
}
string html;
using (WebClient client = new WebClient()) {
    html = client.DownloadString("http://www.google.com");
}
HtmlDocument doc = new HtmlDocument();        
doc.LoadHtml(html);
foreach(HtmlNode img in doc.DocumentNode.SelectNodes("//img")) {
    Console.WriteLine(img.GetAttributeValue("src", null));
}
Dim html As String
Using client As New WebClient()
	html = client.DownloadString("http://www.google.com")
End Using
Dim doc As New HtmlDocument()
doc.LoadHtml(html)
For Each img As HtmlNode In doc.DocumentNode.SelectNodes("//img")
	Console.WriteLine(img.GetAttributeValue("src", Nothing))
Next img
$vbLabelText   $csharpLabel

次の内容にご注意ください。
任意の相対URLは、System.Uriクラスのオーバーロードされたコンストラクタを使用して絶対URLに再ベース化できます。 HTML全体のドキュメントで任意の相対パスを再ベース化するには、HtmlAgilityPackを使用してヘッダーにタブを追加します。 .

ネットワーク認証を使用してログイン

ほとんどのASP.NETアプリケーションはネットワーク認証をサポートしており、HTMLのフォーム投稿よりも信頼性が高い。

: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");
Imports IronPdf
Imports System

Private renderer As New ChromePdfRenderer With {
	.LoginCredentials = New ChromeHttpLoginCredentials() With {
		.NetworkUsername = "testUser",
		.NetworkPassword = "testPassword"
	}
}

Private uri = New Uri("http://localhost:51169/Invoice")

' Render web URL to PDF
Private pdf As PdfDocument = renderer.RenderUrlAsPdf(uri)

' Export PDF
pdf.SaveAs("UrlToPdfExample.Pdf")
$vbLabelText   $csharpLabel

HTMLフォームを使用してログイン

データをHTMLフォームに送信してログインすることも、前の例で示したようにChromeHttpLoginCredentialsクラスを使用して実現できます。 IronPDF の ChromeHttpLoginCredentials API を参照してください。

ご考慮ください:

  • ログインデータは、HTMLフォームのACTION属性で指定されたURLに投稿されなければなりません。 これは、HttpLoginCredentials の *LoginFormUrl* 属性として設定する必要があります。 これは、実際にPDFとしてレンダリングしたいURLとは異なる場合があります。
  • 送信されるデータは、HTMLフォーム内のすべての入力とテキストエリアを表す必要があります。 名前属性は各変数の名前を定義します(一般的に誤解されているようにidではありません)。
  • ウェブサイトによっては、この種の機械ログインを積極的に防止している場合があります。

MVC

以下の回避策は、.NET MVCビューをプログラムで文字列にレンダリングできるようにするもので、MVCのログインを回避しながらビューを忠実にレンダリングするのに非常に便利です。

public static string RenderPartialViewToString(this Controller controller, string viewPath, object model = null)
{
    try
    {
        var context = controller.ControllerContext;

        controller.ViewData.Model = model;

        using (var sw = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindPartialView(context, viewPath);

            if (viewResult.View == null)
            {
                throw new Exception($"Partial view {viewPath} could not be found.");
            }

            var viewContext = new ViewContext(context, viewResult.View, context.Controller.ViewData, context.Controller.TempData, sw);

            viewResult.View.Render(viewContext, sw);
            viewResult.ViewEngine.ReleaseView(context, viewResult.View);

            return sw.GetStringBuilder().ToString();
        }
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
}
public static string RenderPartialViewToString(this Controller controller, string viewPath, object model = null)
{
    try
    {
        var context = controller.ControllerContext;

        controller.ViewData.Model = model;

        using (var sw = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindPartialView(context, viewPath);

            if (viewResult.View == null)
            {
                throw new Exception($"Partial view {viewPath} could not be found.");
            }

            var viewContext = new ViewContext(context, viewResult.View, context.Controller.ViewData, context.Controller.TempData, sw);

            viewResult.View.Render(viewContext, sw);
            viewResult.ViewEngine.ReleaseView(context, viewResult.View);

            return sw.GetStringBuilder().ToString();
        }
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
}
<System.Runtime.CompilerServices.Extension> _
Public Function RenderPartialViewToString(ByVal controller As Controller, ByVal viewPath As String, Optional ByVal model As Object = Nothing) As String
	Try
		Dim context = controller.ControllerContext

		controller.ViewData.Model = model

		Using sw = New StringWriter()
			Dim viewResult = ViewEngines.Engines.FindPartialView(context, viewPath)

			If viewResult.View Is Nothing Then
				Throw New Exception($"Partial view {viewPath} could not be found.")
			End If

			Dim viewContext As New ViewContext(context, viewResult.View, context.Controller.ViewData, context.Controller.TempData, sw)

			viewResult.View.Render(viewContext, sw)
			viewResult.ViewEngine.ReleaseView(context, viewResult.View)

			Return sw.GetStringBuilder().ToString()
		End Using
	Catch ex As Exception
		Return ex.Message
	End Try
End Function
$vbLabelText   $csharpLabel
チャクニット・ビン
ソフトウェアエンジニア
ChaknithはIronXLとIronBarcodeで作業しています。彼はC#と.NETに深い専門知識を持ち、ソフトウェアの改善と顧客サポートを支援しています。ユーザーとの対話から得た彼の洞察は、より良い製品、文書、および全体的な体験に貢献しています。