How to Migrate from SAP Crystal Reports to IronPDF in C#
Migrating from SAP Crystal Reports to IronPDF transforms your reporting workflow from a runtime MSI redistributable with COM-era dependencies to a modern NuGet package. This guide provides a step-by-step migration path that removes the runtime installer requirement, lifts SAP ecosystem lock-in, and unlocks .NET 6/8/9 and Linux/Docker targets that Crystal Reports for Visual Studio (CR4VS) does not support.
Why Migrate from SAP Crystal Reports to IronPDF
Understanding SAP Crystal Reports
SAP Crystal Reports is an enterprise reporting platform widely used for generating "pixel-perfect" reports, with broad data source connectivity and a long-standing designer ecosystem. The Crystal Reports Designer remains a productive tool for building complex report layouts within the SAP stack.
However, the runtime's COM-era architecture and Windows/.NET Framework-only footprint create friction for teams targeting .NET 6/8/9, Linux, or container-first deployments.
Key Reasons to Migrate
- Runtime MSI Redistributable: Crystal Reports Runtime ships as an MSI installer (typically tens to a few hundred MB depending on 32/64-bit and locale) rather than a NuGet package
- SAP Ecosystem Lock-in: Tied to SAP's release cycles and product roadmap; SAP has confirmed end of mainstream maintenance for CR4VS at end of 2027
- Licensing: CR4VS itself is free to download and the runtime is free to redistribute, but the Crystal Reports designer family (CR 2020 / CR 2025) and BI Platform are commercial SAP SKUs
- Legacy Architecture: COM-dependent runtime DLLs target .NET Framework 4.x and cannot be loaded under .NET Core / .NET 5+
- No .NET Core / .NET 5+ Support: There is no roadmap for a Crystal Reports runtime targeting modern .NET; projects remain pinned to .NET Framework 4.x
- 32-bit Runtime Discontinued: SAP has confirmed the 32-bit CR .NET runtime is discontinued after SP 39 (December 2025); future service packs are 64-bit only
- Report Designer Dependency: Requires the CR4VS Visual Studio extension or a standalone Crystal Reports designer to author
.rptfiles
The Hidden Costs of SAP Crystal Reports
| Cost Factor | SAP Crystal Reports | IronPDF |
|---|---|---|
| Runtime Distribution | MSI redistributable installer | NuGet package |
| Installation | Runtime installer + VS extension | dotnet add package IronPdf |
| Deployment | Run MSI on target machine | xcopy / publish |
| 64-bit Support | Yes (32-bit runtime ends after SP 39, Dec 2025) | Native |
| .NET Core / .NET 5+ | Not supported (Framework 4.x only) | Full support (.NET 6/8/9, Framework 4.6.2+) |
| Cloud Deployment | Windows VMs only | Simple |
| Linux / Docker | Not supported (Windows-only) | Supported |
SAP Crystal Reports vs IronPDF Comparison
| Feature | SAP Crystal Reports | IronPDF |
|---|---|---|
| Primary Functionality | Enterprise reporting platform | HTML-to-PDF conversion engine and PDF manipulation |
| Integration | Best within SAP ecosystem | Modern .NET integration, lightweight NuGet package |
| Ease of Use | Complex setup and deployment | Simplified integration, supports .NET developers |
| Report Designer | Required | Optional (HTML/CSS) |
| Template Format | .rpt (binary) | HTML/CSS |
| HTML to PDF | No | Full Chromium |
| URL to PDF | No | Yes |
| CSS Support | No | Full CSS3 |
| JavaScript | No | Full ES2024 |
| PDF Manipulation | No | Full (merge, split, edit) |
| Digital Signatures | No | Yes |
| PDF/A Compliance | No | Yes |
| Modern Relevance | Declining, replaced by modern alternatives | Modern, well-integrated with contemporary technologies |
For teams targeting modern .NET (6, 8, 9) and cross-platform deployment, IronPDF provides native support that the Crystal Reports runtime — pinned to .NET Framework 4.x — cannot offer.
Before You Start
Prerequisites
- .NET Environment: .NET Framework 4.6.2+ or .NET 6 / 8 / 9
- NuGet Access: Ability to install NuGet packages
- IronPDF License: Obtain your license key from ironpdf.com
NuGet Package Changes
# 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
# NuGet wrappers 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 community NuGet wrapper, 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
# NuGet wrappers 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 community NuGet wrapper, 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
License Configuration
// 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"
Complete API Reference
Namespace Changes
// 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
Core API Mappings
| SAP Crystal Reports | IronPDF | Notes |
|---|---|---|
ReportDocument |
ChromePdfRenderer |
Core rendering |
ReportDocument.Load() |
RenderHtmlAsPdf() |
Load content |
.rpt files |
HTML/CSS templates | Template format |
SetDataSource() |
HTML with data | Data binding |
SetParameterValue() |
String interpolation | Parameters |
ExportToDisk() |
pdf.SaveAs() |
Save file |
ExportToStream() |
pdf.BinaryData |
Get bytes |
PrintToPrinter() |
pdf.Print() |
Printing |
Database.Tables |
C# data access | Data source |
FormulaFieldDefinitions |
C# logic | Calculations |
SummaryInfo |
pdf.MetaData |
PDF metadata |
ExportFormatType.PortableDocFormat |
Default output | PDF native |
Code Migration Examples
Example 1: HTML to PDF Conversion
Before (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
After (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
This example demonstrates the fundamental paradigm difference. SAP Crystal Reports requires a pre-designed .rpt file template created in the Crystal Reports Designer, then you must configure ExportOptions, ExportDestinationType, ExportFormatType, and DiskFileDestinationOptions. The library doesn't directly support HTML content—you must bind data to the report template.
IronPDF accepts HTML strings directly: create a ChromePdfRenderer, call RenderHtmlAsPdf() with any HTML content, and SaveAs(). No designer required, no binary templates, no complex export configuration. See the HTML to PDF documentation for comprehensive examples.
Example 2: URL to PDF Conversion
Before (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
After (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 cannot directly convert URLs to PDF. You would need to download the HTML content manually with WebClient, then somehow extract and bind that data to a pre-designed .rpt template—a process that's not straightforward and requires significant manual work.
IronPDF's RenderUrlAsPdf() method captures the fully rendered webpage with all CSS, JavaScript, and images in a single call. Learn more in our tutorials.
Example 3: Headers and Footers with Page Numbers
Before (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
After (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 requires design-time configuration for headers and footers. You must design them in the .rpt file using the Crystal Reports Designer, then pass parameter values like "HeaderText" and "FooterText" at runtime. Page numbers must be configured through formula fields in the designer.
IronPDF provides programmatic header/footer configuration with TextHeader and TextFooter properties. Set CenterText, LeftText, RightText, and FontSize directly in code. Page numbers use the {page} and {total-pages} placeholders—no designer required.
Common Migration Issues
Issue 1: .rpt File Conversion
SAP Crystal Reports: Binary .rpt files with embedded layout, data, formulas.
Solution: Cannot directly convert—must recreate as HTML:
- Open .rpt in Crystal Reports designer
- Document layout, fonts, colors
- Note all formula fields
- Recreate in HTML/CSS
- Convert formulas to C# code
Issue 2: Database Connections
SAP Crystal Reports: Embedded connection strings and ODBC.
Solution: Use your application's data layer:
// 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)
Issue 3: Runtime Dependencies
SAP Crystal Reports: Requires Crystal Reports Runtime installation (500MB+).
Solution: IronPDF is self-contained:
# Just add the NuGet package
dotnet add package IronPdf
# That's it - no additional installs needed
# Just add the NuGet package
dotnet add package IronPdf
# That's it - no additional installs needed
Issue 4: 32-bit/64-bit and .NET Framework Lock-in
SAP Crystal Reports: The Crystal Reports runtime is COM-dependent and ships in separate 32-bit and 64-bit MSIs. SAP has confirmed the 32-bit CR .NET runtime is discontinued after SP 39 (December 2025); future service packs are 64-bit only. The runtime targets .NET Framework 4.x and cannot be loaded under .NET Core / .NET 5+.
Solution: IronPDF runs on .NET Framework 4.6.2+, .NET 6, .NET 8, and .NET 9 — including Linux and Docker. No special configuration is required for 64-bit or AnyCPU.
New Capabilities After Migration
After migrating to IronPDF, you gain capabilities that SAP Crystal Reports cannot provide:
PDF Merging
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")
PDF Security
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")
Digital Signatures
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)
Watermarks
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>")
Feature Comparison Summary
| Feature | SAP Crystal Reports | IronPDF | |||
|---|---|---|---|---|---|
| :Installation: | Runtime Distribution | MSI redistributable | NuGet | ||
| Installation Method | MSI + Visual Studio extension | NuGet | |||
| Deployment | Run MSI on target machine | xcopy / publish | |||
| :Platform Support: | .NET Framework 4.x | Yes | Yes (4.6.2+) | ||
| .NET Core / .NET 5+ | Not supported | Yes (.NET 6/8/9) | |||
| 64-bit Native | Yes (32-bit ends after SP 39, Dec 2025) | Yes | |||
| Linux / Docker | Not supported (Windows-only) | Yes | |||
| Azure / AWS | Windows VMs only | Simple | |||
| :Development: | Report Designer | Required | Optional (HTML) | ||
| Template Format | .rpt (binary) | HTML/CSS | |||
| Learning Curve | Crystal syntax | Web standards | |||
| IntelliSense | No | Full C# | |||
| :Rendering: | HTML to PDF | No | Full Chromium | ||
| URL to PDF | No | Yes | |||
| CSS Support | No | Full CSS3 | |||
| JavaScript | No | Full ES2024 | |||
| :PDF Features: | Merge PDFs | No | Yes | ||
| Split PDFs | No | Yes | |||
| Watermarks | Limited | Full HTML | |||
| Digital Signatures | No | Yes | |||
| PDF/A | No | Yes |
Migration Checklist
Pre-Migration
- Inventory all
.rptfiles - Screenshot each report layout for reference
- Document formula fields and calculations
- List all data sources and parameters
- Identify printing requirements
- Obtain IronPDF license key from ironpdf.com
Code Updates
- Remove Crystal Reports packages (
CrystalDecisions.CrystalReports.Engine, etc.) - Remove runtime installation from deployment
- Install
IronPdfNuGet package - Convert
.rptlayouts to HTML/CSS templates - Convert Crystal formulas to C# code
- Update data binding from
SetDataSource()to HTML string interpolation - Update printing code from
PrintToPrinter()topdf.Print() - Add license initialization at application startup
Infrastructure
- Remove Crystal Runtime from servers
- Update deployment scripts
- Remove 32-bit compatibility mode
- Update Docker images (if applicable)
Testing
- Compare PDF output to original reports
- Verify all calculations
- Test all parameters
- Test printing functionality
- Performance testing
- 64-bit testing

