푸터 콘텐츠로 바로가기
마이그레이션 가이드

SAP Crystal Reports에서 IronPDF로의 마이그레이션 방법 (C#)

SAP Crystal Reports에서 IronPDF로 마이그레이션하면 COM 시대의 종속성을 가진 런타임 MSI 재배포에서 현대적인NuGet패키지로 워크플로우가 변환됩니다. 이 가이드는 런타임 설치 프로그램 요구 사항을 제거하고 SAP 생태계 종속을 없애며 Crystal Reports for Visual Studio (CR4VS)가 지원하지 않는 .NET 6/8/9 및 Linux/Docker 타겟을 가능하게 하는 단계별 마이그레이션 경로를 제공합니다.

SAP Crystal Reports에서 IronPDF로 마이그레이션하는 이유

SAP Crystal Reports이해하기

SAP Crystal Reports는 '픽셀 완벽'한 보고서를 생성하기 위해 널리 사용되는 Enterprise 보고 플랫폼으로, 폭넓은 데이터 소스 연결성과 오랜 디자이너 생태계를 가지고 있습니다. Crystal Reports 디자이너는 SAP 스택 내에서 복잡한 보고서 레이아웃을 작성하는 생산적인 도구로 남아 있습니다.

그러나 런타임의 COM 시대 아키텍처와 Windows/.NET Framework 전용 발자국은 .NET 6/8/9, Linux, 또는 컨테이너 우선 배포를 목표로 하는 팀에게 마찰을 일으킵니다.

주요 마이그레이션 이유

  1. 런타임 MSI 재배포 가능: Crystal Reports 런타임은 MSI 설치 프로그램으로 제공됩니다 (일반적으로 32/64비트 및 지역에 따라 수십에서 몇백 메가바이트).NuGet패키지가 아닙니다.
  2. SAP 생태계 락인: SAP의 릴리스 주기와 제품 로드맵에 묶임; SAP는 CR4VS의 주류 유지 보수가 2027년 말에 종료될 것이라고 확인했습니다.
  3. 라이선싱: CR4VS 자체는 다운로드가 무료이고 런타임은 무료로 재배포할 수 있지만 Crystal Reports 디자이너 계열 (CR 2020 / CR 2025) 및 BI 플랫폼은 상업용 SAP SKU입니다.
  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. Report Designer 종속성: .rpt 파일을 작성하려면 CR4VS Visual Studio 확장 또는 독립형 Crystal Reports 디자이너가 필요합니다

SAP Crystal Reports의 숨겨진 비용

비용 요소 SAP Crystal Reports IronPDF
런타임 배포 MSI 재배포 가능 설치 프로그램 NuGet패키지
설치 런타임 설치 프로그램 + VS 확장 dotnet add package IronPdf
배포 대상 머신에서 MSI 실행 xcopy / 게시
64비트 지원 예 (SP 39 이후 32비트 런타임 종료, 2025년 12월) 내부 지원
.NET Core / .NET 5 이상 지원되지 않음 (Framework 4.x만) 전체 지원 (.NET 6/8/9, Framework 4.6.2+)
클라우드 배포 Windows VM 전용 간단함
리눅스/Docker 지원되지 않음 (Windows 전용) 지원됨

SAP Crystal ReportsvsIronPDF비교

기능 SAP Crystal Reports IronPDF
주요 기능 Enterprise 보고 플랫폼 HTML-to-PDF 변환 엔진 및 PDF 조작
통합 SAP 생태계 내에서 최적 현대적인 .NET 통합, 경량NuGet패키지
사용 용이성 복잡한 설정 및 배포 단순한 통합, .NET 개발자 지원
리포트 디자이너 필요함 선택적 (HTML/CSS)
템플릿 형식 .rpt (바이너리) HTML/CSS
HTML to 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
#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

라이선스 구성

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

이후 (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는 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();
    }
}
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

이후 (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

이후 (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는 헤더 및 푸터에 대한 디자인 시간 구성이 필요합니다. 이들을 Crystal Reports Designer에서 .rpt 파일로 설계한 후에 "HeaderText""FooterText"와 같은 매개변수 값을 런타임에 전달해야 합니다. 페이지 번호는 디자이너의 공식 필드를 통해 구성되어야 합니다.

IronPDF는 TextHeaderTextFooter 속성을 사용하여 프로그래밍적으로 헤더/푸터 구성을 제공합니다. 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);
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 런타임 설치 필요 (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비트 및 .NET Framework 종속성

SAP Crystal Reports: Crystal Reports 런타임은 COM에 의존하며 개별 32비트 및 64비트 MSI로 제공됩니다. SAP는 SP 39 (2025년 12월) 이후 32비트 CR .NET 런타임이 중단되었다고 확인했습니다; 향후 서비스 팩은 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 Crystal Reports가 제공할 수 없는 기능을 사용할 수 있습니다:

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 Crystal Reports 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비트 네이티브 예 (SP 39 이후 32비트 종료, 2025년 12월)
리눅스/Docker 지원되지 않음 (Windows 전용)
Azure / AWS Windows VM 전용 간단함
:개발: 보고서 디자이너 필요함 선택적 (HTML)
템플릿 포맷 .rpt (바이너리) HTML/CSS
학습 곡선 Crystal 구문 웹 표준
IntelliSense 아니요 전체 C# 지원
:렌더링: HTML to PDF 아니요 전체 Chromium
URL을 PDF로 변환 아니요
CSS 지원 아니요 전체 CSS3
JavaScript 아니요 전체 ES2024
:PDF 기능: PDF 병합 아니요
PDF 분할 아니요
워터마크 제한적 전체 HTML
디지털 서명 아니요
PDF/A 아니요

마이그레이션 체크리스트

사전 마이그레이션

  • 모든 .rpt 파일 인벤토리
  • 각 보고서 레이아웃을 스크린샷으로 캡처하여 참조하기
  • 수식 필드와 계산 문서화하기
  • 모든 데이터 소스와 매개변수 목록 작성하기
  • 인쇄 요구 사항 식별하기
  • ironpdf.com에서IronPDF라이선스 키 획득

코드 업데이트

  • Crystal Reports 패키지(CrystalDecisions.CrystalReports.Engine 등) 제거
  • 배포에서 런타임 설치 제거하기
  • IronPdfNuGetInstall-Package
  • .rpt 레이아웃을 HTML/CSS템플릿으로 변환
  • Crystal 수식을 C# 코드로 변환하기
  • 데이터 바인딩을 SetDataSource()에서 HTML 문자열 보간으로 업데이트
  • 프린팅 코드를 PrintToPrinter()에서 pdf.Print()로 업데이트
  • 애플리케이션 시작 시 라이선스 초기화 추가

인프라

  • 서버에서 Crystal Runtime 제거하기
  • 배포 스크립트 업데이트
  • 32비트 호환 모드 제거하기
  • Docker 이미지를 업데이트하기 (적용 가능한 경우)

테스트

  • PDF 출력을 원본 보고서와 비교하기
  • 모든 계산 검증하기
  • 모든 매개변수를 테스트하기
  • 인쇄 기능을 테스트하십시오
  • 성능 테스트
  • 64비트 테스트하기

참고해 주세요SAP Crystal Reports는 해당 소유자의 등록 상표입니다. 이 사이트는 SAP와 관련이 없으며, 승인되지 않으며, SAP에서 후원하는 것도 아닙니다. 모든 제품명, 로고 및 브랜드는 각각의 소유자의 재산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.

Curtis Chau
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해