Cómo convertir HTML a PDF tras la autenticación de inicio de sesión

Chaknith Bin
Chaknith Bin
25 de enero, 2023
Actualizado 10 de diciembre, 2024
Compartir:
This article was translated from English: Does it need improvement?
Translated
View the article in English

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.

Primer Paso:
green arrow pointer



Buenas prácticas

IronPDF admite la autenticación de red TLS (nombre de usuario y contraseña), que es extremadamente segura, y las aplicaciones web .NET pueden soportarla fácilmente: ChromeHttpLoginCredentials API

La mejor práctica es usar 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. Los recursos como hojas de estilo e imágenes pueden ser descubiertos utilizando HtmlAgilityPack y luego descargados usando System.Net.WebClient también.

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

[{i:(Cualquier URL relativa se puede convertir en una URL absoluta usando un constructor sobrecargado para la clase System.Uri.) Para reajustar cualquier ruta relativa en un documento HTML completo, agregue una pestaña

en el encabezado utilizando HtmlAgilityPack. Ejemplo

Inicio 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")
$vbLabelText   $csharpLabel

Inicio de sesión mediante un formulario HTML

Iniciar sesión enviando datos a un formulario HTML también se puede lograr utilizando la clase ChromeHttpLoginCredentials, como en el ejemplo anterior. Vea la API de ChromeHttpLoginCredentials de IronPDF.

Por favor considere:

  • Los datos de acceso deben publicarse en la URL especificada en el atributo ACTION del formulario HTML. Esto debe configurarse como el atributo *LoginFormUrl* de 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 de nombre definen el nombre de cada variable (no el id, como comúnmente se malinterpreta).
  • 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
$vbLabelText   $csharpLabel
Chaknith Bin
Ingeniero de software
Chaknith trabaja en IronXL e IronBarcode. Tiene una gran experiencia en C# y .NET, ayudando a mejorar el software y a apoyar a los clientes. Sus conocimientos de las interacciones con los usuarios contribuyen a mejorar los productos, la documentación y la experiencia general.