Como migrar do SAP Crystal Reports para o IronPDF em C#
Migrar doSAP Crystal Reportspara o IronPDF transforma o seu fluxo de trabalho de relatórios de uma redistribuição MSI de tempo de execução com dependências da era COM para um pacoteNuGetmoderno. Este guia fornece um caminho de migração passo a passo que remove a necessidade de instalador de tempo de execução, libera o bloqueio do ecossistema SAP e desbloqueia .NET 6/8/9 e metas Linux/Docker que o Crystal Reports para Visual Studio (CR4VS) não suporta.
Por que migrar doSAP Crystal Reportspara o IronPDF?
Entendendo o SAP Crystal Reports
OSAP Crystal Reportsé uma plataforma de relatórios empresariais amplamente usada para gerar relatórios "pixel-perfect", com ampla conectividade a fontes de dados e um ecossistema de design estabelecido. O Crystal Reports Designer continua a ser uma ferramenta produtiva para construir layouts de relatórios complexos dentro da pilha SAP.
No entanto, a arquitetura da era COM do tempo de execução e a dependência exclusiva do Windows/.NET Framework criam atrito para equipes que têm como alvo o .NET 6/8/9, Linux ou implementações centradas em contêineres.
Principais razões para migrar
- Redistribuição MSI de Tempo de Execução: O Crystal Reports Runtime é distribuído como um instalador MSI (geralmente chega a dezenas de MB a alguns centenas de MB dependendo de 32/64 bits e localização) em vez de um pacote NuGet
- Bloqueio do Ecossistema SAP: Vinculado aos ciclos de lançamento e roteiro de produtos da SAP; a SAP confirmou o fim do suporte de manutenção principal para CR4VS no final de 2027
- Licenciamento: O próprio CR4VS é gratuito para download e o tempo de execução é gratuito para redistribuir, mas a família de designers do Crystal Reports (CR 2020 / CR 2025) e a plataforma BI são SKU comerciais da SAP
- Arquitetura Legada: DLLs de tempo de execução dependentes de COM alvos do.NET Framework 4.xnão podem ser carregados sob .NET Core / .NET 5+
- Sem Suporte .NET Core / .NET 5+: Não há roteiro para um tempo de execução Crystal Reports visando o .NET moderno; os projetos permanecem fixados no .NET Framework 4.x
- Tempo de Execução de 32 bits Descontinuado: A SAP confirmou que o tempo de execução CR .NET de 32 bits será descontinuado após o SP 39 (dezembro de 2025); os pacotes de serviço futuros serão apenas de 64 bits
- Dependência do Designer de Relatórios: Requer a extensão CR4VS do Visual Studio ou um designer Crystal Reports autônomo para criar arquivos
.rpt
Os custos ocultos do SAP Crystal Reports
| Fator de custo | SAP Crystal Reports | IronPDF |
|---|---|---|
| Distribuição de Tempo de Execução | Instalador MSI redistribuível | PacoteNuGet |
| Instalação | Instalador de tempo de execução + extensão VS | dotnet add package IronPdf |
| Implantação | Executar MSI na máquina de destino | xcopy / publicar |
| Suporte a 64 bits | Sim (tempo de execução de 32 bits termina após SP 39, dez 2025) | Nativo |
| .NET Core / .NET 5+ | Não suportado (apenas Framework 4.x) | Suporte completo (.NET 6/8/9, Framework 4.6.2+) |
| Implantação na nuvem | Apenas VMs Windows | Simples |
| Linux / Docker | Não suportado (apenas Windows) | Apoiado |
Comparação entreSAP Crystal Reportse IronPDF
| Recurso | SAP Crystal Reports | IronPDF |
|---|---|---|
| Funcionalidade principal | Plataforma de relatórios empresariais | Motor de conversão de HTML para PDF e manipulação de PDFs |
| Integração | O melhor dentro do ecossistema SAP | Integração moderna com .NET , pacoteNuGetleve. |
| Facilidade de uso | Configuração e implantação complexas | Integração simplificada, compatível com desenvolvedores .NET |
| Designer de Relatórios | Obrigatório | Opcional (HTML/CSS) |
| Formato do modelo | .rpt (binário) | HTML/CSS |
| HTML para PDF | Não | Cromo completo |
| URL para PDF | Não | Sim |
| Suporte a CSS | Não | CSS3 completo |
| JavaScript | Não | ES2024 completo |
| Manipulação de PDF | Não | Completo (mesclar, dividir, editar) |
| Assinaturas digitais | Não | Sim |
| Conformidade com PDF/A | Não | Sim |
| Relevância Moderna | Em declínio, substituído por alternativas modernas. | Moderno e bem integrado com as tecnologias contemporâneas. |
Para equipes visando .NET moderno (6, 8, 9) e implantação multiplataforma, o IronPDF fornece suporte nativo que o tempo de execução Crystal Reports — fixado no.NET Framework 4.x— não pode oferecer.
Antes de começar
Pré-requisitos
- Ambiente .NET: .NET Framework 4.6.2+ ou .NET 6 / 8 / 9
- Acesso aoNuGet: Capacidade de instalar pacotes NuGet.
- Licença do IronPDF: Obtenha sua chave de licença em IronPDF
Alterações no pacote NuGet
# Crystal Reports for Visual Studio is not distributed by SAP on NuGet.
# Projects typically reference the GAC-installed CrystalDecisions.*.dll
# assemblies delivered by the CR4VS / CR runtime MSI. Community-maintained
#NuGetwrappers such as CrystalReports.Engine exist for build automation
# but are not official SAP packages.
# 1. Remove direct assembly references (CrystalDecisions.*.dll) from your .csproj
# 2. If using a communityNuGetwrapper, remove it:
dotnet remove package CrystalReports.Engine
# 3. Uninstall the Crystal Reports runtime MSI from build/deploy targets
# 4. Install IronPDF
dotnet add package IronPdf
# Crystal Reports for Visual Studio is not distributed by SAP on NuGet.
# Projects typically reference the GAC-installed CrystalDecisions.*.dll
# assemblies delivered by the CR4VS / CR runtime MSI. Community-maintained
#NuGetwrappers such as CrystalReports.Engine exist for build automation
# but are not official SAP packages.
# 1. Remove direct assembly references (CrystalDecisions.*.dll) from your .csproj
# 2. If using a communityNuGetwrapper, remove it:
dotnet remove package CrystalReports.Engine
# 3. Uninstall the Crystal Reports runtime MSI from build/deploy targets
# 4. Install IronPDF
dotnet add package IronPdf
Configuração de licença
// 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"
Referência completa da API
Alterações de namespace
// Before: SAP Crystal Reports
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using CrystalDecisions.ReportAppServer;
// After: IronPDF
using IronPdf;
// Before: SAP Crystal Reports
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using CrystalDecisions.ReportAppServer;
// After: IronPDF
using IronPdf;
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports CrystalDecisions.ReportAppServer
Imports IronPdf
Mapeamentos da API principal
| SAP Crystal Reports | IronPDF | Notas |
|---|---|---|
ReportDocument |
ChromePdfRenderer |
Renderização principal |
ReportDocument.Load() |
RenderHtmlAsPdf() |
Carregar conteúdo |
Arquivos .rpt |
ModelosHTML/CSS | Formato do modelo |
SetDataSource() |
HTML com dados | Vinculação de dados |
SetParameterValue() |
Interpolação de strings | Parâmetros |
ExportToDisk() |
pdf.SaveAs() |
Salvar arquivo |
ExportToStream() |
pdf.BinaryData |
Obter bytes |
PrintToPrinter() |
pdf.Print() |
Impressão |
Database.Tables |
Acesso a dados em C# | Fonte de dados |
FormulaFieldDefinitions |
Lógica C# | Cálculos |
SummaryInfo |
pdf.MetaData |
Metadados do PDF |
ExportFormatType.PortableDocFormat |
Saída padrão | PDF nativo |
Exemplos de migração de código
Exemplo 1: Conversão de HTML para PDF
Antes (SAP Crystal Reports):
// NuGet: Install-Package CrystalReports.Engine
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System;
class Program
{
static void Main()
{
// Crystal Reports requires a .rpt file template
ReportDocument reportDocument = new ReportDocument();
reportDocument.Load("Report.rpt");
// Crystal Reports doesn't directly support HTML
// You need to bind data to the report template
// reportDocument.SetDataSource(dataSet);
ExportOptions exportOptions = reportDocument.ExportOptions;
exportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
exportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
DiskFileDestinationOptions diskOptions = new DiskFileDestinationOptions();
diskOptions.DiskFileName = "output.pdf";
exportOptions.DestinationOptions = diskOptions;
reportDocument.Export();
reportDocument.Close();
reportDocument.Dispose();
}
}
// NuGet: Install-Package CrystalReports.Engine
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System;
class Program
{
static void Main()
{
// Crystal Reports requires a .rpt file template
ReportDocument reportDocument = new ReportDocument();
reportDocument.Load("Report.rpt");
// Crystal Reports doesn't directly support HTML
// You need to bind data to the report template
// reportDocument.SetDataSource(dataSet);
ExportOptions exportOptions = reportDocument.ExportOptions;
exportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
exportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
DiskFileDestinationOptions diskOptions = new DiskFileDestinationOptions();
diskOptions.DiskFileName = "output.pdf";
exportOptions.DestinationOptions = diskOptions;
reportDocument.Export();
reportDocument.Close();
reportDocument.Dispose();
}
}
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports System
Class Program
Shared Sub Main()
' Crystal Reports requires a .rpt file template
Dim reportDocument As New ReportDocument()
reportDocument.Load("Report.rpt")
' Crystal Reports doesn't directly support HTML
' You need to bind data to the report template
' reportDocument.SetDataSource(dataSet)
Dim exportOptions As ExportOptions = reportDocument.ExportOptions
exportOptions.ExportDestinationType = ExportDestinationType.DiskFile
exportOptions.ExportFormatType = ExportFormatType.PortableDocFormat
Dim diskOptions As New DiskFileDestinationOptions()
diskOptions.DiskFileName = "output.pdf"
exportOptions.DestinationOptions = diskOptions
reportDocument.Export()
reportDocument.Close()
reportDocument.Dispose()
End Sub
End Class
Após (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF from HTML string
var renderer = new ChromePdfRenderer();
string htmlContent = "<h1>Hello World</h1><p>This is a PDF generated from HTML.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF from HTML string
var renderer = new ChromePdfRenderer();
string htmlContent = "<h1>Hello World</h1><p>This is a PDF generated from HTML.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
' Create a PDF from HTML string
Dim renderer As New ChromePdfRenderer()
Dim htmlContent As String = "<h1>Hello World</h1><p>This is a PDF generated from HTML.</p>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully!")
End Sub
End Class
Este exemplo demonstra a diferença fundamental de paradigma.SAP Crystal Reportsrequer um template de arquivo .rpt pré-desenhado criado no Crystal Reports Designer, depois você deve configurar ExportOptions, ExportDestinationType, ExportFormatType, e DiskFileDestinationOptions. A biblioteca não oferece suporte direto a conteúdo HTML — você precisa vincular os dados ao modelo de relatório.
IronPDF aceita strings HTML diretamente: crie um ChromePdfRenderer, chame RenderHtmlAsPdf() com qualquer conteúdo HTML, e SaveAs(). Não requer designer, modelos binários ou configuração complexa de exportação. Consulte a documentação de conversão de HTML para PDF para obter exemplos completos.
Exemplo 2: Conversão de URL para PDF
Antes (SAP Crystal Reports):
// NuGet: Install-Package CrystalReports.Engine
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System;
using System.Net;
class Program
{
static void Main()
{
// Crystal Reports cannot directly convert URLs to PDF
// You need to create a report template first
// Download HTML content
WebClient client = new WebClient();
string htmlContent = client.DownloadString("https://example.com");
// Crystal Reports requires .rpt template and data binding
// This approach is not straightforward for URL conversion
ReportDocument reportDocument = new ReportDocument();
reportDocument.Load("WebReport.rpt");
// Manual data extraction and binding required
// reportDocument.SetDataSource(extractedData);
reportDocument.ExportToDisk(ExportFormatType.PortableDocFormat, "output.pdf");
reportDocument.Close();
reportDocument.Dispose();
}
}
// NuGet: Install-Package CrystalReports.Engine
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System;
using System.Net;
class Program
{
static void Main()
{
// Crystal Reports cannot directly convert URLs to PDF
// You need to create a report template first
// Download HTML content
WebClient client = new WebClient();
string htmlContent = client.DownloadString("https://example.com");
// Crystal Reports requires .rpt template and data binding
// This approach is not straightforward for URL conversion
ReportDocument reportDocument = new ReportDocument();
reportDocument.Load("WebReport.rpt");
// Manual data extraction and binding required
// reportDocument.SetDataSource(extractedData);
reportDocument.ExportToDisk(ExportFormatType.PortableDocFormat, "output.pdf");
reportDocument.Close();
reportDocument.Dispose();
}
}
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports System
Imports System.Net
Module Program
Sub Main()
' Crystal Reports cannot directly convert URLs to PDF
' You need to create a report template first
' Download HTML content
Dim client As New WebClient()
Dim htmlContent As String = client.DownloadString("https://example.com")
' Crystal Reports requires .rpt template and data binding
' This approach is not straightforward for URL conversion
Dim reportDocument As New ReportDocument()
reportDocument.Load("WebReport.rpt")
' Manual data extraction and binding required
' reportDocument.SetDataSource(extractedData)
reportDocument.ExportToDisk(ExportFormatType.PortableDocFormat, "output.pdf")
reportDocument.Close()
reportDocument.Dispose()
End Sub
End Module
Após (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF from a URL
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created from URL successfully!");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF from a URL
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created from URL successfully!");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
' Create a PDF from a URL
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created from URL successfully!")
End Sub
End Class
OSAP Crystal Reportsnão consegue converter URLs diretamente para PDF. Você precisaria baixar manualmente o conteúdo HTML com WebClient, depois extrair e vincular de alguma forma esses dados a um template .rpt pré-desenhado—um processo que não é simples e requer um trabalho manual significativo.
O método RenderUrlAsPdf() do IronPDF captura a página web totalmente renderizada com todo o CSS,JavaScripte imagens em uma única chamada. Saiba mais em nossos tutoriais .
Exemplo 3: Cabeçalhos e rodapés com números de página
Antes (SAP Crystal Reports):
// NuGet: Install-Package CrystalReports.Engine
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System;
class Program
{
static void Main()
{
// Crystal Reports requires design-time configuration
ReportDocument reportDocument = new ReportDocument();
reportDocument.Load("Report.rpt");
// Headers and footers must be designed in the .rpt file
// using Crystal Reports designer
// You can set parameter values programmatically
reportDocument.SetParameterValue("HeaderText", "Company Name");
reportDocument.SetParameterValue("FooterText", "Page ");
// Crystal Reports handles page numbers through formula fields
// configured in the designer
reportDocument.ExportToDisk(ExportFormatType.PortableDocFormat, "output.pdf");
reportDocument.Close();
reportDocument.Dispose();
}
}
// NuGet: Install-Package CrystalReports.Engine
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System;
class Program
{
static void Main()
{
// Crystal Reports requires design-time configuration
ReportDocument reportDocument = new ReportDocument();
reportDocument.Load("Report.rpt");
// Headers and footers must be designed in the .rpt file
// using Crystal Reports designer
// You can set parameter values programmatically
reportDocument.SetParameterValue("HeaderText", "Company Name");
reportDocument.SetParameterValue("FooterText", "Page ");
// Crystal Reports handles page numbers through formula fields
// configured in the designer
reportDocument.ExportToDisk(ExportFormatType.PortableDocFormat, "output.pdf");
reportDocument.Close();
reportDocument.Dispose();
}
}
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports System
Class Program
Shared Sub Main()
' Crystal Reports requires design-time configuration
Dim reportDocument As New ReportDocument()
reportDocument.Load("Report.rpt")
' Headers and footers must be designed in the .rpt file
' using Crystal Reports designer
' You can set parameter values programmatically
reportDocument.SetParameterValue("HeaderText", "Company Name")
reportDocument.SetParameterValue("FooterText", "Page ")
' Crystal Reports handles page numbers through formula fields
' configured in the designer
reportDocument.ExportToDisk(ExportFormatType.PortableDocFormat, "output.pdf")
reportDocument.Close()
reportDocument.Dispose()
End Sub
End Class
Após (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
// Configure headers and footers
renderer.RenderingOptions.TextHeader.CenterText = "Company Name";
renderer.RenderingOptions.TextHeader.FontSize = 12;
renderer.RenderingOptions.TextFooter.LeftText = "Confidential";
renderer.RenderingOptions.TextFooter.RightText = "Page {page} of {total-pages}";
renderer.RenderingOptions.TextFooter.FontSize = 10;
string htmlContent = "<h1>Document Title</h1><p>Document content goes here.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF with headers and footers created!");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
// Configure headers and footers
renderer.RenderingOptions.TextHeader.CenterText = "Company Name";
renderer.RenderingOptions.TextHeader.FontSize = 12;
renderer.RenderingOptions.TextFooter.LeftText = "Confidential";
renderer.RenderingOptions.TextFooter.RightText = "Page {page} of {total-pages}";
renderer.RenderingOptions.TextFooter.FontSize = 10;
string htmlContent = "<h1>Document Title</h1><p>Document content goes here.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF with headers and footers created!");
}
}
Imports IronPdf
Imports System
Module Program
Sub Main()
Dim renderer As New ChromePdfRenderer()
' Configure headers and footers
renderer.RenderingOptions.TextHeader.CenterText = "Company Name"
renderer.RenderingOptions.TextHeader.FontSize = 12
renderer.RenderingOptions.TextFooter.LeftText = "Confidential"
renderer.RenderingOptions.TextFooter.RightText = "Page {page} of {total-pages}"
renderer.RenderingOptions.TextFooter.FontSize = 10
Dim htmlContent As String = "<h1>Document Title</h1><p>Document content goes here.</p>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF with headers and footers created!")
End Sub
End Module
OSAP Crystal Reportsrequer configuração em tempo de design para cabeçalhos e rodapés. Você deve projetá-los no arquivo .rpt usando o Crystal Reports Designer, depois passar valores de parâmetros como "HeaderText" e "FooterText" em tempo de execução. Os números de página devem ser configurados através de campos de fórmula no designer.
IronPDF oferece configuração de cabeçalho/rodapé programática com as propriedades TextHeader e TextFooter. Defina CenterText, LeftText, RightText e FontSize diretamente no código. Os números de página usam os placeholders {page} e {total-pages} — sem necessidade de designer.
Problemas comuns de migração
Problema 1: Conversão de arquivo .rpt
SAP Crystal Reports: Arquivos binários .rpt com layout, dados e fórmulas incorporados.
Solução: Não é possível converter diretamente — é necessário recriar como HTML:
- Abra o arquivo .rpt no designer do Crystal Reports
- Layout do documento, fontes, cores
- Observe todos os campos de fórmula.
- Recriar em HTML/CSS
- Converter fórmulas em código C#
Problema 2: Conexões de banco de dados
SAP Crystal Reports: Cadeias de conexão incorporadas e ODBC.
Solução: Utilize a camada de dados da sua aplicação:
// Instead of Crystal's database integration
var data = await _dbContext.Orders
.Where(o => o.Date >= startDate && o.Date <= endDate)
.ToListAsync();
// Bind to HTML template
var html = GenerateReportHtml(data);
// Instead of Crystal's database integration
var data = await _dbContext.Orders
.Where(o => o.Date >= startDate && o.Date <= endDate)
.ToListAsync();
// Bind to HTML template
var html = GenerateReportHtml(data);
Option Strict On
' Instead of Crystal's database integration
Dim data = Await _dbContext.Orders _
.Where(Function(o) o.Date >= startDate AndAlso o.Date <= endDate) _
.ToListAsync()
' Bind to HTML template
Dim html = GenerateReportHtml(data)
Problema 3: Dependências de tempo de execução
SAP Crystal Reports: Requer a instalação do Crystal Reports Runtime (500 MB ou mais).
Solução:IronPDF é autossuficiente:
# Just add theNuGetpackage
dotnet add package IronPdf
# That's it - no additional installs needed
# Just add theNuGetpackage
dotnet add package IronPdf
# That's it - no additional installs needed
Problema 4: Bloqueio de 32 bits/64 bits e .NET Framework
SAP Crystal Reports: O tempo de execução do Crystal Reports depende de COM e é distribuído em MSIs separados de 32 bits e 64 bits. A SAP confirmou que o tempo de execução CR .NET de 32 bits será descontinuado após o SP 39 (dezembro de 2025); os pacotes de serviço futuros serão apenas de 64 bits. O tempo de execução tem como alvo o.NET Framework 4.xe não pode ser carregado sob .NET Core / .NET 5+.
Solution:IronPDF runs on .NET Framework 4.6.2+, .NET 6, .NET 8, and .NET 9 — including Linux and Docker. Nenhuma configuração especial é necessária para 64 bits ou AnyCPU.
Novas funcionalidades após a migração
Após migrar para o IronPDF, você obtém recursos que oSAP Crystal Reportsnão oferece:
Fusão de PDFs
var pdf1 = PdfDocument.FromFile("report1.pdf");
var pdf2 = PdfDocument.FromFile("report2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("complete_report.pdf");
var pdf1 = PdfDocument.FromFile("report1.pdf");
var pdf2 = PdfDocument.FromFile("report2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("complete_report.pdf");
Dim pdf1 = PdfDocument.FromFile("report1.pdf")
Dim pdf2 = PdfDocument.FromFile("report2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("complete_report.pdf")
Segurança de PDF
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(reportHtml);
pdf.MetaData.Title = "Quarterly Sales Report";
pdf.MetaData.Author = "Finance Department";
pdf.SecuritySettings.OwnerPassword = "admin123";
pdf.SecuritySettings.UserPassword = "view123";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SaveAs("secure_report.pdf");
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(reportHtml);
pdf.MetaData.Title = "Quarterly Sales Report";
pdf.MetaData.Author = "Finance Department";
pdf.SecuritySettings.OwnerPassword = "admin123";
pdf.SecuritySettings.UserPassword = "view123";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SaveAs("secure_report.pdf");
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(reportHtml)
pdf.MetaData.Title = "Quarterly Sales Report"
pdf.MetaData.Author = "Finance Department"
pdf.SecuritySettings.OwnerPassword = "admin123"
pdf.SecuritySettings.UserPassword = "view123"
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SaveAs("secure_report.pdf")
Assinaturas digitais
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
Dim signature = New PdfSignature("certificate.pfx", "password")
pdf.Sign(signature)
Marcas d'água
using IronPdf.Editing;
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
using IronPdf.Editing;
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
Imports IronPdf.Editing
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>")
Resumo da comparação de recursos
| Recurso | SAP Crystal Reports | IronPDF | |||
|---|---|---|---|---|---|
| Instalação : | Distribuição de Tempo de Execução | MSI redistribuível | NuGet | ||
| Método de instalação | MSI + extensão do Visual Studio | NuGet | |||
| Implantação | Executar MSI na máquina de destino | xcopy / publicar | |||
| Suporte à plataforma : | .NET Framework 4.x | Sim | Sim (4.6.2+) | ||
| .NET Core / .NET 5+ | Não suportado | Sim (.NET 6/8/9) | |||
| Nativo de 64 bits | Sim (o fim de 32 bits depois do SP 39, dez 2025) | Sim | |||
| Linux / Docker | Não suportado (apenas Windows) | Sim | |||
| Azure / AWS | Apenas VMs Windows | Simples | |||
| : Desenvolvimento : | Designer de Relatórios | Obrigatório | Opcional (HTML) | ||
| Formato do modelo | .rpt (binário) | HTML/CSS | |||
| Curva de Aprendizagem | Sintaxe Crystal | Padrões da Web | |||
| IntelliSense | Não | Dó# completo | |||
| Renderização : | HTML para PDF | Não | Cromo completo | ||
| URL para PDF | Não | Sim | |||
| Suporte a CSS | Não | CSS3 completo | |||
| JavaScript | Não | ES2024 completo | |||
| : Funcionalidades do PDF : | Mesclar PDFs | Não | Sim | ||
| Dividir PDFs | Não | Sim | |||
| Marcas d'água | Limitado | HTML completo | |||
| Assinaturas digitais | Não | Sim | |||
| PDF/A | Não | Sim |
Lista de verificação para migração
Pré-migração
- Inventariar todos os arquivos
.rpt - Faça uma captura de tela de cada layout de relatório para referência.
- Documentar campos de fórmulas e cálculos
- Liste todas as fontes de dados e parâmetros.
- Identificar os requisitos de impressão
- Obtenha a chave de licença do IronPDF em IronPDF
Atualizações de código
- Remover pacotes Crystal Reports (
CrystalDecisions.CrystalReports.Engine, etc.) - Remover a instalação do runtime da implantação
- Instalar o pacoteNuGet
IronPdf - Converter layouts
.rptpara templates HTML/CSS - Converter fórmulas Crystal em código C#
- Atualizar a ligação de dados de
SetDataSource()para interpolação de strings HTML - Atualizar o código de impressão de
PrintToPrinter()parapdf.Print() - Adicionar inicialização de licença na inicialização do aplicativo
Infraestrutura
- Remover o Crystal Runtime dos servidores
- Atualizar scripts de implantação
- Remover o modo de compatibilidade de 32 bits
- Atualizar imagens do Docker (se aplicável)
Testando
- Comparar a saída em PDF com os relatórios originais
- Verificar todos os cálculos
- Testar todos os parâmetros
- Testar a funcionalidade de impressão
- Testes de desempenho
- Teste de 64 bits

