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

Haukcode.DinkToPdf에서 IronPDF로 마이그레이션

Haukcode.DinkToPdf는 한때 인기 있었던 DinkToPdf 라이브러리를 커뮤니티 포크하여 .NET 애플리케이션을 위한 HTML to PDF로 변환하는 wkhtmltopdf 바이너리를 래핑한 것입니다. 포크는 나중에 Haukcode.WkHtmlToPdfDotNet로 이름이 변경되었으며, 최신 릴리스 1.5.95는 2024년 10월 22일 LGPL-3.0-or-later로 배포되었습니다. 포크는 원래의 DinkToPdf(1.0.8, 2017년 4월 18일)이 버려진 후에도 NuGet에서 계속 패키지를 유지하고 있지만, 여전히 부모와 동일한 아카이브된 wkhtmltopdf 바이너리에 묶여 있습니다. wkhtmltopdf/wkhtmltopdf 리포지토리는 2023년 1월 2일에 아카이브되었고, 전체 wkhtmltopdf GitHub 조직은 2024년 7월 10일에 아카이브되어, 업스트림 문제는 패치되지 않을 것입니다.

이 가이드는 Haukcode.DinkToPdf / Haukcode.WkHtmlToPdfDotNet에서 IronPDF로의 마이그레이션 경로를 제공하며, 단계별 지침, 코드 비교 및 아카이브된 wkhtmltopdf 바이너리를 벗어나고자 하는 .NET 개발자를 위한 실제 예제를 포함하고 있습니다.

보안 권고: CVE-2022-35583

Haukcode.DinkToPdf는 업스트림 wkhtmltopdf 바이너리에 대해 제기된 보안 권고를 상속합니다:

CVE-2022-35583 — wkhtmltopdf 0.12.6에 대한 SSRF 권고

wkhtmltopdf 0.12.6에 대한 서버-사이드 요청 위조 권고가 게시되었습니다 (NVD의 CVSS 9.8; 라이브러리 버그가 아니라 애플리케이션 측 입력-정화 문제로 보는 상류 wkhtmltopdf 프로젝트에 의해 논쟁 중입니다). 어쨌든, 패치되지 않을 것입니다—업스트림은 보관되었습니다. 공개 논의에서 지적된 일반적인 노출 패턴에는 다음이 포함됩니다:

  • 공격 수단: 신뢰할 수 없는 HTML 콘텐츠가 변환 중에 렌더러가 내부 자원을 가져오게 할 수 있습니다
  • AWS 메타데이터: http://169.254.169.254에 대한 요청은 렌더러가 EC2에서 실행되는 경우 인스턴스 메타데이터를 반환할 수 있습니다.
  • 내부 네트워크 접근: 렌더링 호스트에서 내부 서비스에 접근할 수 있습니다
  • 로컬 파일 포함: 로컬 파일은 file:// 프로토콜을 통해 읽을 수 있습니다.

업스트림 패치는 예상되지 않습니다 — wkhtmltopdf 리포지토리는 2023년 1월 2일에 보관되었으며 마지막 릴리즈(0.12.6)는 2020년 6월입니다.

IronPDF vs Haukcode.DinkToPdf: 기능 비교

구조적 차이를 이해하면 기술 결정을 내리는데 이주 투자를 평가하는데 도움이 됩니다:

측면 Haukcode.DinkToPdf IronPDF
기본 엔진 wkhtmltopdf (QtWebKit 포크, 약 2015년) 최신 크로뮴
보안 상태 CVE-2022-35583 권고 (패치되지 않음 / 상류에서 논쟁 중) 알려진 중요한 CVE 없음
프로젝트 상태 커뮤니티 포크; 상류 wkhtmltopdf 보관됨 적극적으로 유지보수됨
HTML5/CSS3 최신 Flexbox/그리드 없음 전체 CSS3
JavaScript 제한적, 일관성 없음 전체 지원
네이티브 바이너리 플랫폼별 libwkhtmltox.dll/.so/.dylib 관리 NuGet 패키지
스레드 안전성 SynchronizedConverter는 호출을 직렬화합니다 설계상 스레드 안전
지원 Community 전문 지원
업데이트 포크 마지막 릴리즈 1.5.95 (2024년 10월 22일); 업스트림 wkhtmltopdf 0.12.6 (2020년 6월) 정기적인 릴리즈
라이선스 LGPL-3.0 이상 (포크) / MIT (원래 DinkToPdf) 체험판이 포함된 상업용

빠른 시작: Haukcode.DinkToPdf에서 IronPDF로 마이그레이션

이러한 기본 단계를 통해 즉시 이주를 시작할 수 있습니다.

1단계: DinkToPdf 및 네이티브 바이너리 제거

Haukcode.DinkToPdf NuGet 패키지 제거:

# Remove NuGet packages
dotnet remove package DinkToPdf
dotnet remove package Haukcode.DinkToPdf
dotnet remove package Haukcode.WkHtmlToPdf-DotNet
# Remove NuGet packages
dotnet remove package DinkToPdf
dotnet remove package Haukcode.DinkToPdf
dotnet remove package Haukcode.WkHtmlToPdf-DotNet
SHELL

프로젝트에서 네이티브 바이너리 삭제:

  • libwkhtmltox.dll (Windows)
  • libwkhtmltox.so (Linux)
  • libwkhtmltox.dylib (macOS)

2단계:IronPDF설치

# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
SHELL

3단계: 네임스페이스 업데이트

DinkToPdf 네임스페이스를 IronPDF로 대체:

// Before (Haukcode.DinkToPdf)
using DinkToPdf;
using DinkToPdf.Contracts;

// After (IronPDF)
using IronPdf;
using IronPdf.Rendering;  // For RenderingOptions
// Before (Haukcode.DinkToPdf)
using DinkToPdf;
using DinkToPdf.Contracts;

// After (IronPDF)
using IronPdf;
using IronPdf.Rendering;  // For RenderingOptions
Imports IronPdf
Imports IronPdf.Rendering
$vbLabelText   $csharpLabel

4단계: 라이센스 초기화

애플리케이션 시작 시 라이선스 초기화를 추가합니다:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

코드 마이그레이션 예제

기본 HTML을 PDF로 변환

가장 기본적인 작업은 이러한 .NET PDF 라이브러리 간의 복잡성 차이를 나타냅니다.

Haukcode.DinkToPdf 접근법:

// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());

        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4,
            },
            Objects = {
                new ObjectSettings() {
                    HtmlContent = "<html><body><h1>Hello World</h1></body></html>",
                }
            }
        };

        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());

        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4,
            },
            Objects = {
                new ObjectSettings() {
                    HtmlContent = "<html><body><h1>Hello World</h1></body></html>",
                }
            }
        };

        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
Imports DinkToPdf
Imports DinkToPdf.Contracts
Imports System.IO

Module Program
    Sub Main()
        Dim converter = New SynchronizedConverter(New PdfTools())

        Dim doc = New HtmlToPdfDocument() With {
            .GlobalSettings = New GlobalSettings() With {
                .ColorMode = ColorMode.Color,
                .Orientation = Orientation.Portrait,
                .PaperSize = PaperKind.A4
            },
            .Objects = New List(Of ObjectSettings) From {
                New ObjectSettings() With {
                    .HtmlContent = "<html><body><h1>Hello World</h1></body></html>"
                }
            }
        }

        Dim pdf As Byte() = converter.Convert(doc)
        File.WriteAllBytes("output.pdf", pdf)
    End Sub
End Module
$vbLabelText   $csharpLabel

IronPDF 접근법:

// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;

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

        var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>");

        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;

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

        var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>");

        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports System.IO

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

        Dim pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>")

        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Haukcode.DinkToPdf는 SynchronizedConverterPdfTools를 생성하고, 중첩된 GlobalSettingsObjectsHtmlToPdfDocument를 구성하며, HtmlContentObjectSettings를 추가하고, 원시 바이트를 얻기 위해 converter.Convert()를 호출하며, File.WriteAllBytes()를 수동으로 파일에 씁니다.

IronPDF는 이를 세 줄로 간단히 합니다: ChromePdfRenderer를 생성하고, RenderHtmlAsPdf()를 호출하고, 내장 SaveAs() 메서드를 사용합니다.

고급 HTML에서 PDF로의 시나리오는 HTML to PDF 변환 가이드를 참조하십시오.

URL을 PDF로 변환

URL을 PDF로 변환하는 것은 비슷한 패턴 차이를 보여줍니다.

Haukcode.DinkToPdf 접근법:

// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());

        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4,
            },
            Objects = {
                new ObjectSettings() {
                    Page = "https://www.example.com",
                }
            }
        };

        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());

        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4,
            },
            Objects = {
                new ObjectSettings() {
                    Page = "https://www.example.com",
                }
            }
        };

        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
Imports DinkToPdf
Imports DinkToPdf.Contracts
Imports System.IO

Module Program
    Sub Main()
        Dim converter = New SynchronizedConverter(New PdfTools())

        Dim doc = New HtmlToPdfDocument() With {
            .GlobalSettings = New GlobalSettings() With {
                .ColorMode = ColorMode.Color,
                .Orientation = Orientation.Portrait,
                .PaperSize = PaperKind.A4
            },
            .Objects = New List(Of ObjectSettings) From {
                New ObjectSettings() With {
                    .Page = "https://www.example.com"
                }
            }
        }

        Dim pdf As Byte() = converter.Convert(doc)
        File.WriteAllBytes("webpage.pdf", pdf)
    End Sub
End Module
$vbLabelText   $csharpLabel

IronPDF 접근법:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

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

        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");

        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

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

        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");

        pdf.SaveAs("webpage.pdf");
    }
}
Imports IronPdf
Imports System

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

        Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")

        pdf.SaveAs("webpage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Haukcode.DinkToPdf는 URL에 대해 ObjectSettings.Page와 같은 문서 구성 패턴을 사용합니다. IronPDF는 의도를 명확히 표현하는 전용 RenderUrlAsPdf() 메서드를 제공합니다.

URL to PDF 문서에서 인증 및 사용자 정의 헤더 옵션을 탐색하십시오.

사용자 정의 페이지 설정

방향, 용지 크기 및 여백을 구성하려면 다른 접근 방식을 사용해야 합니다.

Haukcode.DinkToPdf 접근법:

// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());

        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Landscape,
                PaperSize = PaperKind.Letter,
                Margins = new MarginSettings() { Top = 10, Bottom = 10, Left = 10, Right = 10 }
            },
            Objects = {
                new ObjectSettings() {
                    HtmlContent = "<html><body><h1>Landscape Document</h1><p>Custom page settings</p></body></html>",
                }
            }
        };

        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("landscape.pdf", pdf);
    }
}
// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());

        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Landscape,
                PaperSize = PaperKind.Letter,
                Margins = new MarginSettings() { Top = 10, Bottom = 10, Left = 10, Right = 10 }
            },
            Objects = {
                new ObjectSettings() {
                    HtmlContent = "<html><body><h1>Landscape Document</h1><p>Custom page settings</p></body></html>",
                }
            }
        };

        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("landscape.pdf", pdf);
    }
}
Imports DinkToPdf
Imports DinkToPdf.Contracts
Imports System.IO

Module Program
    Sub Main()
        Dim converter = New SynchronizedConverter(New PdfTools())

        Dim doc = New HtmlToPdfDocument() With {
            .GlobalSettings = New GlobalSettings() With {
                .ColorMode = ColorMode.Color,
                .Orientation = Orientation.Landscape,
                .PaperSize = PaperKind.Letter,
                .Margins = New MarginSettings() With {.Top = 10, .Bottom = 10, .Left = 10, .Right = 10}
            },
            .Objects = {
                New ObjectSettings() With {
                    .HtmlContent = "<html><body><h1>Landscape Document</h1><p>Custom page settings</p></body></html>"
                }
            }
        }

        Dim pdf As Byte() = converter.Convert(doc)
        File.WriteAllBytes("landscape.pdf", pdf)
    End Sub
End Module
$vbLabelText   $csharpLabel

IronPDF 접근법:

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

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

        renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;

        var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Landscape Document</h1><p>Custom page settings</p></body></html>");

        pdf.SaveAs("landscape.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

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

        renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;

        var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Landscape Document</h1><p>Custom page settings</p></body></html>");

        pdf.SaveAs("landscape.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering

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

        renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
        renderer.RenderingOptions.MarginTop = 10
        renderer.RenderingOptions.MarginBottom = 10
        renderer.RenderingOptions.MarginLeft = 10
        renderer.RenderingOptions.MarginRight = 10

        Dim pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Landscape Document</h1><p>Custom page settings</p></body></html>")

        pdf.SaveAs("landscape.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Haukcode.DinkToPdf는 별도의 MarginSettings 객체로 GlobalSettings 내에 설정을 중첩합니다. IronPDF는 RenderingOptions와 같은 직관적인 이름의 직접적인 속성을 제공합니다, PaperOrientation, 그리고 개별 여백 속성.

Haukcode.DinkToPdf API부터IronPDF매핑 참조

이 매핑은 직접적인 API 대응을 보여주어 마이그레이션을 가속화합니다:

변환기 클래스 매핑

Haukcode.DinkToPdf IronPDF
SynchronizedConverter ChromePdfRenderer
BasicConverter ChromePdfRenderer
PdfTools 해당 없음
IConverter 해당 없음

문서 구성 매핑

Haukcode.DinkToPdf IronPDF
HtmlToPdfDocument 메소드 호출
GlobalSettings RenderingOptions
ObjectSettings RenderingOptions
converter.Convert(doc) renderer.RenderHtmlAsPdf(html)

글로벌 설정 속성 매핑

글로벌 설정 속성 IronPDF 속성
ColorMode RenderingOptions.GrayScale
Orientation RenderingOptions.PaperOrientation
PaperSize RenderingOptions.PaperSize
Margins.Top RenderingOptions.MarginTop
Margins.Bottom RenderingOptions.MarginBottom
Margins.Left RenderingOptions.MarginLeft
Margins.Right RenderingOptions.MarginRight

객체 설정 속성 매핑

객체 설정 속성 IronPDF 동등
HtmlContent 첫 번째 매개변수는 RenderHtmlAsPdf() 입니다
Page (URL) renderer.RenderUrlAsPdf(url)
HeaderSettings.Right = "[page]" {page}HtmlHeader.HtmlFragment 내부에 있습니다

플레이스홀더 구문 마이그레이션

Haukcode.DinkToPdf IronPDF
[page] {page}
[toPage] {total-pages}
[date] {date}

일반적인 마이그레이션 문제와 해결책

문제 1: 싱글톤 요구사항

Haukcode.DinkToPdf: wkhtmltopdf 네이티브 바이너리의 스레드 안전성 문제로 인해 SynchronizedConverter가 싱글톤으로 필요합니다.

해결책: IronPDF의 ChromePdfRenderer는 설계상 스레드 안전하므로 싱글톤이 필요하지 않습니다:

// Before (DinkToPdf) - MUST be singleton
services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));

// After (IronPDF) - Can be singleton or transient (both work)
services.AddSingleton<IPdfService, IronPdfService>();
// Or services.AddTransient<IPdfService, IronPdfService>() - both are safe!
// Before (DinkToPdf) - MUST be singleton
services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));

// After (IronPDF) - Can be singleton or transient (both work)
services.AddSingleton<IPdfService, IronPdfService>();
// Or services.AddTransient<IPdfService, IronPdfService>() - both are safe!
' Before (DinkToPdf) - MUST be singleton
services.AddSingleton(GetType(IConverter), New SynchronizedConverter(New PdfTools()))

' After (IronPDF) - Can be singleton or transient (both work)
services.AddSingleton(Of IPdfService, IronPdfService)()
' Or services.AddTransient(Of IPdfService, IronPdfService)() - both are safe!
$vbLabelText   $csharpLabel

문제 2: 네이티브 바이너리 의존성

Haukcode.DinkToPdf: 플랫폼 별 네이티브 라이브러리 (libwkhtmltox.dll/so/dylib)를 요구.

해결책: IronPDF는 네이티브 바이너리 의존성이 없는 독립형입니다. 마이그레이션 후 이 파일들을 삭제하세요:

  • libwkhtmltox.dll (Windows)
  • libwkhtmltox.so (Linux)
  • libwkhtmltox.dylib (macOS)

문제 3: 반환 타입 차이

Haukcode.DinkToPdf: converter.Convert()byte[]를 직접 반환합니다.

해결책: IronPDF는 여러 출력 옵션을 가진 PdfDocument 객체를 반환합니다.

var pdf = renderer.RenderHtmlAsPdf(html);
byte[] bytes = pdf.BinaryData;  // Get bytes
pdf.SaveAs("output.pdf");       // Or save directly
var pdf = renderer.RenderHtmlAsPdf(html);
byte[] bytes = pdf.BinaryData;  // Get bytes
pdf.SaveAs("output.pdf");       // Or save directly
Dim pdf = renderer.RenderHtmlAsPdf(html)
Dim bytes As Byte() = pdf.BinaryData  ' Get bytes
pdf.SaveAs("output.pdf")  ' Or save directly
$vbLabelText   $csharpLabel

문제 4: 헤더/푸터 플레이스홀더 구문

Haukcode.DinkToPdf: [page][toPage]와 같은 대괄호 구문을 사용합니다.

해결책: IronPDF의 중괄호 플레이스홀더로 업데이트 하세요:

// Before (DinkToPdf)
HeaderSettings = { Right = "Page [page] of [toPage]" }

// After (IronPDF)
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<span style='float:right'>Page {page} of {total-pages}</span>"
};
// Before (DinkToPdf)
HeaderSettings = { Right = "Page [page] of [toPage]" }

// After (IronPDF)
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<span style='float:right'>Page {page} of {total-pages}</span>"
};
' Before (DinkToPdf)
HeaderSettings = New With {.Right = "Page [page] of [toPage]"}

' After (IronPDF)
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
    .HtmlFragment = "<span style='float:right'>Page {page} of {total-pages}</span>"
}
$vbLabelText   $csharpLabel

Haukcode.DinkToPdf 마이그레이션 체크리스트

이동 전 작업

코드베이스를 감사하여 모든 DinkToPdf 사용을 식별하세요:

# Find DinkToPdf namespace usage
grep -r "using DinkToPdf\|using Haukcode" --include="*.cs" .

# Find converter usage
grep -r "SynchronizedConverter\|BasicConverter\|HtmlToPdfDocument" --include="*.cs" .

# Find native library loading
grep -r "wkhtmltopdf\|libwkhtmltox" --include="*.cs" --include="*.csproj" .

# Find GlobalSettings/ObjectSettings usage
grep -r "GlobalSettings\|ObjectSettings\|MarginSettings" --include="*.cs" .
# Find DinkToPdf namespace usage
grep -r "using DinkToPdf\|using Haukcode" --include="*.cs" .

# Find converter usage
grep -r "SynchronizedConverter\|BasicConverter\|HtmlToPdfDocument" --include="*.cs" .

# Find native library loading
grep -r "wkhtmltopdf\|libwkhtmltox" --include="*.cs" --include="*.csproj" .

# Find GlobalSettings/ObjectSettings usage
grep -r "GlobalSettings\|ObjectSettings\|MarginSettings" --include="*.cs" .
SHELL

현재 GlobalSettingsObjectSettings 구성을 문서화합니다. 제거할 수 있는 네이티브 라이브러리 로딩 코드를 식별하세요.

코드 업데이트 작업

  1. DinkToPdf NuGet 패키지를 제거하세요 2.IronPDF NuGet Install-Package
  2. DinkToPdf에서 IronPdf로 네임스페이스 가져오기를 업데이트합니다
  3. SynchronizedConverterChromePdfRenderer로 교체합니다
  4. HtmlToPdfDocument 패턴을 직접 메서드 호출로 변환합니다
  5. GlobalSettingsRenderingOptions로 변환합니다
  6. ObjectSettingsRenderingOptions로 변환합니다
  7. 플레이스홀더 구문 [page]{page}, [toPage]{total-pages}를 업데이트합니다
  8. 시작 시IronPDF라이선스 초기화를 추가하세요

인프라 정리 작업

  1. 네이티브 바이너리(libwkhtmltox.*)를 삭제하세요
  2. 네이티브 라이브러리 로딩 코드를 제거하세요
  3. CustomAssemblyLoadContext가 있으면 제거하세요
  4. 의존성 주입을 업데이트 하세요 (더 이상 싱글톤이 필요하지 않음)
  5. 네이티브 바이너리를 위한 플랫폼 감지 코드를 제거하세요

마이그레이션 후 테스트

마이그레이션 후 다음 측면을 검증:

  • HTML을 PDF로 변환 테스트
  • URL을 PDF로 변환 테스트
  • 페이지 설정(크기, 방향, 여백) 확인
  • 플레이스홀더를 사용한 헤더 및 푸터 확인
  • 실제 HTML 템플릿으로 테스트
  • 부하 조건에서 성능 테스트

IronPDF로 마이그레이션할 때의 주요 이점

Haukcode.DinkToPdf에서 IronPDF로 이동하면 여러 가지 중요한 이점이 있습니다:

보안: 패치되지 않는 CVE-2022-35583 (SSRF) 및 다른 wkhtmltopdf 취약점을 제거합니다.

현대적 렌더링 엔진: 폐기된 Qt WebKit 2015 대신 적극적으로 업데이트되는 Chromium을 사용합니다. 완전한 HTML5, CSS3 및 JavaScript 지원.

네이티브 바이너리 없음: 플랫폼 별 DLL을 관리할 필요가 없는 독립형 라이브러리. Windows, Linux, macOS에서의 배포를 단순화합니다.

스레드 안전성: 싱글톤 요구 사항 없음—ChromePdfRenderer을 요청 인스턴스화를 포함한 모든 패턴에서 자유롭게 사용하십시오.

더 간단한 API: 복잡한 문서 객체 구문 대신 직접 메서드 호출 (RenderHtmlAsPdf(), RenderUrlAsPdf()).

활발한 개발: IronPDF는 정기 릴리즈 스케줄을 통해 현재 .NET 버전에 맞춰져 .NET Framework 4.6.2+, .NET Core 3.1+, 그리고 .NET 5/6/7/8/9/10과 호환성을 유지합니다.

참고해 주세요DinkToPdf, Haukcode.DinkToPdf, Haukcode.WkHtmlToPdfDotNet 및 wkhtmltopdf는 그 소유자의 상표 또는 제품명입니다. 이 사이트는 이 프로젝트와 관련이 없으며, 승인받지도 않았고, 후원받지도 않습니다. 모든 제품명, 로고 및 브랜드는 해당 소유자의 자산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.

Curtis Chau
기술 문서 작성자

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

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

아이언 서포트 팀

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