Jak przeprowadzić migrację z SAP Crystal Reports do IronPDF w języku C#
Migracja zSAP Crystal Reportsdo IronPDF przekształca twój workflow raportowania z redystrybucyjnego runtime MSI z zależnościami z ery COM do nowoczesnego pakietu NuGet. Ten przewodnik zapewnia ścieżkę migracji krok po kroku, która eliminuje wymóg instalatora runtime, odblokowuje zależność SAP i umożliwia cele .NET 6/8/9 oraz Linux/Docker, które Crystal Reports dla Visual Studio (CR4VS) nie wspiera.
Dlaczego warto przejść zSAP Crystal Reportsna IronPDF
Zrozumienie SAP Crystal Reports
SAP Crystal Reports to platforma raportowania korporacyjnego szeroko stosowana do generowania raportów o "pikselowej dokładności", z szeroką łącznością źródeł danych i długotrwałym ekosystemem projektowania. Projektant Crystal Reports pozostaje produktywnym narzędziem do budowy złożonych układów raportów w stosie SAP.
Jednak architektura runtime z ery COM i footprint tylko dla Windows/.NET Framework tworzą trudności dla zespołów celujących w .NET 6/8/9, Linux lub wdrożenia nastawione na kontenery.
Główne powody migracji
- Redystrybucyjne MSI Runtime: Runtime Crystal Reports jest dostarczany jako instalator MSI (zwykle dziesiątki do kilku setek MB w zależności od 32/64-bit i języka) zamiast jako pakiet NuGet
- Zależność od ekosystemu SAP: Związanie z cyklami wydawniczymi SAP i roadmapą produktów; SAP potwierdziło zakończenie podstawowej konserwacji dla CR4VS na koniec 2027
- Licencjonowanie: Sam CR4VS można pobrać za darmo, a runtime można bezpłatnie redystrybuować, ale projektant rodziny Crystal Reports (CR 2020 / CR 2025) oraz Platforma BI to komercyjne jednostki SKU od SAP
- Architektura Dziedziczenia: Komponentowe DLL runtime zależne od COM celują w.NET Framework 4.xi nie mogą być ładowane pod .NET Core / .NET 5+
- Brak wsparcia dla .NET Core / .NET 5+: Nie ma roadmapy dla runtime Crystal Reports celującego w nowoczesne .NET; projekty pozostają przypięte do .NET Framework 4.x
- Runtimes 32-bitowe Zakończone: SAP potwierdził, że 32-bitowy CR .NET runtime jest zakończony po SP 39 (grudzień 2025); przyszłe pakiety serwisowe są tylko 64-bitowe
- Zależność Projektanta Raportów: Wymaga rozszerzenia CR4VS Visual Studio lub samodzielnego projektanta Crystal Reports do tworzenia plików
.rpt
Ukryte koszty SAP Crystal Reports
| Czynnik kosztowy | SAP Crystal Reports | IronPDF |
|---|---|---|
| Dystrybucja Runtime | Instalator redystrybucyjny MSI | PakietNuGet |
| Instalacja | Instalator runtime + rozszerzenie VS | dotnet add package IronPdf |
| Wdrożenie | Uruchom MSI na maszynie docelowej | xcopy / publikacja |
| Obsługa 64-bitowa | Tak (runtime 32-bitowy kończy się po SP 39, grudzień 2025) | Język ojczysty |
| .NET Core / .NET 5+ | Nieobsługiwane (tylko Framework 4.x) | Pełne wsparcie (.NET 6/8/9, Framework 4.6.2+) |
| Wdrożenie w chmurze | Tylko maszyny wirtualne Windows | Proste |
| Linux / Docker | Nieobsługiwane (tylko Windows) | Obsługiwane |
PorównanieSAP Crystal Reportsi IronPDF
| Funkcja | SAP Crystal Reports | IronPDF |
|---|---|---|
| Podstawowa funkcjonalność | Platforma raportowania dla Enterprise | Silnik konwersji HTML do PDF i obróbka plików PDF |
| Integracja | Najlepsze w ekosystemie SAP | Nowoczesna integracja z platformą .NET, lekki pakietNuGet |
| Łatwość użytkowania | Złożona konfiguracja i wdrożenie | Uproszczona integracja, obsługa programistów .NET |
| Projektant raportów | Wymagane | Opcjonalnie (HTML/CSS) |
| Format szablonu | .rpt (binarny) | HTML/CSS |
| HTML do PDF | Nie | Pełny Chromium |
| URL do pliku PDF | Nie | Tak |
| Obsługa CSS | Nie | Pełny CSS3 |
| JavaScript | Nie | Pełna wersja ES2024 |
| Manipulacja plikami PDF | Nie | Pełne (scal, podziel, edytuj) |
| Podpisy cyfrowe | Nie | Tak |
| Zgodność z PDF/A | Nie | Tak |
| Współczesne znaczenie | Wychodzące z użycia, zastąpione przez nowoczesne alternatywy | Nowoczesne, dobrze zintegrowane z aktualnymi technologiami |
Dla zespołów celujących w nowoczesne .NET (6, 8, 9) i wdrożenia międzyplatformowe,IronPDF zapewnia natywne wsparcie, które runtime Crystal Reports — przypięty do.NET Framework 4.x— nie może oferować.
Zanim zaczniesz
Wymagania wstępne
- Srodowisko .NET: .NET Framework 4.6.2+ lub .NET 6 / 8 / 9
- Dostęp do NuGet: Możliwość instalowania pakietów NuGet
- Licencja IronPDF: Uzyskaj klucz licencyjny na stronie ironpdf.com
Zmiany w pakiecie 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
Konfiguracja licencji
// 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"
Kompletna dokumentacija API
Zmiany w przestrzeni nazw
// 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
Mapowania podstawowych interfejsów API
| SAP Crystal Reports | IronPDF | Uwagi |
|---|---|---|
ReportDocument |
ChromePdfRenderer |
Renderowanie rdzenia |
ReportDocument.Load() |
RenderHtmlAsPdf() |
Załaduj treść |
pliki .rpt |
SzablonyHTML/CSS | Format szablonu |
SetDataSource() |
HTML z danymi | Powiązanie danych |
SetParameterValue() |
Interpolacja ciągów znaków | Parametry |
ExportToDisk() |
pdf.SaveAs() |
Zapisz plik |
ExportToStream() |
pdf.BinaryData |
Pobierz bajty |
PrintToPrinter() |
pdf.Print() |
Drukowanie |
Database.Tables |
Dostęp do danych w języku C# | Źródło danych |
FormulaFieldDefinitions |
Logika C# | Obliczenia |
SummaryInfo |
pdf.MetaData |
Metadane pliku PDF |
ExportFormatType.PortableDocFormat |
Domyślny wynik | PDF natywny |
Przykłady migracji kodu
Przykład 1: Konwersja HTML do PDF
Przed (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
Po (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
Ten przykład ilustruje fundamentalną różnicę paradygmatyczną.SAP Crystal Reportswymaga wstępnie zaprojektowanego szablonu pliku .rpt utworzonego w Crystal Reports Designer, następnie musisz skonfigurować ExportOptions, ExportDestinationType, ExportFormatType, oraz DiskFileDestinationOptions. Biblioteka nie obsługuje bezpośrednio treści HTML — dane należy powiązać z szablonem raportu.
IronPDF akceptuje bezpośrednio ciągi HTML: utwórz ChromePdfRenderer, wywołaj RenderHtmlAsPdf() z jakąkolwiek zawartością HTML i SaveAs(). Nie jest wymagany projektant, nie ma szablonów binarnych ani skomplikowanej konfiguracji eksportu. Kompleksowe przykłady można znaleźć w dokumentacji dotyczącej konwersji HTML do PDF.
Przykład 2: Konwersja adresów URL do formatu PDF
Przed (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
Po (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
SAP Crystal Reports nie może bezpośrednio konwertować adresów URL do formatu PDF. Musisz ręcznie pobrać zawartość HTML za pomocą WebClient, a następnie w jakiś sposób wyodrębnić i powiązać te dane z wstępnie zaprojektowanym szablonem .rpt - proces ten nie jest prosty i wymaga znacznej pracy ręcznej.
Metoda RenderUrlAsPdf()IronPDF przechwytuje w pełni renderowaną stronę internetową ze wszystkimi CSS,JavaScripti obrazami w jednym wywołaniu. Dowiedz się więcej z naszych samouczków.
Przykład 3: Nagłówki i stopki z numerami stron
Przed (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
Po (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
SAP Crystal Reports wymaga konfiguracji nagłówków i stopek w czasie projektowania. Musisz je zaprojektować w pliku .rpt używając Crystal Reports Designer, a następnie przekazać wartości parametrów, takich jak "HeaderText" oraz "FooterText" podczas działania programu. Numery stron muszą być skonfigurowane przez pola formuły w projektancie.
IronPDF zapewnia programową konfigurację nagłówka/stopki za pomocą właściwości TextHeader oraz TextFooter. Ustaw CenterText, LeftText, RightText i FontSize bezpośrednio w kodzie. Numery stron używają zastępczych {page} i {total-pages} - nie jest wymagany projektant.
Typowe problemy związane z migracją
Problem 1: Konwersja plików .rpt
SAP Crystal Reports: Pliki binarne .rpt z osadzonym układem, danymi i formułami.
Rozwiązanie: Nie można dokonać bezpośredniej konwersji — należy odtworzyć jako HTML:
- Otwórz plik .rpt w programie Crystal Reports Designer
- Układ dokumentu, czcionki, kolory
- Zwróć uwagę na wszystkie pola formuł
- Odtwórz w HTML/CSS
- Przekonwertuj formuły na kod C#
Problem 2: Połączenia z bazą danych
SAP Crystal Reports: Wbudowane ciągi połączeń i ODBC.
Rozwiązanie: Użyj warstwy danych twojej aplikacji:
// 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)
Problem 3: Zależności runtime
SAP Crystal Reports: Wymaga instalacji runtime Crystal Reports (500MB+).
Rozwiązanie:IronPDF jest samodzielne do wдиндека:
# 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
Problem 4: 32-bit/64-bit i przypięcie do .NET Framework
SAP Crystal Reports: Runtime Crystal Reports jest zależny od COM i jest dostarczany w oddzielnych MSI 32-bitowych i 64-bitowych. SAP potwierdził, że 32-bitowy CR .NET runtime jest zakończony po SP 39 (grudzień 2025); przyszłe pakiety serwisowe są tylko 64-bitowe. Runtime celuje w.NET Framework 4.xi nie może być ładowany pod .NET Core / .NET 5+.
Rozwiązanie:IronPDF działa na .NET Framework 4.6.2+, .NET 6, .NET 8 i .NET 9 — w tym Linux i Docker. Nie wymaga specjalnej konfiguracji dla 64-bitowego lub AnyCPU.
Nowe możliwości po migracji
Po migracji do IronPDF uzyskasz możliwości, którychSAP Crystal Reportsnie zapewnia:
Łączenie plików PDF
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")
Zabezpieczenia plików 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")
Podpisy cyfrowe
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)
Znaki wodne
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>")
Podsumowanie porównania funkcji
| Funkcja | SAP Crystal Reports | IronPDF | |||
|---|---|---|---|---|---|
| :Installation: | Dystrybucja Runtime | Redystrybucyjny MSI | NuGet | ||
| Metoda instalacji | MSI + rozszerzenie Visual Studio | NuGet | |||
| Wdrożenie | Uruchom MSI na maszynie docelowej | xcopy / publikacja | |||
| :Wsparcie platformy: | .NET Framework 4.x | Tak | Tak (4.6.2+) | ||
| .NET Core / .NET 5+ | Nieobsługiwane | Tak (.NET 6/8/9) | |||
| 64-bitowe natywne | Tak (32-bit kończy się po SP 39, grudzień 2025) | Tak | |||
| Linux / Docker | Nieobsługiwane (tylko Windows) | Tak | |||
| Azure / AWS | Tylko maszyny wirtualne Windows | Proste | |||
| :Rozwój: | Projektant raportów | Wymagane | Opcjonalnie (HTML) | ||
| Format szablonu | .rpt (binarny) | HTML/CSS | |||
| Krzywa uczenia się | Składnia Crystal | Standardy internetowe | |||
| IntelliSense | Nie | Pełny C# | |||
| :Rendering: | HTML do PDF | Nie | Pełny Chromium | ||
| URL do pliku PDF | Nie | Tak | |||
| Obsługa CSS | Nie | Pełny CSS3 | |||
| JavaScript | Nie | Pełna wersja ES2024 | |||
| :Funkcje PDF: | Łączenie plików PDF | Nie | Tak | ||
| Podział plików PDF | Nie | Tak | |||
| Znaki wodne | Ograniczone | Pełny kod HTML | |||
| Podpisy cyfrowe | Nie | Tak | |||
| PDF/A | Nie | Tak |
Lista kontrolna migracji
Przed migracją
- Inwentaryzuj wszystkie pliki
.rpt - Zrób zrzut ekranu układu każdego raportu jako odniesienie
- Udokumentuj pola formuł i obliczenia
- Wymień wszystkie źródła danych i parametry
- Określ wymagania dotyczące drukowania
- Uzyskaj klucz licencyjny IronPDF ze strony ironpdf.com
Aktualizacje kodu
- Usuń pakiety Crystal Reports (
CrystalDecisions.CrystalReports.Engine, itp.) - Usuń instalację czasu wykonania z wdrożenia
- Zainstaluj pakietNuGet
IronPdf - Przekształć układy
.rptna szablony HTML/CSS - Przekształć formuły Crystal na kod C#
- Zaktualizuj powiązanie danych z
SetDataSource()do interpolacji ciągów HTML - Zaktualizuj kod drukowania z
PrintToPrinter()dopdf.Print() - Dodaj inicjalizację licencji podczas uruchamiania aplikacji
Infrastruktura
- Usuń Crystal Runtime z serwerów
- Aktualizacja skryptów wdrażania
- Usuń tryb kompatybilności 32-bitowy
- Zaktualizuj obrazy Docker (jeśli dotyczy)
Testowanie
- Porównaj wyjście PDF z oryginalnymi raportami
- Zweryfikuj wszystkie obliczenia
- Przetestuj wszystkie parametry
- Funkcja drukowania testowego
- Testy wydajności
- Testowanie 64-bitowe

