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

La mejor manera de lidiar con los inicios de sesión es evitarlos si es posible, y renderizar html directamente desde un archivo o una cadena.


Biblioteca NuGet C# para PDF

Instalar con NuGet

Install-Package IronPdf
o
Java PDF JAR

Descargar DLL

Descargar DLL

Instalar manualmente en su proyecto

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

Tenga en cuenta
Cualquier url relativa puede ser convertida en una url absoluta usando un constructor sobrecargado para la clase System.Uri. Para volver a basar cualquier ruta relativa en un documento html completo, añada una directivaa la cabecera utilizando HtmlAgilityPack. Ejemplo.

Inicio de sesión mediante autenticación de red

La mayoría de las aplicaciones ASP.NET admiten la autenticación de 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
{
    //  configuración de las credenciales de inicio de sesión para eludir la autenticación básica
    LoginCredentials = new ChromeHttpLoginCredentials()
    {
        NetworkUsername = "testUser",
        NetworkPassword = "testPassword"
    }
};

var uri = new Uri("http://localhost:51169/Factura");

//  Convertir URL web en PDF
PdfDocument pdf = renderer.RenderUrlAsPdf(uri);

//  Exportar 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/Factura")

'  Convertir URL web en PDF
Private pdf As PdfDocument = renderer.RenderUrlAsPdf(uri)

'  Exportar PDF
pdf.SaveAs("UrlToPdfExample.Pdf")
VB   C#

Inicio de sesión mediante un formulario HTML

Para iniciar sesión enviando datos a un formulario HTML también se puede conseguir utilizando la clase ChromeHttpLoginCredentials como en el ejemplo anterior. Ver IronPDF's API ChromeHttpLoginCredentials.

Por favor considere:

  • Los datos de acceso deben enviarse a la URL especificada en el atributo ACTION del formulario HTML. Esto se debe establecer como el \ LoginFormUrl\ del atributo HttpLoginCredentials. Esto puede variar de 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 proteger activamente contra este tipo de inicio de sesión de la máquina.

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