跳至页脚内容
迁移指南

如何用 C# 从 SAP Crystal Reports 迁移到 IronPDF

从SAP 水晶报表迁移到IronPDF可将您的报表工作流程从具有复杂部署要求的重量级传统平台转变为现代、轻量级的NuGet软件包。 本指南提供了一个完整的、循序渐进的迁移路径,消除了大量 500MB 以上的运行时安装,消除了 SAP 生态系统锁定,并实现了对 .NET Core/5/6/7/8+ 的全面支持。

为什么要从SAP 水晶报表迁移到 IronPDF.

了解 SAP Crystal Reports.

SAP Crystal Reports 作为生成动态和 "完美像素 "报表的工具,在企业领域脱颖而出。SAP 水晶报表以其连接多种数据源的能力而著称,一直是许多寻求综合报表功能的企业的首选解决方案。 该平台通过 Crystal Reports Designer 提供无与伦比的功能,该工具可简化复杂报表布局的构建。

然而,随着技术的发展,SAP Crystal Reports 对 SAP 框架的严重依赖及其苛刻的安装和部署要求也不容忽视。 重量级的性质意味着企业往往需要大量的资源和时间来全面实施和维护系统。

迁移的主要原因

1.安装过程庞大: Crystal Reports 运行时库大小超过 500MB,安装过程较为复杂。

  1. SAP生态系统锁定:受制于SAP的定价、支持周期和产品路线图 3.复杂的许可模式:采用 SAP 企业销售流程的按处理器/按用户许可模式 4.传统架构: 32 位 COM 依赖项使现代 64 位部署变得复杂 5.已弃用对 .NET Core 的支持:对现代 .NET 平台的支持有限 6.报表设计器依赖项:需要 Visual Studio 扩展或独立设计器 7.性能缓慢:运行时初始化耗时过长,内存占用过高。

SAP 水晶报表的隐藏成本

成本因素SAP 水晶报表IronPDF
运行时大小500MB+约20MB
安装复杂的 MSI/设置NuGet 软件包
部署特殊安装程序xcopy
64 位支持问题本地
.NET Core/5/6/7/8有限的全面支持
云部署难点简单的
Linux/Docker

SAP 水晶报表与IronPDF对比

特征SAP 水晶报表IronPDF
主要功能企业报告平台HTML 到 PDF 的转换引擎和 PDF 操作
集成SAP 生态系统内最佳现代 .NET 集成,轻量级NuGet包
易用性复杂的设置和部署简化集成,支持 .NET 开发人员
报表设计器要求可选项(HTML/CSS)
模板格式.rpt(二进制)HTML/CSS
HTML 到 PDF完整的 Chromium
URL 转 PDF
CSS支持完整的 CSS3
JavaScript语言完整的 ES2024
PDF 操作全文(合并、拆分、编辑)
数字签名
PDF/A合规性
现代相关性日渐式微,被现代替代品取代现代,与当代技术完美结合

对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队,IronPDF 可提供SAP 水晶报表无法提供的本地跨平台支持。


开始之前

前提条件

  1. .NET 环境:.NET Framework4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet 访问权限:能够安装NuGet包
  3. IronPDF 许可证:请从ironpdf.com获取您的许可证密钥。

NuGet软件包变更

# Remove Crystal Reports packages
dotnet remove package CrystalDecisions.CrystalReports.Engine
dotnet remove package CrystalDecisions.Shared
dotnet remove package CrystalDecisions.ReportAppServer
dotnet remove package CrystalDecisions.Web

# Remove legacy assemblies from project references
# Install IronPDF
dotnet add package IronPdf
# Remove Crystal Reports packages
dotnet remove package CrystalDecisions.CrystalReports.Engine
dotnet remove package CrystalDecisions.Shared
dotnet remove package CrystalDecisions.ReportAppServer
dotnet remove package CrystalDecisions.Web

# Remove legacy assemblies from project references
# Install IronPDF
dotnet add package IronPdf
SHELL

许可配置

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
$vbLabelText   $csharpLabel

完整的 API 参考

命名空间变更

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

核心 API 映射

SAP 水晶报表IronPDF备注
<代码>报告文档</代码<代码>ChromePdfRenderer</代码核心渲染
<代码>ReportDocument.Load()</代码<代码>RenderHtmlAsPdf()</代码加载内容
<代码>.rpt</代码>文件HTML/CSS 模板模板格式
<代码>SetDataSource()</代码带数据的 HTML数据绑定
<代码>SetParameterValue()</代码字符串插值参数
<代码>ExportToDisk()</代码<代码>pdf.SaveAs()</代码保存文件
<代码>ExportToStream()</代码<代码>pdf.BinaryData</代码获取字节
<代码>PrintToPrinter()</代码<代码>pdf.Print()</代码印刷
<代码>数据库表</代码C# 数据访问数据源
<代码>公式字段定义</代码C# 逻辑计算
<代码>摘要信息</代码<代码>pdf.MetaData</代码PDF 元数据
<代码>ExportFormatType.PortableDocFormat</代码默认输出PDF 本地

代码迁移示例

示例 1:HTML 到 PDF 的转换

之前(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();
    }
}
$vbLabelText   $csharpLabel

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

这个例子展示了基本范式的差异。SAP 水晶报表要求在 Crystal Reports Designer 中创建一个预先设计的 .rpt 文件模板,然后您必须配置 ExportOptions, ExportDestinationType, ExportFormatTypeDiskFileDestinationOptions. 该库不直接支持 HTML 内容,您必须将数据绑定到报告模板。

IronPDF 可直接接受 HTML 字符串:创建 ChromePdfRenderer, 使用任何 HTML 内容调用 RenderHtmlAsPdf(), 以及 SaveAs(). 无需设计人员,无需二进制模板,无需复杂的导出配置。 请参阅 HTML 转 PDF 文档,了解全面的示例。

示例 2:URL 到 PDF 的转换

之前(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();
    }
}
$vbLabelText   $csharpLabel

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

SAP Crystal Reports 无法直接将 URL 转换为 PDF。 您需要使用 WebClient 手动下载 HTML 内容,然后以某种方式将数据提取并绑定到预先设计好的 .rpt 模板中--这个过程并不简单,需要大量的手动工作。

IronPDF 的 RenderUrlAsPdf() 方法可在一次调用中捕获包含所有 CSS、JavaScript 和图像的完整渲染网页。 在我们的教程中了解更多信息。

示例 3:带页码的页眉和页脚

之前(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();
    }
}
$vbLabelText   $csharpLabel

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

SAP Crystal Reports 需要在设计时对页眉和页脚进行配置。 您必须使用 Crystal Reports Designer 在 .rpt 文件中设计这些报表,然后在运行时传递参数值,如 "HeaderText""FooterText" 。页码必须通过设计器中的公式字段进行配置。

IronPdf 通过 TextHeaderTextFooter 属性提供编程式页眉/页脚配置。 直接在代码中设置 CenterText, LeftText, RightTextFontSize. 页码使用 {page}{total-pages} 占位符--无需设计者。


常见迁移问题

问题 1:.rpt 文件转换

SAP Crystal Reports: 具有嵌入式布局、数据和公式的二进制 .rpt 文件。

解决方案:无法直接转换,必须重新创建 HTML: 1.在 Crystal Reports 设计器中打开 .rpt 2.文档布局、字体、颜色 3.注意所有公式字段 4.在HTML/CSS中重新创建 5.将公式转换为 C# 代码

问题 2:数据库连接

SAP Crystal Reports: 嵌入式连接字符串和 ODBC。

解决方案:使用您应用程序的数据层:

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

问题 3:运行时依赖性

SAP Crystal Reports: 需要安装 Crystal Reports Runtime(500MB 以上)。

解决方案:IronPDF是独立的:

# 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

第 4 期:32 位/64 位问题

SAP Crystal Reports: COM 依赖关系通常需要 32 位模式。

解决方案:IronPDF是原生 64 位,无需特殊配置。


迁移后的新功能

迁移到IronPDF后,您将获得SAP 水晶报表无法提供的功能:

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

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

数字签名

var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
$vbLabelText   $csharpLabel

水印

pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
$vbLabelText   $csharpLabel

功能对比摘要

特征SAP 水晶报表IronPDF
安装
运行时大小500MB+约20MB
安装方法MSI/Setup.exeNuGet
部署复杂xcopy
平台支持
.NET Framework
.NET Core/5/6/7/8有限的满的
64 位本地问题
Linux/Docker
Azure/AWS难点简单的
开发
报告设计器要求可选项(HTML)
模板格式.rpt(二进制)HTML/CSS
学习曲线水晶语法网络标准
IntelliSense完整的 C# 语言
渲染
HTML 至 PDF完整的 Chromium
URL 至 PDF
CSS 支持完整的 CSS3
JavaScript完整的 ES2024
PDF功能
合并 PDF
拆分 PDF
水印有限的完整的 HTML
数字签名
PDF/A

迁移清单

迁移前

  • 清点所有.rpt文件
  • 截取每份报告布局的屏幕截图以供参考
  • 文档公式字段和计算 列出所有数据源和参数
  • 确定打印要求
  • ironpdf.com获取IronPDF许可证密钥

代码更新

  • 删除 Crystal Reports 包( CrystalDecisions.CrystalReports.Engine等)
  • 从部署中移除运行时安装 安装IronPdfNuGet包
  • .rpt布局转换为HTML/CSS模板
  • 将 Crystal 公式转换为 C# 代码
  • 将数据绑定从SetDataSource()更新为 HTML 字符串插值
  • 将打印代码从PrintToPrinter()更新为pdf.Print()
  • 在应用程序启动时添加许可证初始化

基础设施

从服务器中移除 Crystal Runtime

  • 更新部署脚本
  • 移除 32 位兼容模式
  • 更新 Docker 镜像(如适用)

测试

  • 将 PDF 输出与原始报告进行比较
  • 核对所有计算结果。
  • 测试所有参数
  • 测试打印功能
  • 性能测试
  • 64 位测试

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。