Como usar a validação fluente com o IronPDF em C#
O que é Fluent Validation?
FluentValidation é uma biblioteca de validação .NET que auxilia na criação de regras de validação fortemente tipadas. Utiliza uma interface fluente e expressões lambda, tornando o código mais legível e fácil de manter. Em vez de usar anotações de dados ou validação manual em suas classes de modelo, você pode usar o Fluent Validation para criar uma classe separada para sua lógica de validação.
A Validação Fluente traz mais flexibilidade ao processo de validação. Com validadores integrados para cenários comuns, a capacidade de criar validações personalizadas e uma maneira simples de encadear regras de validação, o Fluent Validation é uma ferramenta poderosa no conjunto de ferramentas do .NET Core .
Entendendo a Validação Fluente
Fluent Validation é uma biblioteca de código aberto for .NET que facilita a criação de regras de validação para suas classes de modelo.
- Validadores: Os validadores são classes que encapsulam a lógica de validação. Eles são normalmente criados por herança da classe base
AbstractValidator<t>. - Regras: Uma regra é uma condição de validação que uma propriedade deve atender. As regras são definidas usando o método
RuleForem uma classe validadora. - Falhas de Validação: Se uma regra falhar, o Fluent Validation cria um objeto
ValidationFailureque contém detalhes sobre o erro, incluindo o nome da propriedade e a mensagem de erro.
O que é o IronPDF?
IronPDF - Converter HTML para PDF em C# é uma poderosa biblioteca .NET que permite gerar documentos PDF a partir de conteúdo HTML. Seja para criar faturas, relatórios ou qualquer outro tipo de documento, o IronPDF oferece uma solução fácil de usar. Ele se integra perfeitamente aos seus aplicativos ASP.NET Core , permitindo que você gere arquivos PDF de alta qualidade com apenas algumas linhas de código.
Utilizando a validação Fluent com o IronPDF
Agora que entendemos o que são Fluent Validation e IronPDF , vamos ver como eles podem ser usados em conjunto. Este tutorial ajudará você a criar um gerador de faturas, onde o conteúdo da fatura será validado usando o FluentValidation no ASP.NET Core antes de gerar o PDF usando o IronPDF.
Configurando o projeto
Para começar, vamos criar um novo aplicativo de console no Visual Studio ou no seu ambiente de desenvolvimento preferido.
- Abra o Visual Studio e vá para Arquivo > Novo > Projeto .
-
Selecione "Aplicativo de console (ASP.NET Core)" como modelo de projeto e forneça um nome para o seu projeto.
Criar um novo aplicativo de console -
Clique no botão Próximo e configure seu projeto, dando-lhe um nome e selecionando o local do repositório.
Configure o novo aplicativo -
Clique no botão Avançar e selecione o .NET Framework. Recomenda-se a versão mais recente do .NET Framework (7).
Seleção do .NET Framework - Clique no botão Criar para criar o projeto.
Instale os pacotes necessários
Após a criação do projeto, adicione os pacotes NuGet necessários para o Fluent Validation e o IronPDF.
- Clique com o botão direito do mouse no projeto no Solution Explorer e selecione "Gerenciar Pacotes NuGet ".
-
Procure por "FluentValidation" e clique em "Instalar" para adicionar o pacote ao seu projeto.
Instale o pacote FluentValidation na interface do Gerenciador de Pacotes NuGet. - Da mesma forma, pesquise por " IronPDF - Powerful .NET PDF Library " e instale o pacote IronPDF .
Alternativamente, você pode instalar o IronPDF usando o Console do Gerenciador de Pacotes NuGet com o seguinte comando:
Install-Package IronPdf
Instale o pacote IronPDF no Console do Gerenciador de Pacotes.
Com o projeto configurado e os pacotes necessários instalados, vamos definir a classe de conteúdo do PDF.
Definindo o conteúdo do PDF
Neste exemplo, um PDF de fatura simples será criado a partir dos códigos HTML em duas classes: InvoiceContent e InvoiceItem.
using System.Collections.Generic;
using System.Linq;
public abstract class PdfContent
{
// Abstract method to generate the HTML string
public abstract string RenderHtml();
}
public class InvoiceContent : PdfContent
{
public string CustomerName { get; set; }
public string Address { get; set; }
public List<InvoiceItem> InvoiceItems { get; set; }
// Constructs the HTML representation of the invoice
public override string RenderHtml()
{
string invoiceItemsHtml = string.Join("", InvoiceItems.Select(item => $"<li>{item.Description}: {item.Price}</li>"));
return $"<h1>Invoice for {CustomerName}</h1><p>{Address}</p><ul>{invoiceItemsHtml}</ul>";
}
}
public class InvoiceItem
{
public string Description { get; set; }
public decimal Price { get; set; }
}
using System.Collections.Generic;
using System.Linq;
public abstract class PdfContent
{
// Abstract method to generate the HTML string
public abstract string RenderHtml();
}
public class InvoiceContent : PdfContent
{
public string CustomerName { get; set; }
public string Address { get; set; }
public List<InvoiceItem> InvoiceItems { get; set; }
// Constructs the HTML representation of the invoice
public override string RenderHtml()
{
string invoiceItemsHtml = string.Join("", InvoiceItems.Select(item => $"<li>{item.Description}: {item.Price}</li>"));
return $"<h1>Invoice for {CustomerName}</h1><p>{Address}</p><ul>{invoiceItemsHtml}</ul>";
}
}
public class InvoiceItem
{
public string Description { get; set; }
public decimal Price { get; set; }
}
Imports System.Collections.Generic
Imports System.Linq
Public MustInherit Class PdfContent
' Abstract method to generate the HTML string
Public MustOverride Function RenderHtml() As String
End Class
Public Class InvoiceContent
Inherits PdfContent
Public Property CustomerName() As String
Public Property Address() As String
Public Property InvoiceItems() As List(Of InvoiceItem)
' Constructs the HTML representation of the invoice
Public Overrides Function RenderHtml() As String
Dim invoiceItemsHtml As String = String.Join("", InvoiceItems.Select(Function(item) $"<li>{item.Description}: {item.Price}</li>"))
Return $"<h1>Invoice for {CustomerName}</h1><p>{Address}</p><ul>{invoiceItemsHtml}</ul>"
End Function
End Class
Public Class InvoiceItem
Public Property Description() As String
Public Property Price() As Decimal
End Class
No código acima, uma classe abstrata PdfContent é definida com um método abstrato chamado RenderHtml. A classe InvoiceContent estende PdfContent e representa o conteúdo do PDF da fatura. Possui campos para o nome do cliente, endereço e uma lista de itens da fatura. A classe InvoiceItem contém duas propriedades: 'Descrição' e 'Preço'. O método RenderHtml gera a marcação HTML para a fatura com base no conteúdo.
Agora que o conteúdo do PDF está definido, vamos criar regras de validação usando o Fluent Validation.
Criando regras de validação
Para criar regras de validação para a classe InvoiceContent, crie uma classe validadora chamada InvoiceContentValidator. Esta classe herdará de AbstractValidator<InvoiceContent>, que é fornecida pelo FluentValidation.
using FluentValidation;
public class InvoiceContentValidator : AbstractValidator<InvoiceContent>
{
public InvoiceContentValidator()
{
RuleFor(content => content.CustomerName).NotEmpty().WithMessage("Customer name is required.");
RuleFor(content => content.Address).NotEmpty().WithMessage("Address is required.");
RuleFor(content => content.InvoiceItems).NotEmpty().WithMessage("At least one invoice item is required.");
RuleForEach(content => content.InvoiceItems).SetValidator(new InvoiceItemValidator());
}
}
public class InvoiceItemValidator : AbstractValidator<InvoiceItem>
{
public InvoiceItemValidator()
{
RuleFor(item => item.Description).NotEmpty().WithMessage("Description is required.");
RuleFor(item => item.Price).GreaterThanOrEqualTo(0).WithMessage("Price must be greater than or equal to 0.");
}
}
using FluentValidation;
public class InvoiceContentValidator : AbstractValidator<InvoiceContent>
{
public InvoiceContentValidator()
{
RuleFor(content => content.CustomerName).NotEmpty().WithMessage("Customer name is required.");
RuleFor(content => content.Address).NotEmpty().WithMessage("Address is required.");
RuleFor(content => content.InvoiceItems).NotEmpty().WithMessage("At least one invoice item is required.");
RuleForEach(content => content.InvoiceItems).SetValidator(new InvoiceItemValidator());
}
}
public class InvoiceItemValidator : AbstractValidator<InvoiceItem>
{
public InvoiceItemValidator()
{
RuleFor(item => item.Description).NotEmpty().WithMessage("Description is required.");
RuleFor(item => item.Price).GreaterThanOrEqualTo(0).WithMessage("Price must be greater than or equal to 0.");
}
}
Imports FluentValidation
Public Class InvoiceContentValidator
Inherits AbstractValidator(Of InvoiceContent)
Public Sub New()
RuleFor(Function(content) content.CustomerName).NotEmpty().WithMessage("Customer name is required.")
RuleFor(Function(content) content.Address).NotEmpty().WithMessage("Address is required.")
RuleFor(Function(content) content.InvoiceItems).NotEmpty().WithMessage("At least one invoice item is required.")
RuleForEach(Function(content) content.InvoiceItems).SetValidator(New InvoiceItemValidator())
End Sub
End Class
Public Class InvoiceItemValidator
Inherits AbstractValidator(Of InvoiceItem)
Public Sub New()
RuleFor(Function(item) item.Description).NotEmpty().WithMessage("Description is required.")
RuleFor(Function(item) item.Price).GreaterThanOrEqualTo(0).WithMessage("Price must be greater than or equal to 0.")
End Sub
End Class
No código-fonte, a classe InvoiceContentValidator está definida, a qual herda de AbstractValidator<InvoiceContent>. Dentro do construtor da classe validadora, o método RuleFor define as regras de validação para cada propriedade da classe InvoiceContent.
Por exemplo, RuleFor(content => content.CustomerName) especifica que o nome do cliente não deve estar vazio. Da mesma forma, são definidas regras de validação para as propriedades de endereço e itens da fatura.
O método RuleForEach itera sobre cada item na lista InvoiceItems e aplica o InvoiceItemValidator. A classe InvoiceItemValidator contém regras de validação para a classe InvoiceItem.
Com essas regras de validação definidas, vamos prosseguir para a geração do PDF usando o IronPDF.
Gerando PDF usando o IronPDF
IronPDF - Gerar e Editar Documentos PDF é uma biblioteca .NET popular para criar e manipular documentos PDF. O IronPDF será utilizado para gerar o PDF com base no conteúdo da fatura validada.
using IronPdf;
using FluentValidation;
public class PdfService
{
// Generates a PDF document for the provided content
public PdfDocument GeneratePdf<t>(T content) where T : PdfContent
{
// Validate the content using the appropriate validator
var validator = GetValidatorForContent(content);
var validationResult = validator.Validate(content);
// Check if validation is successful
if (!validationResult.IsValid)
{
throw new FluentValidation.ValidationException(validationResult.Errors);
}
// Generate the PDF using IronPDF
var renderer = new ChromePdfRenderer();
return renderer.RenderHtmlAsPdf(content.RenderHtml());
}
// Retrieves the appropriate validator for the content
private IValidator<t> GetValidatorForContent<t>(T content) where T : PdfContent
{
if (content is InvoiceContent)
{
return (IValidator<t>)new InvoiceContentValidator();
}
else
{
throw new NotSupportedException("Unsupported content type.");
}
}
}
using IronPdf;
using FluentValidation;
public class PdfService
{
// Generates a PDF document for the provided content
public PdfDocument GeneratePdf<t>(T content) where T : PdfContent
{
// Validate the content using the appropriate validator
var validator = GetValidatorForContent(content);
var validationResult = validator.Validate(content);
// Check if validation is successful
if (!validationResult.IsValid)
{
throw new FluentValidation.ValidationException(validationResult.Errors);
}
// Generate the PDF using IronPDF
var renderer = new ChromePdfRenderer();
return renderer.RenderHtmlAsPdf(content.RenderHtml());
}
// Retrieves the appropriate validator for the content
private IValidator<t> GetValidatorForContent<t>(T content) where T : PdfContent
{
if (content is InvoiceContent)
{
return (IValidator<t>)new InvoiceContentValidator();
}
else
{
throw new NotSupportedException("Unsupported content type.");
}
}
}
Imports IronPdf
Imports FluentValidation
Public Class PdfService
' Generates a PDF document for the provided content
Public Function GeneratePdf(Of T As PdfContent)(content As T) As PdfDocument
' Validate the content using the appropriate validator
Dim validator = GetValidatorForContent(content)
Dim validationResult = validator.Validate(content)
' Check if validation is successful
If Not validationResult.IsValid Then
Throw New FluentValidation.ValidationException(validationResult.Errors)
End If
' Generate the PDF using IronPDF
Dim renderer = New ChromePdfRenderer()
Return renderer.RenderHtmlAsPdf(content.RenderHtml())
End Function
' Retrieves the appropriate validator for the content
Private Function GetValidatorForContent(Of T As PdfContent)(content As T) As IValidator(Of T)
If TypeOf content Is InvoiceContent Then
Return CType(New InvoiceContentValidator(), IValidator(Of T))
Else
Throw New NotSupportedException("Unsupported content type.")
End If
End Function
End Class
A classe PdfService fornece um método GeneratePdf. Este método recebe um objeto PdfContent como entrada e gera o documento PDF com base no conteúdo validado.
Primeiro, ele recupera o validador apropriado para o conteúdo chamando o método GetValidatorForContent, que verifica o tipo de conteúdo e retorna o validador correspondente. Em nosso caso, damos suporte ao InvoiceContent e usamos o InvoiceContentValidator.
Em seguida, o conteúdo é validado usando o validador, chamando seu método Validate. O resultado da validação é armazenado em um objeto ValidationResult.
Se a validação falhar (!validationResult.IsValid), um FluentValidation.ValidationException é lançado com os erros de validação. Caso contrário, o PDF é gerado usando o IronPDF.
Uma instância de ChromePdfRenderer é criada para renderizar o conteúdo HTML como um PDF. O método RenderHtmlAsPdf é chamado no objeto renderer, passando o HTML gerado pelo método content.RenderHtml, gerando o documento PDF.
Agora que definimos a lógica de geração do PDF, vamos lidar com quaisquer erros de validação que possam ocorrer.
Tratamento de erros de validação
Quando ocorre um erro de validação, queremos exibir uma mensagem de erro e tratá-lo de forma adequada. Vamos modificar o método Main da classe Program para lidar com quaisquer exceções e exibir mensagens significativas para o usuário.
using System;
using System.Collections.Generic;
public class Program
{
static void Main(string[] args)
{
var pdfService = new PdfService();
// Test 1: Empty Customer Name
try
{
var invoiceContent = new InvoiceContent
{
CustomerName = "",
Address = "123 Main St, Anytown, USA",
InvoiceItems = new List<InvoiceItem> {
new InvoiceItem { Description = "Item 1", Price = 19.99M },
new InvoiceItem { Description = "Item 2", Price = 29.99M }
}
};
var pdfDocument = pdfService.GeneratePdf(invoiceContent);
pdfDocument.SaveAs("C:\\TestInvoice.pdf");
Console.WriteLine("PDF generated successfully!");
}
catch (Exception ex)
{
Console.WriteLine("Error generating PDF: " + ex.Message);
}
// Test 2: Empty InvoiceItems
try
{
var invoiceContent = new InvoiceContent
{
CustomerName = "John Doe",
Address = "123 Main St, Anytown, USA",
InvoiceItems = new List<InvoiceItem>() // Empty list
};
var pdfDocument = pdfService.GeneratePdf(invoiceContent);
pdfDocument.SaveAs("C:\\TestInvoice.pdf");
Console.WriteLine("PDF generated successfully!");
}
catch (Exception ex)
{
Console.WriteLine("Error generating PDF: " + ex.Message);
}
// Successful generation
try
{
var invoiceContent = new InvoiceContent
{
CustomerName = "John Doe",
Address = "123 Main St, Anytown, USA",
InvoiceItems = new List<InvoiceItem> {
new InvoiceItem { Description = "Item 1", Price = 19.99M },
new InvoiceItem { Description = "Item 2", Price = 29.99M }
}
};
var pdfDocument = pdfService.GeneratePdf(invoiceContent);
pdfDocument.SaveAs("C:\\TestInvoice.pdf");
Console.WriteLine("PDF generated successfully!");
}
catch (Exception ex)
{
Console.WriteLine("Error generating PDF: " + ex.Message);
}
}
}
using System;
using System.Collections.Generic;
public class Program
{
static void Main(string[] args)
{
var pdfService = new PdfService();
// Test 1: Empty Customer Name
try
{
var invoiceContent = new InvoiceContent
{
CustomerName = "",
Address = "123 Main St, Anytown, USA",
InvoiceItems = new List<InvoiceItem> {
new InvoiceItem { Description = "Item 1", Price = 19.99M },
new InvoiceItem { Description = "Item 2", Price = 29.99M }
}
};
var pdfDocument = pdfService.GeneratePdf(invoiceContent);
pdfDocument.SaveAs("C:\\TestInvoice.pdf");
Console.WriteLine("PDF generated successfully!");
}
catch (Exception ex)
{
Console.WriteLine("Error generating PDF: " + ex.Message);
}
// Test 2: Empty InvoiceItems
try
{
var invoiceContent = new InvoiceContent
{
CustomerName = "John Doe",
Address = "123 Main St, Anytown, USA",
InvoiceItems = new List<InvoiceItem>() // Empty list
};
var pdfDocument = pdfService.GeneratePdf(invoiceContent);
pdfDocument.SaveAs("C:\\TestInvoice.pdf");
Console.WriteLine("PDF generated successfully!");
}
catch (Exception ex)
{
Console.WriteLine("Error generating PDF: " + ex.Message);
}
// Successful generation
try
{
var invoiceContent = new InvoiceContent
{
CustomerName = "John Doe",
Address = "123 Main St, Anytown, USA",
InvoiceItems = new List<InvoiceItem> {
new InvoiceItem { Description = "Item 1", Price = 19.99M },
new InvoiceItem { Description = "Item 2", Price = 29.99M }
}
};
var pdfDocument = pdfService.GeneratePdf(invoiceContent);
pdfDocument.SaveAs("C:\\TestInvoice.pdf");
Console.WriteLine("PDF generated successfully!");
}
catch (Exception ex)
{
Console.WriteLine("Error generating PDF: " + ex.Message);
}
}
}
Imports System
Imports System.Collections.Generic
Public Class Program
Shared Sub Main(ByVal args() As String)
Dim pdfService As New PdfService()
' Test 1: Empty Customer Name
Try
Dim invoiceContent As New InvoiceContent With {
.CustomerName = "",
.Address = "123 Main St, Anytown, USA",
.InvoiceItems = New List(Of InvoiceItem) From {
New InvoiceItem With {
.Description = "Item 1",
.Price = 19.99D
},
New InvoiceItem With {
.Description = "Item 2",
.Price = 29.99D
}
}
}
Dim pdfDocument = pdfService.GeneratePdf(invoiceContent)
pdfDocument.SaveAs("C:\TestInvoice.pdf")
Console.WriteLine("PDF generated successfully!")
Catch ex As Exception
Console.WriteLine("Error generating PDF: " & ex.Message)
End Try
' Test 2: Empty InvoiceItems
Try
Dim invoiceContent As New InvoiceContent With {
.CustomerName = "John Doe",
.Address = "123 Main St, Anytown, USA",
.InvoiceItems = New List(Of InvoiceItem)()
}
Dim pdfDocument = pdfService.GeneratePdf(invoiceContent)
pdfDocument.SaveAs("C:\TestInvoice.pdf")
Console.WriteLine("PDF generated successfully!")
Catch ex As Exception
Console.WriteLine("Error generating PDF: " & ex.Message)
End Try
' Successful generation
Try
Dim invoiceContent As New InvoiceContent With {
.CustomerName = "John Doe",
.Address = "123 Main St, Anytown, USA",
.InvoiceItems = New List(Of InvoiceItem) From {
New InvoiceItem With {
.Description = "Item 1",
.Price = 19.99D
},
New InvoiceItem With {
.Description = "Item 2",
.Price = 29.99D
}
}
}
Dim pdfDocument = pdfService.GeneratePdf(invoiceContent)
pdfDocument.SaveAs("C:\TestInvoice.pdf")
Console.WriteLine("PDF generated successfully!")
Catch ex As Exception
Console.WriteLine("Error generating PDF: " & ex.Message)
End Try
End Sub
End Class
No código acima, os blocos try-catch são usados para capturar quaisquer exceções que possam ocorrer. Se uma exceção for capturada, uma mensagem de erro será exibida ao usuário usando Console.WriteLine.
Agora vamos testar essa aplicação com diferentes cenários para validar a geração de PDFs e as regras de validação.
Testando o aplicativo
No exemplo de código, existem três cenários para testar:
- Nome do cliente vazio: Deixe o campo do nome do cliente vazio para gerar um erro de validação.
- Itens de fatura vazios: Forneça uma lista vazia de itens de fatura para acionar um erro de validação.
- Geração bem-sucedida: Forneça conteúdo válido para gerar o PDF com sucesso.
Execute o aplicativo e observe a saída no console.
Error generating PDF: Validation failed:
-- CustomerName: Customer name is required. Severity: Error
Error generating PDF: Validation failed:
-- InvoiceItems: At least one invoice item is required. Severity: Error
PDF generated successfully!
O erro de saída no console
O arquivo PDF de saída
Como esperado, erros de validação são exibidos nos dois primeiros cenários e uma mensagem de sucesso no terceiro cenário.
Conclusão
Este tutorial explorou a Validação Fluente e como usá-la com o IronPDF para gerar documentos PDF. Comece configurando um aplicativo de console e definindo a classe de conteúdo PDF. Em seguida, criei regras de validação usando o Fluent Validation e testei a geração de PDFs em diferentes cenários.
O Fluent Validation oferece uma abordagem flexível e fácil de usar para validar objetos em aplicações .NET . Permite definir regras de validação de forma fortemente tipada, personalizar mensagens de erro e lidar com erros de validação de maneira adequada.
Informações sobre o IronPDF : Avaliação gratuita e licenciamento. O IronPDF oferece um período de avaliação gratuito, e a licença custa a partir de US$ 499 por desenvolvedor.
Perguntas frequentes
Como posso integrar o Fluent Validation com a geração de PDFs em C#?
Para integrar o Fluent Validation com a geração de PDFs em C#, você pode configurar um aplicativo de console no Visual Studio, instalar os pacotes FluentValidation e IronPDF via NuGet e definir a lógica de validação do seu modelo usando o Fluent Validation enquanto gera os PDFs usando o IronPDF.
Quais são os passos envolvidos na configuração de um projeto para geração e validação de PDFs?
Para configurar um projeto, crie um novo Aplicativo de Console no Visual Studio, instale os pacotes IronPDF e FluentValidation através do NuGet e, em seguida, defina o conteúdo do seu PDF e as regras de validação usando as respectivas bibliotecas.
Como posso gerar um PDF a partir de conteúdo HTML usando uma biblioteca .NET?
Você pode gerar um PDF a partir de conteúdo HTML usando o método RenderHtmlAsPdf do IronPDF, que permite converter strings ou arquivos HTML em PDFs de alta qualidade.
Qual é a finalidade da classe PdfService no tutorial?
A classe PdfService no tutorial foi projetada para gerenciar a geração de PDFs, validando primeiro o conteúdo usando o Fluent Validation. Após a validação bem-sucedida, ela usa os métodos ChromePdfRenderer e RenderHtmlAsPdf do IronPDF para criar o PDF.
Como as regras de validação são definidas usando o Fluent Validation?
As regras de validação no Fluent Validation são definidas criando uma classe de validador que herda de AbstractValidator. Dentro dessa classe, o método RuleFor é usado para especificar condições para cada propriedade, permitindo mensagens de erro personalizadas e encadeamento de regras.
O que acontece se a validação falhar durante a geração do PDF?
Caso a validação falhe, o Fluent Validation lança uma ValidationException contendo informações detalhadas sobre os erros de validação, as quais podem ser usadas para informar o usuário sobre o que deu errado.
Posso usar o Fluent Validation para validação de objetos complexos?
Sim, o Fluent Validation oferece suporte à validação de objetos complexos por meio do uso de validadores filhos, permitindo validar propriedades e coleções aninhadas dentro do seu modelo.
Como posso personalizar as mensagens de erro no Fluent Validation?
Mensagens de erro personalizadas no Fluent Validation podem ser definidas usando o método WithMessage para cada regra de validação especificada com RuleFor .
Existe alguma versão de avaliação disponível para a biblioteca de geração de PDF?
Sim, o IronPDF oferece uma versão de avaliação gratuita para que os desenvolvedores testem os recursos da biblioteca, com opções de licenciamento disponíveis a partir de US$ 499 por desenvolvedor.
O IronPDF é totalmente compatível com o .NET 10?
Sim. O IronPDF é totalmente compatível com o .NET 10 e suporta plataformas como Windows, Linux e macOS em vários tipos de projeto (console, web, desktop, Blazor etc.). Ele funciona imediatamente com o runtime mais recente, sem necessidade de soluções alternativas.


