C# İçinde Giriş Doğrulaması Arkasında HTML'den PDF'ye Dönüştürme
C#'da oturum açma kimlik doğrulaması arkasında HTML'yi PDF'ye dönüştürmek için, ağ kimlik doğrulaması için IronPDF'nin ChromeHttpLoginCredentials'sini kullanın veya dönüştürme işleminden önce HttpClient'yi kullanarak HTML'yi indirin. Bu yaklaşım, hem ağ doğrulamalarını hem de HTML form girişlerini etkili bir şekilde ele alır.
Hızlı Başlangıç: IronPDF ile Giriş Arkasında HTML'den PDF'ye Dönüştürme
Giriş formları arkasında HTML sayfalarını PDF'ye dönüştürmek için IronPDF'nin API'sini kullanın. Bu kılavuz, kimlik doğrulama ve korumalı içerik alımı için ChromeHttpLoginCredentials'yi göstermektedir. Hem ağ doğrulamalarını hem de HTML form girişlerini basit kod örnekleriyle ele alın.
-
IronPDF aşağıdaki NuGet Paket Yöneticisi ile yükleyin
PM > Install-Package IronPdf -
Bu kod parçacığını kopyalayın ve çalıştırın.
new ChromePdfRenderer { LoginCredentials = new ChromeHttpLoginCredentials("username","password") } .RenderUrlAsPdf("https://example.com/protected") .SaveAs("secure.pdf"); -
Canlı ortamınızda test için dağıtım yapın
Ücretsiz deneme ile bugün projenizde IronPDF kullanmaya başlayın
Asgari İş Akışı (5 adım)
- C# IronPDF Kütüphanesini İndirin
- Girişleri Atlatmak için HTML'yi İndirin
- LoginCredentials özelliğini kullanarak Ağ Doğrulaması ile giriş yapın
- Doğrulama için HTML Formunu Kullanın
- MVC Giriş Doğrulaması İçin Çözüm
Giriş Doğrulaması Ele Alırken En İyi Uygulamalar Nelerdir?
IronPDF, ChromeHttpLoginCredentials API üzerinden TLS ağ doğrulamasını (kullanıcı adı ve şifre) destekler. Çeşitli giriş senaryoları hakkında kapsamlı bir rehber için, TLS Web Sitesi & Sistem Girişleri eğitim rehberine bakın.
Önerilen yaklaşım, HTML ve varlıkları indirmek için System.Net.WebClient veya HttpClient kullanmaktır. Bu yöntem, başlıklar, girişler ve diğer gereksinimleri destekler. Hafızaya veya diske indirildikten sonra, IronPDF HTML'yi PDF'ye dönüştürür. HtmlAgilityPack kullanarak stil sayfaları ve görüntüler gibi varlıkları ayıklayın, ardından System.Net.WebClient ile indirin.
// Download HTML content from a URL with authentication
string html;
using (WebClient client = new WebClient())
{
// Add authentication headers if needed
client.Headers.Add("Authorization", "Bearer " + accessToken);
// Download the HTML string
html = client.DownloadString("http://www.example.com/protected-content");
}
// Load the HTML into an HtmlDocument for parsing
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
// Extract all image sources for downloading
foreach(HtmlNode img in doc.DocumentNode.SelectNodes("//img"))
{
string imgSrc = img.GetAttributeValue("src", null);
Console.WriteLine($"Found image: {imgSrc}");
// Download each image asset
if (!string.IsNullOrEmpty(imgSrc))
{
string fileName = Path.GetFileName(imgSrc);
client.DownloadFile(imgSrc, fileName);
}
}
// Convert the downloaded HTML to PDF
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("authenticated-content.pdf");
// Download HTML content from a URL with authentication
string html;
using (WebClient client = new WebClient())
{
// Add authentication headers if needed
client.Headers.Add("Authorization", "Bearer " + accessToken);
// Download the HTML string
html = client.DownloadString("http://www.example.com/protected-content");
}
// Load the HTML into an HtmlDocument for parsing
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
// Extract all image sources for downloading
foreach(HtmlNode img in doc.DocumentNode.SelectNodes("//img"))
{
string imgSrc = img.GetAttributeValue("src", null);
Console.WriteLine($"Found image: {imgSrc}");
// Download each image asset
if (!string.IsNullOrEmpty(imgSrc))
{
string fileName = Path.GetFileName(imgSrc);
client.DownloadFile(imgSrc, fileName);
}
}
// Convert the downloaded HTML to PDF
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("authenticated-content.pdf");
Imports System.Net
Imports HtmlAgilityPack
Imports IronPdf
' Download HTML content from a URL with authentication
Dim html As String
Using client As New WebClient()
' Add authentication headers if needed
client.Headers.Add("Authorization", "Bearer " & accessToken)
' Download the HTML string
html = client.DownloadString("http://www.example.com/protected-content")
End Using
' Load the HTML into an HtmlDocument for parsing
Dim doc As New HtmlDocument()
doc.LoadHtml(html)
' Extract all image sources for downloading
For Each img As HtmlNode In doc.DocumentNode.SelectNodes("//img")
Dim imgSrc As String = img.GetAttributeValue("src", Nothing)
Console.WriteLine($"Found image: {imgSrc}")
' Download each image asset
If Not String.IsNullOrEmpty(imgSrc) Then
Dim fileName As String = Path.GetFileName(imgSrc)
Using client As New WebClient()
client.DownloadFile(imgSrc, fileName)
End Using
End If
Next
' Convert the downloaded HTML to PDF
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("authenticated-content.pdf")
System.Uri yapıcıyı kullanarak göreceli URL'leri mutlak URL'lere dönüştürün. Bir HTML belgesindeki tüm göreceli yolları yeniden temel almak için, HtmlAgilityPack kullanarak başlığa <base> etiketini ekleyin. Örnek. URL'leri ve varlıkları ele alma hakkında daha fazla bilgi için Temel URL'ler ve Varlık Kodlama kılavuzuna bakın.HTML İçeriğini İlk İndirmem Gerekir mi?
Dönüştürme öncesinde HTML içeriğinin indirilmesi çeşitli avantajlar sağlar:
- Tam Kontrol: Dönüştürmeden önce HTML'yi değiştirin, bozuk bağlantıları düzeltin veya doğrulama belirteçlerini ekleyin
- Varlık Yönetimi: Resimler, CSS ve JavaScript dosyaları gibi harici kaynakları indirin ve önbelleğe alın
- Doğrulama Esnekliği: OAuth, JWT belirteçleri veya özel başlıklar dahil olmak üzere herhangi bir .NET doğrulama mekanizmasını kullanın
- Performans: Sunucu yükünü azaltmak için sık erişilen içeriği önbelleğe alın
- Hata Ayıklama: Sorunları çözmek için dönüştürülen belirli HTML'yi inceleyin
Çerezler ve oturumları içeren kapsamlı doğrulama senaryoları için, PDF dönüştürme sırasında oturum doğrulaması yönetimini açıklayan Çerezler rehberine bakın.
Görseller ve Stil Sayfaları Gibi Varlıkları Nasıl Ele Alırım?
Doğrulanmış sayfaları dönüştürürken, harici varlıklar genellikle aynı doğrulamayı gerektirir. İşte HttpClient kullanılarak hazırlanmış kapsamlı bir yaklaşım:
public async Task<string> DownloadAuthenticatedHtmlWithAssets(string url, string authToken)
{
using (var client = new HttpClient())
{
// Set authentication header
client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authToken);
// Download the main HTML
string html = await client.GetStringAsync(url);
// Parse HTML to find assets
var doc = new HtmlDocument();
doc.LoadHtml(html);
// Create a base URI for resolving relative paths
var baseUri = new Uri(url);
// Download CSS files
var cssLinks = doc.DocumentNode.SelectNodes("//link[@rel='stylesheet']");
if (cssLinks != null)
{
foreach (var link in cssLinks)
{
string href = link.GetAttributeValue("href", "");
if (!string.IsNullOrEmpty(href))
{
var cssUri = new Uri(baseUri, href);
string cssContent = await client.GetStringAsync(cssUri);
// Embed CSS directly in the HTML
var styleNode = doc.CreateElement("style");
styleNode.InnerHtml = cssContent;
doc.DocumentNode.SelectSingleNode("//head").AppendChild(styleNode);
// Remove the external link
link.Remove();
}
}
}
// Return the modified HTML with embedded assets
return doc.DocumentNode.OuterHtml;
}
}
public async Task<string> DownloadAuthenticatedHtmlWithAssets(string url, string authToken)
{
using (var client = new HttpClient())
{
// Set authentication header
client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authToken);
// Download the main HTML
string html = await client.GetStringAsync(url);
// Parse HTML to find assets
var doc = new HtmlDocument();
doc.LoadHtml(html);
// Create a base URI for resolving relative paths
var baseUri = new Uri(url);
// Download CSS files
var cssLinks = doc.DocumentNode.SelectNodes("//link[@rel='stylesheet']");
if (cssLinks != null)
{
foreach (var link in cssLinks)
{
string href = link.GetAttributeValue("href", "");
if (!string.IsNullOrEmpty(href))
{
var cssUri = new Uri(baseUri, href);
string cssContent = await client.GetStringAsync(cssUri);
// Embed CSS directly in the HTML
var styleNode = doc.CreateElement("style");
styleNode.InnerHtml = cssContent;
doc.DocumentNode.SelectSingleNode("//head").AppendChild(styleNode);
// Remove the external link
link.Remove();
}
}
}
// Return the modified HTML with embedded assets
return doc.DocumentNode.OuterHtml;
}
}
Imports System
Imports System.Net.Http
Imports System.Threading.Tasks
Imports HtmlAgilityPack
Public Class HtmlDownloader
Public Async Function DownloadAuthenticatedHtmlWithAssets(url As String, authToken As String) As Task(Of String)
Using client As New HttpClient()
' Set authentication header
client.DefaultRequestHeaders.Authorization = New System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authToken)
' Download the main HTML
Dim html As String = Await client.GetStringAsync(url)
' Parse HTML to find assets
Dim doc As New HtmlDocument()
doc.LoadHtml(html)
' Create a base URI for resolving relative paths
Dim baseUri As New Uri(url)
' Download CSS files
Dim cssLinks = doc.DocumentNode.SelectNodes("//link[@rel='stylesheet']")
If cssLinks IsNot Nothing Then
For Each link In cssLinks
Dim href As String = link.GetAttributeValue("href", "")
If Not String.IsNullOrEmpty(href) Then
Dim cssUri As New Uri(baseUri, href)
Dim cssContent As String = Await client.GetStringAsync(cssUri)
' Embed CSS directly in the HTML
Dim styleNode = doc.CreateElement("style")
styleNode.InnerHtml = cssContent
doc.DocumentNode.SelectSingleNode("//head").AppendChild(styleNode)
' Remove the external link
link.Remove()
End If
Next
End If
' Return the modified HTML with embedded assets
Return doc.DocumentNode.OuterHtml
End Using
End Function
End Class
HTML Ayırma İçin Hangi Araçlar Yardımcı Olur?
HtmlAgilityPack, .NET için en popüler HTML ayrıştırma kütüphanesidir, ancak alternatifleri de mevcuttur:
- HtmlAgilityPack: Genel HTML ayrıştırma ve manipülasyon için en iyisi
- AngleSharp: CSS seçici desteği ile modern, standartlara uygun HTML ayrıştırıcı
- CsQuery: jQuery ile tanışık C# geliştiricileri için jQuery benzeri söz dizimi
- Düzenli İfadeler: Basit çıkarım görevleri için (karmaşık HTML için önerilmez)
ChromeHttpLoginCredentials
Ağ Doğrulaması Kullanarak Nasıl Giriş Yaparım?
Çoğu ASP.NET uygulaması, HTML form gönderiminden daha güvenilir olan ağ doğrulamasını destekler. IronPDF, ChromeHttpLoginCredentials sınıfı aracılığıyla temel, özet ve NTLM kimlik doğrulaması için yerleşik destek sağlar. Ek başlık özelleştirmeleri için HTTP İstek Başlığı rehberine bakın.
: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")
Neden Ağ Doğrulaması Form Göndermeden Daha Güvenilirdir?
Ağ doğrulaması, HTML form gönderiminden daha etkili bir takım avantajlar sunar:
- Standartlaştırılmış Protokol: RFC standartlarını izleyen HTTP doğrulama başlıklarını kullanır
- Tarayıcı Entegrasyonu: Chrome tarayıcı motoru doğrulamayı sorunsuz bir şekilde yönetir
- Oturum Yönetimi: Kimlik doğrulama zorluklarını ve oturum sürekliliğini otomatik olarak yönetir
- Güvenlik: Kimlik bilgileri form verileri yerine başlıklar aracılığıyla güvenli bir şekilde iletilir
- Uyumluluk: Çoğu Enterprise kimlik doğrulama sistemiyle çalışır (
Active Directory,LDAP)
Ağ Doğrulaması İçin Hangi Kimlik Bilgilerine İhtiyacım Var?
Farklı doğrulama türleri, farklı kimlik bilgileri gerektirir:
// Basic Authentication (most common)
var basicAuth = new ChromeHttpLoginCredentials
{
NetworkUsername = "user@domain.com",
NetworkPassword = "password123",
AuthenticationType = ChromeHttpLoginCredentials.AuthType.Basic
};
// NTLM/Windows Authentication
var ntlmAuth = new ChromeHttpLoginCredentials
{
NetworkUsername = "DOMAIN\\username", // Include domain
NetworkPassword = "password123",
AuthenticationType = ChromeHttpLoginCredentials.AuthType.Ntlm
};
// Custom authentication headers
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CustomHttpHeaders.Add("X-API-Key", "your-api-key");
renderer.RenderingOptions.CustomHttpHeaders.Add("Authorization", "Bearer " + jwtToken);
// Basic Authentication (most common)
var basicAuth = new ChromeHttpLoginCredentials
{
NetworkUsername = "user@domain.com",
NetworkPassword = "password123",
AuthenticationType = ChromeHttpLoginCredentials.AuthType.Basic
};
// NTLM/Windows Authentication
var ntlmAuth = new ChromeHttpLoginCredentials
{
NetworkUsername = "DOMAIN\\username", // Include domain
NetworkPassword = "password123",
AuthenticationType = ChromeHttpLoginCredentials.AuthType.Ntlm
};
// Custom authentication headers
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CustomHttpHeaders.Add("X-API-Key", "your-api-key");
renderer.RenderingOptions.CustomHttpHeaders.Add("Authorization", "Bearer " + jwtToken);
Imports System.Collections.Generic
' Basic Authentication (most common)
Dim basicAuth As New ChromeHttpLoginCredentials With {
.NetworkUsername = "user@domain.com",
.NetworkPassword = "password123",
.AuthenticationType = ChromeHttpLoginCredentials.AuthType.Basic
}
' NTLM/Windows Authentication
Dim ntlmAuth As New ChromeHttpLoginCredentials With {
.NetworkUsername = "DOMAIN\username", ' Include domain
.NetworkPassword = "password123",
.AuthenticationType = ChromeHttpLoginCredentials.AuthType.Ntlm
}
' Custom authentication headers
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.CustomHttpHeaders.Add("X-API-Key", "your-api-key")
renderer.RenderingOptions.CustomHttpHeaders.Add("Authorization", "Bearer " & jwtToken)
Doğrulama Hatalarını Nasıl Gideririm?
Yaygın doğrulama sorunları ve çözümleri:
- 401 Yetkisiz: Kimlik bilgilerini ve doğrulama türünü kontrol edin
- 403 Yasaklanmış: Kullanıcı doğrulanmış ancak izinleri yok
- Zaman Aşımı Hataları: Yavaş kimlik doğrulama sistemleri için
Timeoutdeğerini artırın - Sertifika Hataları: TLS/SSL ayarlarını uygun şekilde yapılandırın
Sorunları tanımlamak için hata ayıklamayı etkinleştirin:
// Enable detailed logging
IronPdf.Logging.Logger.EnableDebugging = true;
IronPdf.Logging.Logger.LogFilePath = "IronPdf.log";
IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All;
// Test authentication
try
{
var pdf = renderer.RenderUrlAsPdf("https://secure.example.com");
pdf.SaveAs("authenticated.pdf");
}
catch (Exception ex)
{
Console.WriteLine($"Authentication failed: {ex.Message}");
// Check IronPdf.log for detailed error information
}
// Enable detailed logging
IronPdf.Logging.Logger.EnableDebugging = true;
IronPdf.Logging.Logger.LogFilePath = "IronPdf.log";
IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All;
// Test authentication
try
{
var pdf = renderer.RenderUrlAsPdf("https://secure.example.com");
pdf.SaveAs("authenticated.pdf");
}
catch (Exception ex)
{
Console.WriteLine($"Authentication failed: {ex.Message}");
// Check IronPdf.log for detailed error information
}
Imports IronPdf
Imports System
' Enable detailed logging
Logging.Logger.EnableDebugging = True
Logging.Logger.LogFilePath = "IronPdf.log"
Logging.Logger.LoggingMode = Logging.Logger.LoggingModes.All
' Test authentication
Try
Dim pdf = renderer.RenderUrlAsPdf("https://secure.example.com")
pdf.SaveAs("authenticated.pdf")
Catch ex As Exception
Console.WriteLine($"Authentication failed: {ex.Message}")
' Check IronPdf.log for detailed error information
End Try
HTML Formu Kullanarak Nasıl Giriş Yaparım?
Bir HTML formuna veri göndererek giriş yapmak için ChromeHttpLoginCredentials sınıfını kullanın. IronPDF'nin ChromeHttpLoginCredentials API'sine bakın.
Bu noktaları dikkate alın:
- Giriş verilerini HTML formunun ACTION özniteliğinde belirtilen URL'ye gönderin. Bunu
HttpLoginCredentials'ninLoginFormUrlözniteliği olarak ayarlayın. Bu, PDF olarak işlemek istediğiniz URL'den farklı olabilir. - HTML formundaki her giriş ve metin alanını temsil eden verileri gönderin. Ad öznitelikleri, her değişken adını tanımlar (kimliği değil).
- Bazı web siteleri, makineli girişlere aktif olarak karşı koruma sağlar.
// Configure form-based login
var formLogin = new ChromeHttpLoginCredentials
{
LoginFormUrl = "https://example.com/login",
LoginFormData = new Dictionary<string, string>
{
{"username", "user@example.com"},
{"password", "securePassword123"},
{"rememberMe", "true"},
{"csrf_token", "abc123"} // Include any hidden fields
}
};
var renderer = new ChromePdfRenderer
{
LoginCredentials = formLogin,
RenderingOptions = new ChromePdfRenderOptions
{
RenderDelay = 3000, // Allow time for login redirect
EnableJavaScript = true
}
};
// The actual page you want to convert (after login)
var pdf = renderer.RenderUrlAsPdf("https://example.com/dashboard");
pdf.SaveAs("dashboard.pdf");
// Configure form-based login
var formLogin = new ChromeHttpLoginCredentials
{
LoginFormUrl = "https://example.com/login",
LoginFormData = new Dictionary<string, string>
{
{"username", "user@example.com"},
{"password", "securePassword123"},
{"rememberMe", "true"},
{"csrf_token", "abc123"} // Include any hidden fields
}
};
var renderer = new ChromePdfRenderer
{
LoginCredentials = formLogin,
RenderingOptions = new ChromePdfRenderOptions
{
RenderDelay = 3000, // Allow time for login redirect
EnableJavaScript = true
}
};
// The actual page you want to convert (after login)
var pdf = renderer.RenderUrlAsPdf("https://example.com/dashboard");
pdf.SaveAs("dashboard.pdf");
Imports System.Collections.Generic
' Configure form-based login
Dim formLogin As New ChromeHttpLoginCredentials With {
.LoginFormUrl = "https://example.com/login",
.LoginFormData = New Dictionary(Of String, String) From {
{"username", "user@example.com"},
{"password", "securePassword123"},
{"rememberMe", "true"},
{"csrf_token", "abc123"} ' Include any hidden fields
}
}
Dim renderer As New ChromePdfRenderer With {
.LoginCredentials = formLogin,
.RenderingOptions = New ChromePdfRenderOptions With {
.RenderDelay = 3000, ' Allow time for login redirect
.EnableJavaScript = True
}
}
' The actual page you want to convert (after login)
Dim pdf = renderer.RenderUrlAsPdf("https://example.com/dashboard")
pdf.SaveAs("dashboard.pdf")
Hangi Form Verilerini Yakalamam Gerekir?
HTML formları üzerinden başarıyla doğrulamak için tüm form girişlerini yakalayın:
// Use this helper method to extract form fields
public Dictionary<string, string> ExtractFormFields(string loginPageHtml)
{
var formData = new Dictionary<string, string>();
var doc = new HtmlDocument();
doc.LoadHtml(loginPageHtml);
// Find all input fields
var inputs = doc.DocumentNode.SelectNodes("//input");
if (inputs != null)
{
foreach (var input in inputs)
{
string name = input.GetAttributeValue("name", "");
string value = input.GetAttributeValue("value", "");
string type = input.GetAttributeValue("type", "text");
if (!string.IsNullOrEmpty(name))
{
// Handle different input types
switch (type.ToLower())
{
case "checkbox":
if (input.Attributes["checked"] != null)
formData[name] = "on";
break;
case "radio":
if (input.Attributes["checked"] != null)
formData[name] = value;
break;
default:
formData[name] = value;
break;
}
}
}
}
// Don't forget select elements
var selects = doc.DocumentNode.SelectNodes("//select");
if (selects != null)
{
foreach (var select in selects)
{
string name = select.GetAttributeValue("name", "");
var selected = select.SelectSingleNode(".//option[@selected]");
if (selected != null && !string.IsNullOrEmpty(name))
{
formData[name] = selected.GetAttributeValue("value", "");
}
}
}
return formData;
}
// Use this helper method to extract form fields
public Dictionary<string, string> ExtractFormFields(string loginPageHtml)
{
var formData = new Dictionary<string, string>();
var doc = new HtmlDocument();
doc.LoadHtml(loginPageHtml);
// Find all input fields
var inputs = doc.DocumentNode.SelectNodes("//input");
if (inputs != null)
{
foreach (var input in inputs)
{
string name = input.GetAttributeValue("name", "");
string value = input.GetAttributeValue("value", "");
string type = input.GetAttributeValue("type", "text");
if (!string.IsNullOrEmpty(name))
{
// Handle different input types
switch (type.ToLower())
{
case "checkbox":
if (input.Attributes["checked"] != null)
formData[name] = "on";
break;
case "radio":
if (input.Attributes["checked"] != null)
formData[name] = value;
break;
default:
formData[name] = value;
break;
}
}
}
}
// Don't forget select elements
var selects = doc.DocumentNode.SelectNodes("//select");
if (selects != null)
{
foreach (var select in selects)
{
string name = select.GetAttributeValue("name", "");
var selected = select.SelectSingleNode(".//option[@selected]");
if (selected != null && !string.IsNullOrEmpty(name))
{
formData[name] = selected.GetAttributeValue("value", "");
}
}
}
return formData;
}
Imports HtmlAgilityPack
Public Function ExtractFormFields(loginPageHtml As String) As Dictionary(Of String, String)
Dim formData As New Dictionary(Of String, String)()
Dim doc As New HtmlDocument()
doc.LoadHtml(loginPageHtml)
' Find all input fields
Dim inputs = doc.DocumentNode.SelectNodes("//input")
If inputs IsNot Nothing Then
For Each input In inputs
Dim name As String = input.GetAttributeValue("name", "")
Dim value As String = input.GetAttributeValue("value", "")
Dim type As String = input.GetAttributeValue("type", "text")
If Not String.IsNullOrEmpty(name) Then
' Handle different input types
Select Case type.ToLower()
Case "checkbox"
If input.Attributes("checked") IsNot Nothing Then
formData(name) = "on"
End If
Case "radio"
If input.Attributes("checked") IsNot Nothing Then
formData(name) = value
End If
Case Else
formData(name) = value
End Select
End If
Next
End If
' Don't forget select elements
Dim selects = doc.DocumentNode.SelectNodes("//select")
If selects IsNot Nothing Then
For Each selectNode In selects
Dim name As String = selectNode.GetAttributeValue("name", "")
Dim selected = selectNode.SelectSingleNode(".//option[@selected]")
If selected IsNot Nothing AndAlso Not String.IsNullOrEmpty(name) Then
formData(name) = selected.GetAttributeValue("value", "")
End If
Next
End If
Return formData
End Function
Doğru Form İşlem URL'sini Nasıl Bulurum?
Form işlem URL'si, başarılı doğrulama için kritik önem taşır:
public string ExtractFormAction(string loginPageUrl, string loginPageHtml)
{
var doc = new HtmlDocument();
doc.LoadHtml(loginPageHtml);
// Find the login form
var form = doc.DocumentNode.SelectSingleNode("//form[contains(@action, 'login') or contains(@id, 'login') or contains(@class, 'login')]");
if (form == null)
{
// Try finding any form with password field
form = doc.DocumentNode.SelectSingleNode("//form[.//input[@type='password']]");
}
if (form != null)
{
string action = form.GetAttributeValue("action", "");
// Resolve relative URLs
if (!string.IsNullOrEmpty(action))
{
var baseUri = new Uri(loginPageUrl);
var actionUri = new Uri(baseUri, action);
return actionUri.ToString();
}
}
// Default to the login page URL if no action found
return loginPageUrl;
}
public string ExtractFormAction(string loginPageUrl, string loginPageHtml)
{
var doc = new HtmlDocument();
doc.LoadHtml(loginPageHtml);
// Find the login form
var form = doc.DocumentNode.SelectSingleNode("//form[contains(@action, 'login') or contains(@id, 'login') or contains(@class, 'login')]");
if (form == null)
{
// Try finding any form with password field
form = doc.DocumentNode.SelectSingleNode("//form[.//input[@type='password']]");
}
if (form != null)
{
string action = form.GetAttributeValue("action", "");
// Resolve relative URLs
if (!string.IsNullOrEmpty(action))
{
var baseUri = new Uri(loginPageUrl);
var actionUri = new Uri(baseUri, action);
return actionUri.ToString();
}
}
// Default to the login page URL if no action found
return loginPageUrl;
}
Imports System
Public Function ExtractFormAction(loginPageUrl As String, loginPageHtml As String) As String
Dim doc As New HtmlDocument()
doc.LoadHtml(loginPageHtml)
' Find the login form
Dim form = doc.DocumentNode.SelectSingleNode("//form[contains(@action, 'login') or contains(@id, 'login') or contains(@class, 'login')]")
If form Is Nothing Then
' Try finding any form with password field
form = doc.DocumentNode.SelectSingleNode("//form[.//input[@type='password']]")
End If
If form IsNot Nothing Then
Dim action As String = form.GetAttributeValue("action", "")
' Resolve relative URLs
If Not String.IsNullOrEmpty(action) Then
Dim baseUri As New Uri(loginPageUrl)
Dim actionUri As New Uri(baseUri, action)
Return actionUri.ToString()
End If
End If
' Default to the login page URL if no action found
Return loginPageUrl
End Function
Form Tabanlı Doğrulamada Yaygın Sorunlar Nelerdir?
- CSRF Belirteçleri: Birçok form süre dolan sahtecilik önleme belirteçleri içerir
- JavaScript Doğrulaması: Bazı formlar JavaScript yürütmesi gerektirir
- Çok Adımlı Doğrulama: Birden çok sayfa gerektiren formlar
- CAPTCHA Koruması: İnsan doğrulama zorlukları
- Oturum Zaman Aşımı: Hızla sona eren giriş oturumları
ViewBag
TempData
Html
Kapsamlı HTML'den PDF'ye dönüştürme rehberi, karmaşık doğrulama senaryoları da dahil olmak üzere, HTML'den PDF'ye eğitim rehberine göz atın.
MVC Doğrulamasını Nasıl Ele Alırım?
Aşağıdaki ara çözüm, bir .NET MVC görünümünü programlı olarak bir dizeye işleyerek, MVC girişlerini atlarken görünümleri doğru bir şekilde işler. Bu yaklaşım, MVC Core'de CSHTML'yi PDF'ye veya MVC Framework 'de dönüştürürken iyi çalışır.
// Converts an MVC partial view to a string
public static string RenderPartialViewToString(this Controller controller, string viewPath, object model = null)
{
try
{
// Set the model
var context = controller.ControllerContext;
controller.ViewData.Model = model;
using (var sw = new StringWriter())
{
// Find the partial view
var viewResult = ViewEngines.Engines.FindPartialView(context, viewPath);
if (viewResult.View == null)
{
throw new Exception($"Partial view {viewPath} could not be found.");
}
// Create a view context
var viewContext = new ViewContext(context, viewResult.View, context.Controller.ViewData, context.Controller.TempData, sw);
// Render the view
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(context, viewResult.View);
return sw.GetStringBuilder().ToString();
}
}
catch (Exception ex)
{
// Return error message if there is an exception
return ex.Message;
}
}
// Usage in an MVC Controller
public ActionResult GeneratePdf()
{
// Render authenticated view to string
var model = new InvoiceViewModel { /* populate model */ };
string html = this.RenderPartialViewToString("~/Views/Invoice/Details.cshtml", model);
// Convert to PDF
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// Return PDF file
return File(pdf.BinaryData, "application/pdf", "invoice.pdf");
}
// Converts an MVC partial view to a string
public static string RenderPartialViewToString(this Controller controller, string viewPath, object model = null)
{
try
{
// Set the model
var context = controller.ControllerContext;
controller.ViewData.Model = model;
using (var sw = new StringWriter())
{
// Find the partial view
var viewResult = ViewEngines.Engines.FindPartialView(context, viewPath);
if (viewResult.View == null)
{
throw new Exception($"Partial view {viewPath} could not be found.");
}
// Create a view context
var viewContext = new ViewContext(context, viewResult.View, context.Controller.ViewData, context.Controller.TempData, sw);
// Render the view
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(context, viewResult.View);
return sw.GetStringBuilder().ToString();
}
}
catch (Exception ex)
{
// Return error message if there is an exception
return ex.Message;
}
}
// Usage in an MVC Controller
public ActionResult GeneratePdf()
{
// Render authenticated view to string
var model = new InvoiceViewModel { /* populate model */ };
string html = this.RenderPartialViewToString("~/Views/Invoice/Details.cshtml", model);
// Convert to PDF
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// Return PDF file
return File(pdf.BinaryData, "application/pdf", "invoice.pdf");
}
Imports System
Imports System.IO
Imports System.Web.Mvc
Imports IronPdf
' Converts an MVC partial view to a string
Public Module ControllerExtensions
<System.Runtime.CompilerServices.Extension>
Public Function RenderPartialViewToString(controller As Controller, viewPath As String, Optional model As Object = Nothing) As String
Try
' Set the model
Dim context = controller.ControllerContext
controller.ViewData.Model = model
Using sw As New StringWriter()
' Find the partial view
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
' Create a view context
Dim viewContext As New ViewContext(context, viewResult.View, context.Controller.ViewData, context.Controller.TempData, sw)
' Render the view
viewResult.View.Render(viewContext, sw)
viewResult.ViewEngine.ReleaseView(context, viewResult.View)
Return sw.GetStringBuilder().ToString()
End Using
Catch ex As Exception
' Return error message if there is an exception
Return ex.Message
End Try
End Function
End Module
' Usage in an MVC Controller
Public Class InvoiceController
Inherits Controller
Public Function GeneratePdf() As ActionResult
' Render authenticated view to string
Dim model As New InvoiceViewModel() ' populate model
Dim html As String = Me.RenderPartialViewToString("~/Views/Invoice/Details.cshtml", model)
' Convert to PDF
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
' Return PDF file
Return File(pdf.BinaryData, "application/pdf", "invoice.pdf")
End Function
End Class
Neden Görünümleri Doğrudan Dönüştürme Yerine Dize Olarak İşliyoruz?
MVC görünümlerini dizelere işlemek, birkaç ana avantaj sağlar:
- Kimlik Doğrulama Bağlamı: Görünümler, kimliği doğrulanmış kullanıcının bağlamı içinde işler
- Tam MVC Boru Hattı:
HtmlHelper,UrlHelperveViewBagyardımcıları dahil olmak üzere tüm MVC özellikleri çalışır - Düzen Desteği: Ana sayfalar ve düzenler doğru şekilde render edilir
- Model Bağlama: Karmaşık görünüm modelleri sorunsuz çalışır
- Eylem Filtreleri: Güvenlik ve günlüğe kaydetme filtreleri normal şekilde işler
Bu MVC Çözümünün Faydaları Nelerdir?
MVC dize işleme yaklaşımı sunar:
- Güvenlik: İç URL'leri açığa çıkarmaya veya doğrulamayı atlamaya gerek yok
- Performans: Ek HTTP isteklerinden kaçının
- Tutarlılık: Tarayıcılarda kullanıcıların gördüğüyle aynı çıktıyı elde edin
- Esneklik: PDF dönüşümünden önce HTML'yi değiştirin
- Test: HTML üretimini kolayca birim test edin
Modelleri İşlenen Görünüme Nasıl Geçiririm?
Karmaşık bir modelle birlikte kapsamlı bir örnek:
public class InvoiceController : Controller
{
private readonly IInvoiceService _invoiceService;
public async Task<ActionResult> DownloadInvoicePdf(int invoiceId)
{
// Load data within authenticated context
var invoice = await _invoiceService.GetInvoiceAsync(invoiceId);
if (invoice == null || invoice.UserId != User.Identity.GetUserId())
{
return HttpNotFound();
}
// Create view model
var viewModel = new InvoiceDetailsViewModel
{
Invoice = invoice,
Company = await _invoiceService.GetCompanyDetailsAsync(),
LineItems = await _invoiceService.GetLineItemsAsync(invoiceId),
TaxDetails = await _invoiceService.GetTaxDetailsAsync(invoiceId)
};
// Render to HTML string
string html = this.RenderPartialViewToString("~/Views/Invoice/DetailsPdf.cshtml", viewModel);
// Add custom styling for PDF
html = $@"
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; }}
.invoice-header {{ background-color: #f0f0f0; padding: 20px; }}
.line-items {{ width: 100%; border-collapse: collapse; }}
.line-items th, .line-items td {{ border: 1px solid #ddd; padding: 8px; }}
</style>
</head>
<body>
{html}
</body>
</html>";
// Convert to PDF with options
var renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
MarginTop = 20,
MarginBottom = 20,
MarginLeft = 10,
MarginRight = 10,
PrintHtmlBackgrounds = true
}
};
var pdf = renderer.RenderHtmlAsPdf(html);
// Add metadata
pdf.MetaData.Author = "Invoice System";
pdf.MetaData.Title = $"Invoice #{invoice.Number}";
pdf.MetaData.CreationDate = DateTime.Now;
return File(pdf.BinaryData, "application/pdf", $"Invoice-{invoice.Number}.pdf");
}
}
public class InvoiceController : Controller
{
private readonly IInvoiceService _invoiceService;
public async Task<ActionResult> DownloadInvoicePdf(int invoiceId)
{
// Load data within authenticated context
var invoice = await _invoiceService.GetInvoiceAsync(invoiceId);
if (invoice == null || invoice.UserId != User.Identity.GetUserId())
{
return HttpNotFound();
}
// Create view model
var viewModel = new InvoiceDetailsViewModel
{
Invoice = invoice,
Company = await _invoiceService.GetCompanyDetailsAsync(),
LineItems = await _invoiceService.GetLineItemsAsync(invoiceId),
TaxDetails = await _invoiceService.GetTaxDetailsAsync(invoiceId)
};
// Render to HTML string
string html = this.RenderPartialViewToString("~/Views/Invoice/DetailsPdf.cshtml", viewModel);
// Add custom styling for PDF
html = $@"
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; }}
.invoice-header {{ background-color: #f0f0f0; padding: 20px; }}
.line-items {{ width: 100%; border-collapse: collapse; }}
.line-items th, .line-items td {{ border: 1px solid #ddd; padding: 8px; }}
</style>
</head>
<body>
{html}
</body>
</html>";
// Convert to PDF with options
var renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
MarginTop = 20,
MarginBottom = 20,
MarginLeft = 10,
MarginRight = 10,
PrintHtmlBackgrounds = true
}
};
var pdf = renderer.RenderHtmlAsPdf(html);
// Add metadata
pdf.MetaData.Author = "Invoice System";
pdf.MetaData.Title = $"Invoice #{invoice.Number}";
pdf.MetaData.CreationDate = DateTime.Now;
return File(pdf.BinaryData, "application/pdf", $"Invoice-{invoice.Number}.pdf");
}
}
Imports System.Threading.Tasks
Imports System.Web.Mvc
Public Class InvoiceController
Inherits Controller
Private ReadOnly _invoiceService As IInvoiceService
Public Async Function DownloadInvoicePdf(invoiceId As Integer) As Task(Of ActionResult)
' Load data within authenticated context
Dim invoice = Await _invoiceService.GetInvoiceAsync(invoiceId)
If invoice Is Nothing OrElse invoice.UserId <> User.Identity.GetUserId() Then
Return HttpNotFound()
End If
' Create view model
Dim viewModel As New InvoiceDetailsViewModel With {
.Invoice = invoice,
.Company = Await _invoiceService.GetCompanyDetailsAsync(),
.LineItems = Await _invoiceService.GetLineItemsAsync(invoiceId),
.TaxDetails = Await _invoiceService.GetTaxDetailsAsync(invoiceId)
}
' Render to HTML string
Dim html As String = Me.RenderPartialViewToString("~/Views/Invoice/DetailsPdf.cshtml", viewModel)
' Add custom styling for PDF
html = $"
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; }}
.invoice-header {{ background-color: #f0f0f0; padding: 20px; }}
.line-items {{ width: 100%; border-collapse: collapse; }}
.line-items th, .line-items td {{ border: 1px solid #ddd; padding: 8px; }}
</style>
</head>
<body>
{html}
</body>
</html>"
' Convert to PDF with options
Dim renderer As New ChromePdfRenderer With {
.RenderingOptions = New ChromePdfRenderOptions With {
.MarginTop = 20,
.MarginBottom = 20,
.MarginLeft = 10,
.MarginRight = 10,
.PrintHtmlBackgrounds = True
}
}
Dim pdf = renderer.RenderHtmlAsPdf(html)
' Add metadata
pdf.MetaData.Author = "Invoice System"
pdf.MetaData.Title = $"Invoice #{invoice.Number}"
pdf.MetaData.CreationDate = DateTime.Now
Return File(pdf.BinaryData, "application/pdf", $"Invoice-{invoice.Number}.pdf")
End Function
End Class
Herhangi bir doğrulama çözümünü uygulamadan önce, IronPDF'yi uygun bir şekilde yükleyip lisans anahtarlarınızı yapılandırdığınızdan emin olun.
Başka neler yapabileceğinizi görmek için hazır mısınız? Eğitim sayfamıza göz atın: PDF'leri Dönüştür.
RenderDelay
Sıkça Sorulan Sorular
Giriş formunun arkasında HTML'yi PDF'ye nasıl dönüştürebilirim?
IronPDF, giriş kimlik doğrulaması arkasında HTML'yi PDF'ye dönüştürmek için birçok yaklaşım sunar. TLS ağ kimlik doğrulaması için ChromeHttpLoginCredentials API'sini kullanabilir veya System.Net.WebClient veya HttpClient ile uygun kimlik doğrulama başlıklarını kullanarak HTML içeriğini indirip ardından IronPDF ile PDF'ye dönüştürebilirsiniz.
ChromeHttpLoginCredentials nedir ve nasıl kullanılır?
ChromeHttpLoginCredentials, IronPDF'nin ağ kimlik doğrulamasını yönetmek için API'sidir. Kullanıcı adınızı ve şifrenizi ChromePdfRenderer üzerinde LoginCredentials özelliğine ayarlayarak, IronPDF'nin şifre korumalı URL'leri PDF olarak rendere ederken otomatik olarak kimlik doğrulaması yapmasına olanak tanır.
PDF dönüştürme için HTML form tabanlı girişleri yönetebilir miyim?
Evet, IronPDF HTML form tabanlı girişleri destekler. Önerilen yaklaşım, giriş işlemini yönetmek, kimliği doğrulanmış HTML içeriğini indirmek ve ardından indirilen HTML'yi PDF'ye dönüştürmek için IronPDF'nin RenderHtmlAsPdf yöntemini kullanmak için System.Net.WebClient veya HttpClient kullanmaktır.
Kimlik doğrulanmış sayfalardan resimler ve stil sayfaları gibi HTML varlıklarını nasıl indiririm?
HtmlAgilityPack'i indirilmiş HTML'yi ayrıştırmak ve resimler ve stil sayfaları gibi varlık URL'lerini çıkarmak için kullanabilirsiniz. Ardından, aynı kimlik doğrulama başlıklarıyla her varlığı System.Net.WebClient kullanarak indirip, IronPDF ile komple HTML paketini PDF'ye dönüştürün.
Kimlik doğrulama jetonları veya başlıkları için en iyi uygulama nedir?
IronPDF'yi kimlik doğrulama jetonları ile kullanırken, kimlik doğrulama başlıklarınızla (örneğin Bearer jetonları) HTTP istemcisi veya WebClient kullanarak HTML'yi indirin. Kimliği doğrulanmış HTML içeriğini bellekte veya diskte sakladıktan sonra, bunu PDF'ye dönüştürmek için IronPDF'nin ChromePdfRenderer'ını kullanın.
MVC giriş kimlik doğrulaması için bir çözüm var mı?
Evet, IronPDF MVC giriş kimlik doğrulama senaryoları için çözümler sunar. Önerilen yaklaşım, önce standart .NET HTTP istemcilerini kullanarak kimlik doğrulaması yapıp HTML içeriğini indirmek, ardından IronPDF'nin render motoruna kimliği doğrulanmış HTML'yi doğrudan iletmek, IronPDF'nin kimlik doğrulaması yapmasına gerek kalmadan.

