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 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
Bitte beachten Sie
System.Uri
verwendet wird. Um alle relativen Pfade in einem gesamten HTML-Dokument umzubasieren, fügen Sie einAnmeldung ü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
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