Przejdź do treści stopki
PRZEWODNIKI MIGRACJI

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

  1. 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
  2. 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
  3. 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
  4. Architektura Dziedziczenia: Komponentowe DLL runtime zależne od COM celują w.NET Framework 4.xi nie mogą być ładowane pod .NET Core / .NET 5+
  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
  6. 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
  7. 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

  1. Srodowisko .NET: .NET Framework 4.6.2+ lub .NET 6 / 8 / 9
  2. Dostęp do NuGet: Możliwość instalowania pakietów NuGet
  3. 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
SHELL

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"
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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:

  1. Otwórz plik .rpt w programie Crystal Reports Designer
  2. Układ dokumentu, czcionki, kolory
  3. Zwróć uwagę na wszystkie pola formuł
  4. Odtwórz w HTML/CSS
  5. 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)
$vbLabelText   $csharpLabel

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
SHELL

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")
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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>")
$vbLabelText   $csharpLabel

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 pakietNuGetIronPdf
  • Przekształć układy .rpt na 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() do pdf.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

Zwróć uwagęSAP Crystal Reports to zarejestrowany znak towarowy jego właściciela. Ta strona nie jest powiązana, sponsorowana ani autoryzowana przez SAP. Wszystkie nazwy produktów, loga i marki są własnością ich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie