如何用 C# 从 SAP Crystal Reports 迁移到 IronPDF
从SAP 水晶报表迁移到 IronPDF:完整的 C# 迁移指南
从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 Runtime 超过 500MB,需要复杂的安装。 2.SAP 生态系统锁定:与 SAP 的定价、支持周期和产品路线图相关联 3.复杂许可:使用 SAP 企业销售流程的按处理器/按用户许可 4.传统架构:使现代 64 位部署复杂化的 32 位 COM 依赖关系 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 Framework 4.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
# Check for: CrystalDecisions.*.dll in 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
# Check for: CrystalDecisions.*.dll in project references
# Install IronPDF
dotnet add package IronPdf许可配置
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IRON VB CONVERTER ERROR developers@ironsoftware.com完整的 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;IRON VB CONVERTER ERROR developers@ironsoftware.com核心 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();
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (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!");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com这个例子展示了基本范式的差异。SAP 水晶报表要求在 Crystal Reports Designer 中创建一个预先设计的 .rpt 文件模板,然后您必须配置 ExportOptions, ExportDestinationType, ExportFormatType 和 DiskFileDestinationOptions. 该库不直接支持 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();
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (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!");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comSAP 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();
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (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!");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comSAP Crystal Reports 需要在设计时对页眉和页脚进行配置。 您必须使用 Crystal Reports Designer 在 .rpt 文件中设计这些报表,然后在运行时传递参数值,如 "HeaderText" 和 "FooterText" 。页码必须通过设计器中的公式字段进行配置。
IronPdf 通过 TextHeader 和 TextFooter 属性提供编程式页眉/页脚配置。 直接在代码中设置 CenterText, LeftText, RightText 和 FontSize. 页码使用 {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);IRON VB CONVERTER ERROR developers@ironsoftware.com问题 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第 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");IRON VB CONVERTER ERROR developers@ironsoftware.comPDF安全
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");IRON VB CONVERTER ERROR developers@ironsoftware.com数字签名
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);IRON VB CONVERTER ERROR developers@ironsoftware.com水印
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");IRON VB CONVERTER ERROR developers@ironsoftware.com功能对比摘要
| 特征 | SAP 水晶报表 | IronPDF |
|---|---|---|
| 安装 | ||
| 运行时大小 | 500MB+ | 约20MB |
| 安装方法 | MSI/Setup.exe | NuGet |
| 部署 | 复杂 | 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 位测试
结论
尽管SAP 水晶报表仍然是传统企业报表的强大平台,但由于其缺乏现代灵活性,对于充满活力、具有前瞻性思维的组织而言,它的吸引力往往会大打折扣。 该平台 500MB 以上的运行时、复杂的部署和有限的 .NET Core 支持造成了巨大的维护负担。
本次迁移的主要变化有 1.架构:重量级企业平台 → 轻量级NuGet软件包 2.大小:500MB+运行时 → ~20MB 3.模板:二进制 .rpt 文件 → HTML/CSS 4.设计人员:必填 Crystal Reports Designer → 可选(使用任何 HTML 编辑器) 5.数据绑定:SetDataSource() → C# 字符串插值 6.参数:SetParameterValue() → 标准 C# 变量 7.导出:复杂的 ExportOptions → 简单的 pdf.SaveAs() 8.页眉/页脚:设计时配置 → 运行时 TextHeader/TextFooter 9.页码:公式字段 → {page} 和 {total-pages} 占位符 10.平台:有限 .NET Core → 完全跨平台支持 11.新功能:PDF 合并、分割、安全性、数字签名、PDF/A
在SAP 水晶报表和IronPDF之间做出选择主要取决于组织的设置和未来的期望。 对于大量嵌入 SAP 生态系统、寻求全面报表功能的实体而言,SAP Crystal Reports 是无与伦比的。 与此同时,正在使用 .NET 开展网络驱动计划、寻找精简 PDF 转换引擎的组织机构会发现IronPDF具有令人难以置信的优势。






