跳至页脚内容
视频

如何在ASPNET中将视图转换为PDF

从SAP Crystal Reports迁移到IronPDF将您的报告工作流从带有COM时代依赖的运行时MSI再发行转变为现代NuGet包。 本指南提供了逐步迁移路径,消除运行时安装器要求,摆脱SAP生态系统锁定,并释放Crystal Reports for Visual Studio (CR4VS)不支持的.NET 6/8/9和Linux/Docker目标。

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

了解 SAP Crystal Reports

SAP Crystal Reports是广泛使用的企业报告平台,用于生成"像素完美"的报告,具备广泛的数据源连接性和长期以来的设计师生态系统。 Crystal Reports Designer仍然是构建SAP堆栈中复杂报告布局的有效工具。

然而,运行时的COM时代架构和仅限于Windows/.NET Framework的覆盖范围对以.NET 6/8/9、Linux或容器优先部署为目标的团队构成障碍。

迁移的主要原因

  1. 运行时MSI再发行: Crystal Reports Runtime作为MSI安装程序发布(通常根据32/64位和语言环境而定为几十至几百MB),而不是NuGet包
  2. SAP生态系统锁定: 受制于SAP的发布周期和产品路线图;SAP已确认CR4VS的主流维护将在2027年底结束
  3. 许可: CR4VS本身是免费下载的,运行时可免费再分发,但Crystal Reports设计师系列(CR 2020 / CR 2025)和BI平台是商业SAP产品
  4. 遗留架构: 依赖于COM的运行时DLL目标.NET Framework 4.x,无法在.NET Core / .NET 5+下加载
  5. 不支持.NET Core / .NET 5+: 没有针对现代.NET的Crystal Reports运行时的路线图; 项目仍然固定在.NET Framework 4.x上
  6. 32位运行时已终止: SAP已确认32位CR .NET运行时在SP 39(2025年12月)后终止; 未来的服务包仅有64位
  7. 报表设计器依赖:需要 CR4VS Visual Studio 扩展或独立的 Crystal Reports 设计器来创建 .rpt 文件

SAP 水晶报表的隐藏成本

成本因素 SAP 水晶报表 IronPDF
运行时分发 MSI再发行安装程序 NuGet 软件包
安装 运行时安装程序+VS扩展 dotnet add package IronPdf
部署 在目标机器上运行MSI xcopy / 发布
64 位支持 是(32位运行时在SP 39后结束, 2025年12月) 本地
.NET Core / .NET 5+ 不支持(仅限于Framework 4.x) 完全支持(.NET 6/8/9,Framework 4.6.2+)
云部署 仅限Windows虚拟机 简单的
Linux / Docker 不支持(仅限于Windows) 支持

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合规性
现代相关性 日渐式微,被现代替代品取代 现代,与当代技术完美结合

对于目标是现代.NET(6,8,9)和跨平台部署的团队,IronPDF提供Crystal Reports运行时无法提供的原生支持——后者固定在.NET Framework 4.x上。


开始之前

前提条件

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

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
# 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
SHELL

许可配置

// 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

完整的 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;
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports CrystalDecisions.ReportAppServer

Imports IronPdf
$vbLabelText   $csharpLabel

核心 API 映射

SAP 水晶报表 IronPDF 备注
ReportDocument ChromePdfRenderer 核心渲染
ReportDocument.Load() RenderHtmlAsPdf() 加载内容
.rpt 文件 HTML/CSS 模板 模板格式
SetDataSource() 带数据的 HTML 数据绑定
SetParameterValue() 字符串插值 参数
ExportToDisk() pdf.SaveAs() 保存文件
ExportToStream() pdf.BinaryData 获取字节
PrintToPrinter() pdf.Print() 印刷
Database.Tables C# 数据访问 数据源
FormulaFieldDefinitions C# 逻辑 计算
SummaryInfo 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();
    }
}
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

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

这个例子展示了基本范式的差异。SAP 水晶报表需要在 Crystal Reports Designer 中预先设计的 .rpt 文件模板,然后您必须配置 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();
    }
}
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

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

SAP Crystal Reports 无法直接将 URL 转换为 PDF。 您需要手动下载 HTML 内容,使用 WebClient,然后以某种方式提取并将这些数据绑定到预先设计的 .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();
    }
}
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

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

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

IronPDF 提供了使用 TextHeaderTextFooter 属性进行编程的页眉/页脚配置。 直接在代码中设置 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);
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

问题 3:运行时依赖性

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

解决方案:IronPDF是独立的:

# 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
SHELL

问题4:32位/64位和.NET Framework锁定

SAP Crystal Reports: Crystal Reports运行时依赖于COM并以单独的32位和64位MSI发布。 SAP已确认32位CR .NET运行时在SP 39(2025年12月)后终止; 未来的服务包仅有64位。 运行时目标.NET Framework 4.x,无法在.NET Core / .NET 5+下加载。

解决方案: IronPDF运行在.NET Framework 4.6.2+、.NET 6、.NET 8和.NET 9上——包括Linux和Docker。 64位或AnyCPU无需特殊配置。


迁移后的新功能

迁移到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");
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

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

数字签名

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

水印

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

功能对比摘要

特征 SAP 水晶报表 IronPDF
安装 运行时分发 MSI再发行 NuGet
安装方法 MSI + Visual Studio扩展 NuGet
部署 在目标机器上运行MSI xcopy / 发布
平台支持 .NET Framework 4.x 是的(4.6.2+)
.NET Core / .NET 5+ 不支持 是(.NET 6/8/9)
64 位本地 是(32位在SP 39后停止, 2025年12月)
Linux / Docker 不支持(仅限于Windows)
Azure/AWS 仅限Windows虚拟机 简单的
发展 报告设计器 要求 可选项(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 Crystal Reports是其各自所有者的注册商标。 该网站与SAP无关、未被其推荐或赞助。所有产品名称、徽标和品牌均为其各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。

Curtis Chau
技术作家

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

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

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我