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

C#에서 FastReport에서 IronPDF로 마이그레이션하는 방법

FastReport.NET은 .NET 생태계를 위해 만들어진 강력한 보고 솔루션으로, 복잡한 데이터 기반 보고서를 생성하기 위한 시각적 보고서 디자이너와 밴드 기반 아키텍처를 특징으로 합니다. 그러나 FastReport는 현대 PDF 생성 워크플로우에 상당한 도전을 제시합니다: 보고서 디자이너 의존도는 코드 우선 개발을 제한하고, DataBand, PageHeaderBand와 같은 밴드 기반 개념에 대한 급격한 학습 곡선을 유발하며, RegisterData() 보일러플레이트를 사용하는 복잡한 데이터 바인딩과 제한된 CSS 지원을 사용하고, 여러 설치가 필요한 분산된 NuGet 패키지를 필요로 합니다. 이 포괄적인 가이드는 FastReport에서 IronPDF로의 단계별 마이그레이션 경로를 제공합니다. IronPDF는 HTML/CSS 웹 기술을 활용하여 유연하고 프로그래밍 방식으로 문서를 생성할 수 있는 범용 PDF 라이브러리입니다.

FastReport에서 IronPDF로 마이그레이션 해야 하는 이유?

FastReport.NET의 보고서 전문화는 다양한 PDF 생성을 필요로 하는 개발 팀에게 마찰을 일으킵니다. 이러한 아키텍처 차이를 이해하는 것은 마이그레이션을 계획하는 데 필수적입니다.

FastReport의 도전 과제

  1. 보고서 디자이너 의존성: 복잡한 레이아웃을 생성하려면 시각적 디자이너나 .frx 파일 구조에 대한 깊은 지식이 필요합니다. 이는 코드 우선 개발 접근 방식에 적합하지 않습니다.

  2. 가파른 학습 곡선: FastReport의 밴드 기반 아키텍처(DataBand, PageHeaderBand, PageFooterBand)는 다른 기술로 전환되지 않는 보고서 전용 개념을 이해해야 합니다.

  3. 제한된 CSS 지원: 웹 표준 스타일링은 기본적으로 지원되지 않으며, 스타일링은 익숙한 CSS 대신 FastReport의 독점 형식을 통해 이루어집니다.

  4. 복잡한 데이터 바인딩: RegisterData() 및 DataSource 연결은 간단한 PDF 생성 시나리오에도 상용구를 추가합니다.

  5. 단편화된 패키지: 전체 기능을 위해 여러 NuGet 패키지가 필요합니다(FastReport.OpenSource, FastReport.OpenSource.Export.PdfSimple 등). PDFSimpleExport는 OpenSource 에디션에서 페이지를 래스터화하므로, 출력된 PDF는 선택 가능한 텍스트가 아닌 텍스트 이미지로 구성됩니다.

  6. 라이선스 복잡성: OpenSource 에디션 (MIT)은 PDFSimpleExport를 통해 이미지 기반 PDF 대체를 제공합니다. 선택 가능한 텍스트 PDF 내보내기, 암호화, 디지털 서명, 그리고 PDF/A는 FastReport의 개인 NuGet 피드(https://nuget.fast-report.com/api/v3/index.json)에 게시된 상업용 FastReport.Net 패키지가 필요합니다. (nuget.org에는 게시되지 않음) nuget.org에 있는 것은 FastReport.Net.Demo(페이지 제한 및 워터마크 포함)입니다.

아키텍처 비교

측면 FastReport IronPDF
설계 접근 방식 시각적 디자이너 + .frx 파일 HTML/CSS (웹 기술)
학습 곡선 가파름 (밴드 기반 개념) 부드러움 (HTML/CSS 지식)
데이터 바인딩 RegisterData(), DataBand 문자열 보간, Razor, 템플릿
CSS 지원 제한적 전체 CSS3와 Flexbox/Grid 제공
패키지 모델 다중 패키지 단일 패키지 (모든 기능 포함)
렌더링 엔진 사용자 지정 보고 엔진; 오픈 소스 PDF 내보내기 래스터화 내장된 Chromium
PDF 조작 내보내기 중심 전체(병합, 분할, 보안, 양식)
최신 .NET .NET Framework 4.6.2+ / .NET 6+ .NET Framework 4.6.2+ / .NET 6/7/8/9+

주요 마이그레이션 혜택

  1. 웹 기술: 독점적인 밴드 기반 레이아웃 대신 익숙한 HTML/CSS를 사용하세요.
  2. 코드 우선 개발: 시각적 디자이너에 의존하지 않고 프로그래밍 방식으로 PDF를 생성하세요.
  3. 단일 패키지: 하나의 NuGet 패키지에 모든 PDF 기능이 포함되어 있습니다.
  4. 최신 렌더링: 픽셀 완벽한 CSS3 출력을 위한 최신 Chromium 엔진
  5. 전체 PDF 조작: 병합, 분할, 보안, 양식—단순한 내보내기에 그치지 않습니다.

이전 준비

필수 조건

환경이 다음 요구 사항을 충족하는지 확인하세요:

  • .NET Framework 4.6.2+ 또는 .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ 또는 VS Code와 C# 확장
  • NuGet 패키지 관리자 접근 -IronPDF라이선스 키 (ironpdf.com에서 무료 체험판 제공)

FastReport사용 감사

FastReport 참조 전체를 식별하기 위해 솔루션 디렉터리에서 이러한 명령어를 실행하세요:

# Find allFastReportreferences
grep -r "FastReport\|\.frx\|PDFExport\|PDFSimpleExport\|DataBand\|RegisterData" --include="*.cs" --include="*.csproj" .

# Check NuGet packages
dotnet list package | grep FastReport
# Find allFastReportreferences
grep -r "FastReport\|\.frx\|PDFExport\|PDFSimpleExport\|DataBand\|RegisterData" --include="*.cs" --include="*.csproj" .

# Check NuGet packages
dotnet list package | grep FastReport
SHELL

보고서 템플릿 문서화

마이그레이션 전에 모든 .frx 파일과 목적을 작성하십시오:

  • 보고서 이름 및 목적
  • 사용된 데이터 소스
  • 헤더/푸터 구성
  • 페이지 번호 요구사항
  • 특별한 포맷팅 또는 스타일링

패러다임 변화 이해

FastReport에서 IronPDF로 마이그레이션할 때 가장 중요한 변화는 근본적인 설계 접근 방식입니다. FastReport는 .frx 템플릿 파일과 DataBand, PageHeaderBand, RegisterData()와 같은 고유한 개념을 사용하는 밴드 기반 시각 디자인을 사용합니다. IronPDF는 대부분의 개발자가 이미 알고 있는 웹 기술인 HTML/CSS를 사용합니다.

이는FastReport밴드 구성을 HTML 템플릿으로 변환하고, RegisterData()를 문자열 보간 또는 Razor 템플릿을 통한 직접 데이터 바인딩으로 대체하며, PageHeaderBand/PageFooterBand를 HTML 기반의 헤더와 푸터로 변환한다는 의미입니다.

단계별 마이그레이션 프로세스

1단계: NuGet 패키지 업데이트

모든FastReport패키지를 제거하고 IronPDF를 설치하세요:

# Remove allFastReportpackages
dotnet remove package FastReport.OpenSource
dotnet remove package FastReport.OpenSource.Export.PdfSimple
dotnet remove package FastReport.OpenSource.Web
dotnet remove package FastReport.OpenSource.Data.MsSql

# Install IronPDF(includes all features)
dotnet add package IronPdf
# Remove allFastReportpackages
dotnet remove package FastReport.OpenSource
dotnet remove package FastReport.OpenSource.Export.PdfSimple
dotnet remove package FastReport.OpenSource.Web
dotnet remove package FastReport.OpenSource.Data.MsSql

# Install IronPDF(includes all features)
dotnet add package IronPdf
SHELL

2단계: 네임스페이스 참조 업데이트

FastReport 네임스페이스를 IronPDF로 대체하세요:

// Remove these
using FastReport;
using FastReport.Export.PdfSimple;
using System.IO;

// Add this
using IronPdf;
// Remove these
using FastReport;
using FastReport.Export.PdfSimple;
using System.IO;

// Add this
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

3단계: 라이선스 구성

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

완전한 API 마이그레이션 참조

핵심 클래스 매핑

FastReport 클래스 IronPDF 동등
Report ChromePdfRenderer
PDFExport ChromePdfRenderer + SecuritySettings
PDFSimpleExport ChromePdfRenderer
ReportPage HTML 또는
TextObject HTML

, ,

HTMLObject 직접 HTML 렌더링
PageHeaderBand HtmlHeaderFooter
PageFooterBand HtmlHeaderFooter

메서드 매핑

FastReport 메서드 IronPDF 동등
report.Load("template.frx") HTML 템플릿 파일 또는 문자열
report.RegisterData(data, "name") 문자열 보간 또는 Razor
report.Prepare() 해당 없음
report.Export(export, stream) pdf.SaveAs(path)

페이지 번호 자리 표시자 변환

FastReport와 IronPDF는 페이지 번호를 위한 다른 자리 표시자 구문을 사용합니다:

FastReport IronPDF
[Page] {page}
[TotalPages] {total-pages}

코드 마이그레이션 예제

HTML을 PDF로 변환

이 예시는 FastReport의 HTMLObject 접근 방식과 IronPDF의 직접 렌더링 간의 근본적인 차이를 설명합니다.

FastReport 구현:

// NuGet: Install-Package FastReport.OpenSource
//        Install-Package FastReport.OpenSource.Export.PdfSimple
using FastReport;
using FastReport.Export.PdfSimple;
using System.Drawing;
using System.IO;

class Program
{
    static void Main()
    {
        using (Report report = new Report())
        {
            //FastReportrenders nothing unless objects live on a band that lives on a ReportPage.
            ReportPage page = new ReportPage();
            report.Pages.Add(page);
            page.ReportTitle = new ReportTitleBand { Height = Units.Millimeters * 100 };

            // Create HTML object (FastReport class is HtmlObject)
            HtmlObject htmlObject = new HtmlObject();
            htmlObject.Bounds = new RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 100);
            htmlObject.Text = "<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>";
            page.ReportTitle.Objects.Add(htmlObject);

            report.Prepare();

            // PDFSimpleExport rasterizes each page — text is not selectable
            PDFSimpleExport pdfExport = new PDFSimpleExport();
            using (FileStream fs = new FileStream("output.pdf", FileMode.Create))
            {
                report.Export(pdfExport, fs);
            }
        }
    }
}
// NuGet: Install-Package FastReport.OpenSource
//        Install-Package FastReport.OpenSource.Export.PdfSimple
using FastReport;
using FastReport.Export.PdfSimple;
using System.Drawing;
using System.IO;

class Program
{
    static void Main()
    {
        using (Report report = new Report())
        {
            //FastReportrenders nothing unless objects live on a band that lives on a ReportPage.
            ReportPage page = new ReportPage();
            report.Pages.Add(page);
            page.ReportTitle = new ReportTitleBand { Height = Units.Millimeters * 100 };

            // Create HTML object (FastReport class is HtmlObject)
            HtmlObject htmlObject = new HtmlObject();
            htmlObject.Bounds = new RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 100);
            htmlObject.Text = "<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>";
            page.ReportTitle.Objects.Add(htmlObject);

            report.Prepare();

            // PDFSimpleExport rasterizes each page — text is not selectable
            PDFSimpleExport pdfExport = new PDFSimpleExport();
            using (FileStream fs = new FileStream("output.pdf", FileMode.Create))
            {
                report.Export(pdfExport, fs);
            }
        }
    }
}
Imports FastReport
Imports FastReport.Export.PdfSimple
Imports System.Drawing
Imports System.IO

Module Program
    Sub Main()
        Using report As New Report()
            ' FastReport renders nothing unless objects live on a band that lives on a ReportPage.
            Dim page As New ReportPage()
            report.Pages.Add(page)
            page.ReportTitle = New ReportTitleBand With {.Height = Units.Millimeters * 100}

            ' Create HTML object (FastReport class is HtmlObject)
            Dim htmlObject As New HtmlObject()
            htmlObject.Bounds = New RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 100)
            htmlObject.Text = "<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>"
            page.ReportTitle.Objects.Add(htmlObject)

            report.Prepare()

            ' PDFSimpleExport rasterizes each page — text is not selectable
            Dim pdfExport As New PDFSimpleExport()
            Using fs As New FileStream("output.pdf", FileMode.Create)
                report.Export(pdfExport, fs)
            End Using
        End Using
    End Sub
End Module
$vbLabelText   $csharpLabel

IronPDF 구현:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>");
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>");
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>")
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

FastReport는 Report 객체 생성, ReportPageReportTitleBand 부착, 명시적 경계를 가진 HtmlObject을 밴드에 배치, 보고서 준비, 스트림을 통한 내보내기가 필요합니다. PDFSimpleExport는 출력을 래스터화하므로, 생성된 PDF는 선택 가능한 텍스트가 아닌 텍스트 이미지로 구성됩니다. IronPDF는 직접 HTML 렌더링 및 선택 가능한 텍스트 출력을 통해 동일한 결과를 세 줄로 달성합니다. 더 많은 옵션을 보려면 HTML to PDF 문서를 참조하세요.

URL을 PDF로 변환

이 예시는 FastReport가 수동 HTML 다운로드를 요구하는 반면 IronPDF는 URL 렌더링을 기본적으로 처리하는 방식을 강조합니다.

FastReport 구현:

// NuGet: Install-Package FastReport.OpenSource
//        Install-Package FastReport.OpenSource.Export.PdfSimple
//FastReporthas no native URL-to-PDF. You must download the HTML yourself
// and feed it into HtmlObject — which handles only a limited HTML 4 subset,
// no JavaScript and no modern CSS.
using FastReport;
using FastReport.Export.PdfSimple;
using System.Drawing;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        // Download HTML content from URL
        string htmlContent;
        using (var client = new HttpClient())
        {
            htmlContent = await client.GetStringAsync("https://example.com");
        }

        using (Report report = new Report())
        {
            ReportPage page = new ReportPage();
            report.Pages.Add(page);
            page.ReportTitle = new ReportTitleBand { Height = Units.Millimeters * 250 };

            HtmlObject htmlObject = new HtmlObject();
            htmlObject.Bounds = new RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 250);
            htmlObject.Text = htmlContent;
            page.ReportTitle.Objects.Add(htmlObject);

            report.Prepare();

            PDFSimpleExport pdfExport = new PDFSimpleExport();
            using (FileStream fs = new FileStream("webpage.pdf", FileMode.Create))
            {
                report.Export(pdfExport, fs);
            }
        }
    }
}
// NuGet: Install-Package FastReport.OpenSource
//        Install-Package FastReport.OpenSource.Export.PdfSimple
//FastReporthas no native URL-to-PDF. You must download the HTML yourself
// and feed it into HtmlObject — which handles only a limited HTML 4 subset,
// no JavaScript and no modern CSS.
using FastReport;
using FastReport.Export.PdfSimple;
using System.Drawing;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        // Download HTML content from URL
        string htmlContent;
        using (var client = new HttpClient())
        {
            htmlContent = await client.GetStringAsync("https://example.com");
        }

        using (Report report = new Report())
        {
            ReportPage page = new ReportPage();
            report.Pages.Add(page);
            page.ReportTitle = new ReportTitleBand { Height = Units.Millimeters * 250 };

            HtmlObject htmlObject = new HtmlObject();
            htmlObject.Bounds = new RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 250);
            htmlObject.Text = htmlContent;
            page.ReportTitle.Objects.Add(htmlObject);

            report.Prepare();

            PDFSimpleExport pdfExport = new PDFSimpleExport();
            using (FileStream fs = new FileStream("webpage.pdf", FileMode.Create))
            {
                report.Export(pdfExport, fs);
            }
        }
    }
}
Imports FastReport
Imports FastReport.Export.PdfSimple
Imports System.Drawing
Imports System.IO
Imports System.Net.Http
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        ' Download HTML content from URL
        Dim htmlContent As String
        Using client As New HttpClient()
            htmlContent = Await client.GetStringAsync("https://example.com")
        End Using

        Using report As New Report()
            Dim page As New ReportPage()
            report.Pages.Add(page)
            page.ReportTitle = New ReportTitleBand With {.Height = Units.Millimeters * 250}

            Dim htmlObject As New HtmlObject()
            htmlObject.Bounds = New RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 250)
            htmlObject.Text = htmlContent
            page.ReportTitle.Objects.Add(htmlObject)

            report.Prepare()

            Dim pdfExport As New PDFSimpleExport()
            Using fs As New FileStream("webpage.pdf", FileMode.Create)
                report.Export(pdfExport, fs)
            End Using
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

IronPDF 구현:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
        pdf.SaveAs("webpage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

FastReport에는 기본 URL-to-PDF 기능이 없습니다 — HTML을 직접 HttpClient로 다운로드받아, 밴드에 있는 HtmlObject에 삽입한 후 내보냅니다. HtmlObject는 HTML 4의 제한된 하위 집합만 처리하며, JavaScript 실행 및 최신 CSS가 없고, PDFSimpleExport는 출력을 래스터화합니다. IronPDF의 RenderUrlAsPdf는 내장된 Chromium 엔진을 사용하여 전체 JavaScript 실행과 함께 실시간 웹페이지를 직접 렌더링합니다. 더 많은 옵션은 URL to PDF 문서를 참조하십시오.

페이지 번호가 있는 헤더 및 푸터

이 예시는 FastReport의 밴드 기반 시스템과 IronPDF의 HTML 기반 접근 방식 간의 복잡성 차이를 설명합니다.

FastReport 구현:

// NuGet: Install-Package FastReport.OpenSource
//        Install-Package FastReport.OpenSource.Export.PdfSimple
using FastReport;
using FastReport.Export.PdfSimple;
using System.Drawing;
using System.IO;

class Program
{
    static void Main()
    {
        using (Report report = new Report())
        {
            report.Load("template.frx");

            // Cast to ReportPage (Report.Pages can hold dialog pages too)
            ReportPage page = report.Pages[0] as ReportPage;

            // Page header — assigned to the band slot on the page
            page.PageHeader = new PageHeaderBand { Height = Units.Millimeters * 15 };
            TextObject headerText = new TextObject
            {
                Bounds = new RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 10),
                Text = "Document Header",
                HorzAlign = HorzAlign.Center
            };
            page.PageHeader.Objects.Add(headerText);

            // Page footer withFastReportpage tokens [Page] and [TotalPages]
            page.PageFooter = new PageFooterBand { Height = Units.Millimeters * 15 };
            TextObject footerText = new TextObject
            {
                Bounds = new RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 10),
                Text = "Page [Page] of [TotalPages]",
                HorzAlign = HorzAlign.Right
            };
            page.PageFooter.Objects.Add(footerText);

            report.Prepare();

            PDFSimpleExport pdfExport = new PDFSimpleExport();
            using (FileStream fs = new FileStream("report.pdf", FileMode.Create))
            {
                report.Export(pdfExport, fs);
            }
        }
    }
}
// NuGet: Install-Package FastReport.OpenSource
//        Install-Package FastReport.OpenSource.Export.PdfSimple
using FastReport;
using FastReport.Export.PdfSimple;
using System.Drawing;
using System.IO;

class Program
{
    static void Main()
    {
        using (Report report = new Report())
        {
            report.Load("template.frx");

            // Cast to ReportPage (Report.Pages can hold dialog pages too)
            ReportPage page = report.Pages[0] as ReportPage;

            // Page header — assigned to the band slot on the page
            page.PageHeader = new PageHeaderBand { Height = Units.Millimeters * 15 };
            TextObject headerText = new TextObject
            {
                Bounds = new RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 10),
                Text = "Document Header",
                HorzAlign = HorzAlign.Center
            };
            page.PageHeader.Objects.Add(headerText);

            // Page footer withFastReportpage tokens [Page] and [TotalPages]
            page.PageFooter = new PageFooterBand { Height = Units.Millimeters * 15 };
            TextObject footerText = new TextObject
            {
                Bounds = new RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 10),
                Text = "Page [Page] of [TotalPages]",
                HorzAlign = HorzAlign.Right
            };
            page.PageFooter.Objects.Add(footerText);

            report.Prepare();

            PDFSimpleExport pdfExport = new PDFSimpleExport();
            using (FileStream fs = new FileStream("report.pdf", FileMode.Create))
            {
                report.Export(pdfExport, fs);
            }
        }
    }
}
Imports FastReport
Imports FastReport.Export.PdfSimple
Imports System.Drawing
Imports System.IO

Module Program
    Sub Main()
        Using report As New Report()
            report.Load("template.frx")

            ' Cast to ReportPage (Report.Pages can hold dialog pages too)
            Dim page As ReportPage = TryCast(report.Pages(0), ReportPage)

            ' Page header — assigned to the band slot on the page
            page.PageHeader = New PageHeaderBand With {.Height = Units.Millimeters * 15}
            Dim headerText As New TextObject With {
                .Bounds = New RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 10),
                .Text = "Document Header",
                .HorzAlign = HorzAlign.Center
            }
            page.PageHeader.Objects.Add(headerText)

            ' Page footer with FastReport page tokens [Page] and [TotalPages]
            page.PageFooter = New PageFooterBand With {.Height = Units.Millimeters * 15}
            Dim footerText As New TextObject With {
                .Bounds = New RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 10),
                .Text = "Page [Page] of [TotalPages]",
                .HorzAlign = HorzAlign.Right
            }
            page.PageFooter.Objects.Add(footerText)

            report.Prepare()

            Dim pdfExport As New PDFSimpleExport()
            Using fs As New FileStream("report.pdf", FileMode.Create)
                report.Export(pdfExport, fs)
            End Using
        End Using
    End Sub
End Module
$vbLabelText   $csharpLabel

IronPDF 구현:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        // Configure header and footer
        renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
        {
            HtmlFragment = "<div style='text-align:center'>Document Header</div>"
        };

        renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
        {
            HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages}</div>"
        };

        var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Report Content</h1><p>This is the main content.</p></body></html>");
        pdf.SaveAs("report.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        // Configure header and footer
        renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
        {
            HtmlFragment = "<div style='text-align:center'>Document Header</div>"
        };

        renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
        {
            HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages}</div>"
        };

        var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Report Content</h1><p>This is the main content.</p></body></html>");
        pdf.SaveAs("report.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()

        ' Configure header and footer
        renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
            .HtmlFragment = "<div style='text-align:center'>Document Header</div>"
        }

        renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter() With {
            .HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages}</div>"
        }

        Dim pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Report Content</h1><p>This is the main content.</p></body></html>")
        pdf.SaveAs("report.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

FastReport는 템플릿 로딩, Pages[0]ReportPage로 캐스팅, 페이지의 PageHeader / PageFooter 슬롯에 헤더 및 푸터 밴드 인스턴스 할당, 그리고 각 밴드에 명시적 Bounds를 가진 TextObject 인스턴스 부착이 필요합니다. IronPDF는 간단한 HTML 조각과 함께 HtmlHeaderFooter를 사용합니다 — 전체 CSS로 헤더와 푸터를 스타일링할 수 있습니다. 페이지 번호 문법 변경 사항에 유의하십시오: [Page]{page}로, [TotalPages]{total-pages}로 변경됩니다. 더 많은 옵션은 헤더 및 푸터 문서를 참조하세요.

중요한 마이그레이션 노트

프레임워크(.frx) 템플릿 파일 없음

.frxFastReport템플릿은 IronPDF와 작동하지 않습니다. 레이아웃을 HTML/CSS 템플릿으로 변환하십시오:

//FastReport- loads .frx template
report.Load("report.frx");

//IronPDF- use HTML template
var html = File.ReadAllText("template.html");
var pdf = renderer.RenderHtmlAsPdf(html);
//FastReport- loads .frx template
report.Load("report.frx");

//IronPDF- use HTML template
var html = File.ReadAllText("template.html");
var pdf = renderer.RenderHtmlAsPdf(html);
' FastReport - loads .frx template
report.Load("report.frx")

' IronPDF - use HTML template
Dim html As String = File.ReadAllText("template.html")
Dim pdf = renderer.RenderHtmlAsPdf(html)
$vbLabelText   $csharpLabel

데이터 바인딩 변환

RegisterData()를 직접 HTML 생성으로 교체하십시오:

// FastReport
report.RegisterData(dataSet, "Data");
report.GetDataSource("Data").Enabled = true;

//IronPDF- use string interpolation or StringBuilder
var html = new StringBuilder();
foreach (var item in data)
{
    html.Append($"<tr><td>{item.Name}</td><td>{item.Value}</td></tr>");
}
var pdf = renderer.RenderHtmlAsPdf(html.ToString());
// FastReport
report.RegisterData(dataSet, "Data");
report.GetDataSource("Data").Enabled = true;

//IronPDF- use string interpolation or StringBuilder
var html = new StringBuilder();
foreach (var item in data)
{
    html.Append($"<tr><td>{item.Name}</td><td>{item.Value}</td></tr>");
}
var pdf = renderer.RenderHtmlAsPdf(html.ToString());
Imports System.Text

' FastReport
report.RegisterData(dataSet, "Data")
report.GetDataSource("Data").Enabled = True

' IronPDF - use string interpolation or StringBuilder
Dim html As New StringBuilder()
For Each item In data
    html.Append($"<tr><td>{item.Name}</td><td>{item.Value}</td></tr>")
Next
Dim pdf = renderer.RenderHtmlAsPdf(html.ToString())
$vbLabelText   $csharpLabel

보안 설정

//IronPDF security
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.UserPassword = "password";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
//IronPDF security
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.UserPassword = "password";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
'IronPDF security
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SecuritySettings.UserPassword = "password"
pdf.SecuritySettings.OwnerPassword = "ownerPassword"
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights
$vbLabelText   $csharpLabel

포괄적인 보안 옵션은 암호화 문서를 참조하십시오.

마이그레이션 후 점검 목록

코드 마이그레이션을 완료한 후, 다음을 확인하십시오:

  • 생성된 PDF의 시각적 비교
  • 헤더/푸터 및 페이지 번호 확인
  • 프로덕션 데이터 볼륨으로 테스트하십시오
  • 보안/암호화 기능을 검증하십시오
  • 성능 벤치마킹
  • 사용하지 않는 .frx 템플릿 파일 제거 -FastReport관련 코드를 삭제하십시오
  • 문서 업데이트

추가 리소스


FastReport에서 IronPDF로의 마이그레이션은 시각적 디자이너 의존성, 밴드 기반 학습 곡선 및 분열된 패키지 모델을 제거합니다. HTML/CSS 기반의 PDF 생성으로의 전환은 친숙한 웹 기술을 활용하면서 단일 패키지 내에서 병합, 분할, 보안 및 양식을 포함한 완벽한 PDF 조작 기능을 제공합니다.

참고해 주세요FastReport는 해당 소유자의 등록 상표입니다. 이 사이트는 Fast Reports와 연계되거나, 승인을 받거나, 후원을 받지 않았습니다. 모든 제품명, 로고 및 브랜드는 해당 소유자의 자산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.

Curtis Chau
기술 문서 작성자

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

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

아이언 서포트 팀

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