using IronPdf;
// Disable local disk access or cross-origin requests
Installation.EnableWebSecurity = true;
// Instantiate Renderer
var renderer = new ChromePdfRenderer();
// Create a PDF from a HTML string using C#
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
// Export to a file or Stream
pdf.SaveAs("output.pdf");
// Advanced Example with HTML Assets
// Load external html assets: Images, CSS and JavaScript.
// An optional BasePath 'C:\site\assets\' is set as the file location to load assets from
var myAdvancedPdf = renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>", @"C:\site\assets\");
myAdvancedPdf.SaveAs("html-with-assets.pdf");
Migrar deQuestPDFpara IronPDF move seu fluxo de trabalho de geração de PDF de uma API de layout fluente em C# para uma abordagem padrão baseada em HTML/CSS com capacidades mais amplas de manipulação de PDF. Este guia fornece um caminho de migração passo a passo para que você possa alavancar habilidades web existentes, reutilizar modelos HTML, e adquirir funcionalidades que a biblioteca principal doQuestPDFnão inclui.
Por que migrar doQuestPDFpara o IronPDF?
Entendendo o QuestPDF
QuestPDF é uma API moderna e fluente criada especificamente para gerar PDFs programaticamente em C#. Ao contrário de bibliotecas que oferecem conversão abrangente de HTML para PDF, a biblioteca principal doQuestPDFestá limitada a uma API de layout programático. OQuestPDFse destaca em cenários onde os desenvolvedores precisam gerar documentos do zero usando código C#, sem depender de HTML.
O nível comunitário é gratuito sob termos do MIT para indivíduos, organizações sem fins lucrativos, projetos FOSS e organizações com receita bruta anual abaixo de $1M USD. Acima desse limite,QuestPDFoferece uma licença Professional a partir de $999 (perpétua, até 10 desenvolvedores) e uma licença Enterprise a $2,999 (perpétua, para toda a organização), que precisam ser consideradas no planejamento de longo prazo.
O Problema Central: Nenhum Motor HTML na Biblioteca Principal
QuestPDF é por vezes recomendado para conversão de HTML para PDF, mas a biblioteca principal não renderiza HTML. Uma extensão QuestPDF.HTML mantida pela comunidade cobre um subconjunto limitado de HTML/CSS, mas o motor principal é apenas programático e não executa um mecanismo de navegador real. As equipes que já possuem modelos HTML/CSS geralmente precisam reconstruí-los na API fluente.
Recurso
QuestPDF
IronPDF
HTML-para-PDF (principal)
Não suportado (apenas API fluente)
Suporte total
HTML para PDF (extensão)
Parcial via QuestPDF.HTML (subconjunto limitado)
Suporte total
Estilização CSS
Limitado via extensão
CSS3 completo
Modelos existentes
Precisa ser reconstruído do zero.
Reutilize recursos HTML/CSS
Compatibilidade com ferramentas de design
None
Qualquer ferramenta de design web
Curva de Aprendizagem
Nova API fluente em C#
Transferência de habilidades web
Pré-visualização do layout
App complementar
Pré-visualização em qualquer navegador
Manipulação de PDF
Mesclar / extrair / sobrepor / criptografar (API de Operações de Documento, 2024.12.0+)
Mesclar, dividir, editar, assinar
IronPDF fornece renderização nativa de HTML para PDF que oQuestPDFprincipal não inclui, removendo a necessidade de reconstruir manualmente documentos em código C#. Também cobre funcionalidades de manipulação de PDF como mesclar, dividir, editar, proteger e assinatura digital — a API de Operações de Documento doQuestPDF(2024.12.0+) cobre mesclagem, extração de páginas, sobreposição/baixo de páginas, anexos e criptografia, mas não edita o conteúdo de páginas existentes, OCR ou assinaturas digitais.
O Modelo de Licenciamento QuestPDF
A Licença Comunitária doQuestPDF(termos do MIT) é gratuita para indivíduos, organizações sem fins lucrativos, projetos FOSS e organizações abaixo de $1M USD em receita bruta anual. Acima desse limite, você precisa de uma licença Professional a $999 (perpétua, até 10 desenvolvedores) ou Enterprise a $2,999 (perpétua, para toda a organização). Porque o gatilho é a receita da sua organização em vez do número de assentos, isso pode alterar conversas com clientes a jusante assim como sua própria licenciamento.
IronPDF oferece uma licença comercial por desenvolvedor: sem auditorias de receita, sem requisitos de licenciamento para clientes e custos previsíveis.
Para equipes adotando versões modernas do .NET,IronPDF fornece licenciamento por desenvolvedor sem gatilhos baseados em receita e uma abordagem padrão HTML/CSS que aproveita habilidades de desenvolvimento web existentes.
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText $csharpLabel
Encontre o uso do QuestPDF
# Find allQuestPDFusages in your codebase
grep -r "QuestPDF\|Document.Create\|\.GeneratePdf" --include="*.cs" .
# Find allQuestPDFusages in your codebase
grep -r "QuestPDF\|Document.Create\|\.GeneratePdf" --include="*.cs" .
SHELL
Referência completa da API
Alterações de namespace
// Before: QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
// After: IronPDF
using IronPdf;
// Before: QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
// After: IronPDF
using IronPdf;
Imports IronPdf
$vbLabelText $csharpLabel
Mapeamentos da API principal
ConceitoQuestPDF
Equivalente ao IronPDF
Document.Create()
new ChromePdfRenderer()
.Page()
RenderHtmlAsPdf()
.Text()
HTML <p>, <h1>, <span>
.Bold()
CSS font-weight: bold
.FontSize(24)
CSS font-size: 24px
.Image()
HTML <img src="...">
.Table()
HTML
.Column()
CSS exibir: flexível; flex-direction: coluna
.Row()
CSS exibir: flexível; flex-direction: linha
PageSizes.A4
RenderingOptions.PaperSize
.Margin()
RenderingOptions.Margin*
.GeneratePdf()
pdf.SaveAs()
N / D
PdfDocument.Merge()
N / D
PdfDocument.FromFile()
N / D
pdf.SecuritySettings
Exemplos de migração de código
Exemplo 1: Criação básica de documentos (HTML para PDF)
Antes (QuestPDF):
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Content().Column(column =>
{
column.Item().Text("Hello World").FontSize(20).Bold();
column.Item().Text("This is a paragraph of text.");
});
});
}).GeneratePdf("output.pdf");
}
}
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Content().Column(column =>
{
column.Item().Text("Hello World").FontSize(20).Bold();
column.Item().Text("This is a paragraph of text.");
});
});
}).GeneratePdf("output.pdf");
}
}
Imports QuestPDF.Fluent
Imports QuestPDF.Helpers
Imports QuestPDF.Infrastructure
Module Program
Sub Main()
QuestPDF.Settings.License = LicenseType.Community
Document.Create(Sub(container)
container.Page(Sub(page)
page.Size(PageSizes.A4)
page.Margin(2, Unit.Centimetre)
page.Content().Column(Sub(column)
column.Item().Text("Hello World").FontSize(20).Bold()
column.Item().Text("This is a paragraph of text.")
End Sub)
End Sub)
End Sub).GeneratePdf("output.pdf")
End Sub
End Module
$vbLabelText $csharpLabel
Após (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a paragraph of text.</p>");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a paragraph of text.</p>");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a paragraph of text.</p>")
pdf.SaveAs("output.pdf")
End Sub
End Class
$vbLabelText $csharpLabel
Este exemplo mostra a diferença de paradigma.QuestPDFrequer o aprendizado de sua API fluente: Document.Create(), container.Page(), page.Content().Column(), column.Item().Text(), com estilo via encadeamento de métodos como .FontSize(20).Bold(). Você também deve definir o tipo de licença com QuestPDF.Settings.License = LicenseType.Community.
IronPDF usa HTML padrão que qualquer desenvolvedor web conhece: para cabeçalhos, para parágrafos. Nenhum novo DSL de layout para aprender. A abordagem do IronPDF oferece sintaxe mais limpa e integra com o restante de uma pilha web moderna do .NET. Consulte a documentação de conversão de HTML para PDF para obter exemplos completos.
Exemplo 2: Geração de faturas
Antes (QuestPDF):
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Content().Column(column =>
{
column.Item().Text("INVOICE").FontSize(24).Bold();
column.Item().Text("Invoice #: 12345").FontSize(12);
column.Item().PaddingTop(20);
column.Item().Text("Customer: John Doe");
column.Item().Text("Total: $100.00").Bold();
});
});
}).GeneratePdf("invoice.pdf");
}
}
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Content().Column(column =>
{
column.Item().Text("INVOICE").FontSize(24).Bold();
column.Item().Text("Invoice #: 12345").FontSize(12);
column.Item().PaddingTop(20);
column.Item().Text("Customer: John Doe");
column.Item().Text("Total: $100.00").Bold();
});
});
}).GeneratePdf("invoice.pdf");
}
}
Imports QuestPDF.Fluent
Imports QuestPDF.Helpers
Imports QuestPDF.Infrastructure
Module Program
Sub Main()
QuestPDF.Settings.License = LicenseType.Community
Document.Create(Sub(container)
container.Page(Sub(page)
page.Size(PageSizes.A4)
page.Margin(2, Unit.Centimetre)
page.Content().Column(Sub(column)
column.Item().Text("INVOICE").FontSize(24).Bold()
column.Item().Text("Invoice #: 12345").FontSize(12)
column.Item().PaddingTop(20)
column.Item().Text("Customer: John Doe")
column.Item().Text("Total: $100.00").Bold()
End Sub)
End Sub)
End Sub).GeneratePdf("invoice.pdf")
End Sub
End Module
$vbLabelText $csharpLabel
Após (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var htmlContent = @"
<h1>INVOICE</h1>
<p>Invoice #: 12345</p>
<br/>
<p>Customer: John Doe</p>
<p><strong>Total: $100.00</strong></p>
";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("invoice.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var htmlContent = @"
<h1>INVOICE</h1>
<p>Invoice #: 12345</p>
<br/>
<p>Customer: John Doe</p>
<p><strong>Total: $100.00</strong></p>
";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("invoice.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim htmlContent As String = "
<h1>INVOICE</h1>
<p>Invoice #: 12345</p>
<br/>
<p>Customer: John Doe</p>
<p><strong>Total: $100.00</strong></p>
"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("invoice.pdf")
End Sub
End Class
$vbLabelText $csharpLabel
QuestPDF usa .Column() e .Item() para layout, com .PaddingTop(20) para espaçamento.IronPDF usa HTML padrão: para o título, para parágrafos, para espaçamento, e para texto em negrito.
A verdadeira vantagem: com o IronPDF, os designers podem criar e modificar modelos HTML de forma independente. Com o QuestPDF, cada alteração de design exige que um desenvolvedor C# modifique o código. Saiba mais em nossos tutoriais .
Exemplo 3: Cabeçalhos e rodapés com números de página
Antes (QuestPDF):
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Header().Text("Document Header").FontSize(14).Bold();
page.Content().Text("Main content of the document.");
page.Footer().AlignCenter().Text(text =>
{
text.Span("Page ");
text.CurrentPageNumber();
});
});
}).GeneratePdf("document.pdf");
}
}
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Header().Text("Document Header").FontSize(14).Bold();
page.Content().Text("Main content of the document.");
page.Footer().AlignCenter().Text(text =>
{
text.Span("Page ");
text.CurrentPageNumber();
});
});
}).GeneratePdf("document.pdf");
}
}
Imports QuestPDF.Fluent
Imports QuestPDF.Helpers
Imports QuestPDF.Infrastructure
Module Program
Sub Main()
QuestPDF.Settings.License = LicenseType.Community
Document.Create(Sub(container)
container.Page(Sub(page)
page.Size(PageSizes.A4)
page.Margin(2, Unit.Centimetre)
page.Header().Text("Document Header").FontSize(14).Bold()
page.Content().Text("Main content of the document.")
page.Footer().AlignCenter().Text(Sub(text)
text.Span("Page ")
text.CurrentPageNumber()
End Sub)
End Sub)
End Sub).GeneratePdf("document.pdf")
End Sub
End Module
$vbLabelText $csharpLabel
Após (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var htmlContent = "<p>Main content of the document.</p>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.Header = new TextHeaderFooter()
{
CenterText = "Document Header",
FontSize = 14
};
pdf.Footer = new TextHeaderFooter()
{
CenterText = "Page {page}"
};
pdf.SaveAs("document.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var htmlContent = "<p>Main content of the document.</p>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.Header = new TextHeaderFooter()
{
CenterText = "Document Header",
FontSize = 14
};
pdf.Footer = new TextHeaderFooter()
{
CenterText = "Page {page}"
};
pdf.SaveAs("document.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim htmlContent As String = "<p>Main content of the document.</p>"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.Header = New TextHeaderFooter() With {
.CenterText = "Document Header",
.FontSize = 14
}
pdf.Footer = New TextHeaderFooter() With {
.CenterText = "Page {page}"
}
pdf.SaveAs("document.pdf")
End Sub
End Class
$vbLabelText $csharpLabel
QuestPDF usa page.Header() e page.Footer() com métodos fluentes como .AlignCenter() e .CurrentPageNumber().IronPDF usa objetos TextHeaderFooter com propriedades como CenterText e FontSize. O espaço reservado {page} insere automaticamente o número da página atual.
Notas críticas sobre migração
A Mudança de Paradigma
A principal mudança é passar de uma API de layout fluente personalizada em C# para HTML/CSS padrão:
// QuestPDF: Fluent C# layout API
container.Page(page =>
{
page.Content().Column(column =>
{
column.Item().Text("Invoice").Bold().FontSize(24);
column.Item().Row(row =>
{
row.RelativeItem().Text("Customer:");
row.RelativeItem().Text("Acme Corp");
});
});
});
// IronPDF: Standard HTML/CSS
var html = @"
<div style='font-family: Arial; padding: 40px;'>
<h1 style='font-weight: bold; font-size: 24px;'>Invoice</h1>
<div style='display: flex; justify-content: space-between;'>
<span>Customer:</span>
<span>Acme Corp</span>
</div>
</div>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// QuestPDF: Fluent C# layout API
container.Page(page =>
{
page.Content().Column(column =>
{
column.Item().Text("Invoice").Bold().FontSize(24);
column.Item().Row(row =>
{
row.RelativeItem().Text("Customer:");
row.RelativeItem().Text("Acme Corp");
});
});
});
// IronPDF: Standard HTML/CSS
var html = @"
<div style='font-family: Arial; padding: 40px;'>
<h1 style='font-weight: bold; font-size: 24px;'>Invoice</h1>
<div style='display: flex; justify-content: space-between;'>
<span>Customer:</span>
<span>Acme Corp</span>
</div>
</div>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
' QuestPDF: Fluent VB.NET layout API
container.Page(Sub(page)
page.Content().Column(Sub(column)
column.Item().Text("Invoice").Bold().FontSize(24)
column.Item().Row(Sub(row)
row.RelativeItem().Text("Customer:")
row.RelativeItem().Text("Acme Corp")
End Sub)
End Sub)
End Sub)
' IronPDF: Standard HTML/CSS
Dim html As String = "
<div style='font-family: Arial; padding: 40px;'>
<h1 style='font-weight: bold; font-size: 24px;'>Invoice</h1>
<div style='display: flex; justify-content: space-between;'>
<span>Customer:</span>
<span>Acme Corp</span>
</div>
</div>"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
Após migrar para o IronPDF, você obtém recursos que oQuestPDFnão pode oferecer:
Fusão de PDFs
var cover = renderer.RenderHtmlAsPdf("<h1>Cover</h1>");
var content = renderer.RenderHtmlAsPdf(reportHtml);
var existing = PdfDocument.FromFile("appendix.pdf");
var merged = PdfDocument.Merge(cover, content, existing);
merged.SaveAs("complete.pdf");
var cover = renderer.RenderHtmlAsPdf("<h1>Cover</h1>");
var content = renderer.RenderHtmlAsPdf(reportHtml);
var existing = PdfDocument.FromFile("appendix.pdf");
var merged = PdfDocument.Merge(cover, content, existing);
merged.SaveAs("complete.pdf");
Dim cover = renderer.RenderHtmlAsPdf("<h1>Cover</h1>")
Dim content = renderer.RenderHtmlAsPdf(reportHtml)
Dim existing = PdfDocument.FromFile("appendix.pdf")
Dim merged = PdfDocument.Merge(cover, content, existing)
merged.SaveAs("complete.pdf")
$vbLabelText $csharpLabel
Segurança de PDF
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "reader";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SaveAs("protected.pdf");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "reader";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SaveAs("protected.pdf");
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SecuritySettings.OwnerPassword = "admin"
pdf.SecuritySettings.UserPassword = "reader"
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights
pdf.SaveAs("protected.pdf")
$vbLabelText $csharpLabel
URL para PDF
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;
var pdf = renderer.RenderUrlAsPdf("https://example.com/report");
pdf.SaveAs("webpage.pdf");
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;
var pdf = renderer.RenderUrlAsPdf("https://example.com/report");
pdf.SaveAs("webpage.pdf");
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.EnableJavaScript = True
Dim pdf = renderer.RenderUrlAsPdf("https://example.com/report")
pdf.SaveAs("webpage.pdf")
$vbLabelText $csharpLabel
Carregar e editar PDFs existentes
var pdf = PdfDocument.FromFile("existing.pdf");
// Modify, merge, add security, etc.
pdf.SaveAs("modified.pdf");
var pdf = PdfDocument.FromFile("existing.pdf");
// Modify, merge, add security, etc.
pdf.SaveAs("modified.pdf");
Dim pdf = PdfDocument.FromFile("existing.pdf")
' Modify, merge, add security, etc.
pdf.SaveAs("modified.pdf")
$vbLabelText $csharpLabel
Resumo da comparação de recursos
Recurso
QuestPDF
IronPDF
HTML para PDF
Core: não suportado (limitado via extensão QuestPDF.HTML)
Característica principal
Curva de Aprendizagem
API fluente em C#
Habilidades básicas na web
Pré-visualização do modelo
App complementar
Qualquer navegador
Colaboração em Design
Apenas para desenvolvedores
Designers + Desenvolvedores
Ativos existentes
Precisa reconstruir
Reutilize HTML/CSS
Manipulação de PDF
Mesclar / extrair / sobrepor (API de Operações de Documento, 2024.12.0+)
Apoiado
Segurança/Assinatura
Criptografia + permissões (sem assinatura digital)
Criptografia + assinatura digital
Modelo de licenciamento
Baseado em receita (limite de $1M)
Por desenvolvedor
Impacto no cliente
Pode precisar de licenças acima de $1M de receita
None
Bootstrap/Tailwind
Não suportado
Apoiado
URL para PDF
Não suportado
Apoiado
Lista de verificação para migração
Pré-migração
Identificar todos os modelos de documentosQuestPDF(Document.Create, .GeneratePdf)
Documentar os padrões DSL utilizados (.Column(), .Row(), .Table(), .Text())
Mapear métodos de estilização para seus equivalentes em CSS
Converter o padrão Document.Create() para ChromePdfRenderer + HTML
Substituir .Column() / .Row() por CSS Flexbox
Substituir .Table() por elementos HTML
Converter .Text().Bold().FontSize(24) para <h1 style='...'>
Substituir page.Header() / page.Footer() por TextHeaderFooter
Substituir .CurrentPageNumber() por espaço reservado {page}
Converter .GeneratePdf() para pdf.SaveAs()
Adicionar inicialização de licença na inicialização do aplicativo
Pós-migração
Comparação visual da saída em PDF
Testar documentos com várias páginas para garantir que as quebras de página estejam corretas.
Adicionar novas funcionalidades (segurança, mesclagem, URL para PDF) conforme necessário.
ObserveQuestPDF é uma marca registrada de seu respectivo proprietário. Este site não é afiliado, endossado ou patrocinado pela Codeux Software ou os mantenedores do QuestPDF. Todos os nomes de produtos, logotipos e marcas são propriedade de seus respectivos proprietários. As comparações são apenas para fins informativos e refletem informações disponíveis publicamente no momento da redação.
Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...