Cómo convertir HTML a PDF tras la autenticación de inicio de sesión
La mejor manera de tratar los inicios de sesión es evitarlos si es posible y renderizar el HTML directamente desde un archivo o una cadena.
Comience con IronPDF
Comience a usar IronPDF en su proyecto hoy con una prueba gratuita.
Cómo convertir HTML a PDF tras la autenticación de inicio de sesión
Buenas prácticas
IronPDF admite la autenticación de red TLS(nombre de usuario y contraseña) que es extremadamente seguro, y las aplicaciones web .NET pueden soportarlo fácilmente:API ChromeHttpLoginCredentials
La mejor práctica es utilizar System.Net.WebClient
o HttpClient
para descargar el HTML y cualquier activo. Esto es totalmente compatible con cabeceras, inicios de sesión y todo lo que pueda necesitar. Una vez descargado en la memoria o en el disco, IronPDF puede convertir su HTML en un PDF. Activos como hojas de estilo e imágenes pueden ser descubiertos usando el HtmlAgilityPack
y luego descargados usando también el 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
Atención
System.Uri
. Para volver a basar cualquier ruta relativa en un documento HTML completo, añada una directivaInicio de sesión mediante autenticación de red
La mayoría de las aplicaciones ASP.NET admiten la autenticación en red, que es más fiable que la publicación de formularios 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")
Inicio de sesión mediante un formulario HTML
Para iniciar sesión enviando datos a un formulario HTML también se puede utilizar la clase ChromeHttpLoginCredentials, como en el ejemplo anterior. Ver IronPDF'sAPI ChromeHttpLoginCredentials.
Por favor considere:
- Los datos de acceso deben publicarse en la URL especificada en el atributo ACTION del formulario HTML. Esto se debe establecer como el \ LoginFormUrl\ del atributo HttpLoginCredentials. Esto puede variar con respecto a la URL que realmente desea renderizar como PDF.
- Los datos a enviar deben representar cada entrada y textarea del formulario HTML. Los atributos name definen el nombre de cada variable(no el id, como se suele malinterpretar).
- Algunos sitios web pueden protegerse activamente contra este tipo de inicio de sesión automático.
MVC
La siguiente solución permite que una vista MVC de .NET se convierta mediante programación en una cadena, lo que resulta muy útil para evitar los inicios de sesión en MVC y, al mismo tiempo, convertir una vista fielmente.
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