如何在登录验证后将 HTML 转换为 PDF

查克尼特·宾
查克尼特·宾
2023年一月25日
更新 2024年十二月10日
分享:
This article was translated from English: Does it need improvement?
Translated
View the article in English

处理登录的最佳方法是尽可能避免登录,直接从文件或字符串渲染 HTML。

开始使用IronPDF

立即在您的项目中开始使用IronPDF,并享受免费试用。

第一步:
green arrow pointer



最佳实践

IronPDF 支持 TLS 网络身份验证(用户名和密码),这非常安全,并且 .NET 网络应用程序可以轻松支持:ChromeHttpLoginCredentials API

最佳实践是使用System.Net.WebClientHttpClient下载HTML和任何资产。 这完全支持头文件、登录和其他一切您可能需要的功能。下载到内存或磁盘后,IronPDF 可将您的 HTML 转化为 PDF。 可以使用HtmlAgilityPack发现样式表和图像等资产,然后使用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));
}

任何相对 URL 都可以通过使用 System.Uri 类的重载构造函数转换为绝对 URL。 要在整个HTML文档中重新设定任何相对路径,请使用HtmlAgilityPack在头部添加一个

标签。 示例.)}]

使用网络认证登录

大多数 ASP.NET 应用程序都支持网络验证,这比 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");

使用HTML表单登录

通过将数据发送到 HTML 表单来登录也可以使用 ChromeHttpLoginCredentials 类来实现,如上例所示。 请参阅 IronPDF 的 ChromeHttpLoginCredentials API

请考虑:

  • 登录数据必须发布到 HTML 表单 ACTION 属性中指定的 URL 上。 这应该设置为 HttpLoginCredentials 的 *LoginFormUrl* 属性。 这可能与您实际希望呈现为 PDF 的 URL 有所不同。
  • 要发送的数据应代表 HTML 表单中的每个输入和文本区域。 name 属性定义每个变量的名称(而不是常被误解的 id)。
  • 某些网站可能会主动防止此类机器登录。

模型-视图-控制器 (MVC)

以下变通方法允许以编程方式将 .NET MVC 视图渲染为字符串,这对于避免 MVC 登录但又能忠实渲染视图非常有用。

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;
    }
}
查克尼特·宾
软件工程师
Chaknith 负责 IronXL 和 IronBarcode 的工作。他在 C# 和 .NET 方面拥有深厚的专业知识,帮助改进软件并支持客户。他从用户互动中获得的洞察力,有助于提升产品、文档和整体体验。