Konvertieren von HTML in PDF hinter der Anmeldeauthentifizierung

This article was translated from English: Does it need improvement?
Translated
View the article in English

Der beste Weg, mit Logins umzugehen, ist, sie wenn möglich zu vermeiden und HTML direkt aus einer Datei oder einem String zu rendern.

Erste Schritte mit IronPDF

Beginnen Sie noch heute mit der Verwendung von IronPDF in Ihrem Projekt mit einer kostenlosen Testversion.

Erster Schritt:
green arrow pointer



Bewährte Praktiken

IronPDF unterstützt TLS-Netzwerkauthentifizierung(benutzernamen und Passwort) die extrem sicher ist und von .NET-Webanwendungen problemlos unterstützt werden kann:ChromeHttpLoginCredentials API

Am besten verwenden Sie System.Net.WebClient oder HttpClient, um den HTML-Code und alle Assets herunterzuladen. Dabei werden Header, Logins und alles andere, was Sie benötigen, vollständig unterstützt. Nach dem Herunterladen in den Arbeitsspeicher oder auf die Festplatte kann IronPDF Ihr HTML in eine PDF-Datei umwandeln. Assets wie Stylesheets und Bilder können mit dem HtmlAgilityPack ermittelt und dann ebenfalls mit dem System.Net.WebClient heruntergeladen werden.

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
VB   C#

Bitte beachten Sie
Jede relative Url kann in eine absolute Url umgewandelt werden, indem ein überladener Konstruktor für die Klasse System.Uri verwendet wird. Um alle relativen Pfade in einem gesamten HTML-Dokument umzubasieren, fügen Sie einmit HtmlAgilityPack in die Kopfzeile. Beispiel.

Anmeldung über Netzwerkauthentifizierung

Die meisten ASP.NET-Anwendungen unterstützen die Netzwerkauthentifizierung, die zuverlässiger ist als das Senden von HTML-Formularen.

: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")
VB   C#

Anmeldung über ein HTML-Formular

Die Anmeldung durch Senden von Daten an ein HTML-Formular kann auch mit der Klasse ChromeHttpLoginCredentials erfolgen, wie im vorherigen Beispiel. Siehe IronPDFsChromeHttpLoginCredentials API.

Bitte beachten Sie:

  • Die Anmeldedaten müssen an die im ACTION-Attribut des HTML-Formulars angegebene URL gesendet werden. Dies sollte als * eingestellt werdenLoginFormUrl*-Attribut der HttpLoginCredentials. Dies kann von der URL abweichen, die Sie tatsächlich als PDF wiedergeben möchten.
  • Die zu sendenden Daten sollten alle Eingaben und Textfelder des HTML-Formulars repräsentieren. Die Attribute name definieren den Namen jeder Variablen(nicht die ID, wie es häufig missverstanden wird).
  • Einige Websites schützen sich aktiv gegen diese Art der maschinellen Anmeldung.

MVC

Mit dem folgenden Workaround kann eine .NET MVC-Ansicht programmatisch in einen String umgewandelt werden, was sehr nützlich ist, um MVC-Anmeldungen zu vermeiden und dennoch eine Ansicht originalgetreu darzustellen.

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
VB   C#