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

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

Atención
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 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")
VB   C#

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