Konvertieren von HTML in PDF hinter der Anmeldeauthentifizierung
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.
Konvertieren von HTML in PDF hinter der Anmeldeauthentifizierung
Bewährte Praktiken
IronPDF unterstützt die TLS-Netzwerkauthentifizierung (Benutzername und Passwort), die äußerst sicher ist, und .NET-Webanwendungen können sie problemlos unterstützen: ChromeHttpLoginCredentials API
Die beste Praxis ist die Verwendung von System.Net.WebClient
oder HttpClient
, um das HTML 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
entdeckt und anschließend 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
[{i:(Jede relative URL kann mithilfe eines überladenen Konstruktors der System.Uri
-Klasse in eine absolute URL umgewandelt werden. Um relative Pfade in einem gesamten HTML-Dokument neu zu definieren, fügen Sie mit HtmlAgilityPack einen
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")
Anmeldung über ein HTML-Formular
Das Einloggen durch das Senden von Daten an ein HTML-Formular kann auch mit der ChromeHttpLoginCredentials-Klasse erreicht werden, wie im vorherigen Beispiel. Siehe die ChromeHttpLoginCredentials API von IronPDF.
Bitte beachten Sie:
- Die Anmeldedaten müssen an die im ACTION-Attribut des HTML-Formulars angegebene URL gesendet werden. Dies sollte als das *LoginFormUrl*-Attribut der HttpLoginCredentials festgelegt werden. 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 Name-Attribute definieren den Namen jeder Variablen (nicht die ID, wie 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