IRONSOFTWAREHOME
동영상

C#을 사용하여 DOCX 파일을 PDF로 변환하는 방법

Curtis Chau
Curtis Chau
Updated: 2026년 5월 18일

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.DinkToPdfIronPDF
기본 엔진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
SHELL

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

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

2단계: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

4단계: 라이센스 초기화

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

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

코드 마이그레이션 예제

기본 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);
    }
}

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");
    }
}

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);
    }
}

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");
    }
}

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);
    }
}

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");
    }
}

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

Haukcode.DinkToPdf API부터IronPDF매핑 참조

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

변환기 클래스 매핑

Haukcode.DinkToPdfIronPDF
SynchronizedConverterChromePdfRenderer
BasicConverterChromePdfRenderer
PdfTools해당 없음
IConverter해당 없음

문서 구성 매핑

Haukcode.DinkToPdfIronPDF
HtmlToPdfDocument메소드 호출
GlobalSettingsRenderingOptions
ObjectSettingsRenderingOptions
converter.Convert(doc)renderer.RenderHtmlAsPdf(html)

글로벌 설정 속성 매핑

글로벌 설정 속성IronPDF 속성
ColorModeRenderingOptions.GrayScale
OrientationRenderingOptions.PaperOrientation
PaperSizeRenderingOptions.PaperSize
Margins.TopRenderingOptions.MarginTop
Margins.BottomRenderingOptions.MarginBottom
Margins.LeftRenderingOptions.MarginLeft
Margins.RightRenderingOptions.MarginRight

객체 설정 속성 매핑

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

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

Haukcode.DinkToPdfIronPDF
[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!

문제 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

문제 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>"
};

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" .
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를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

...
더 읽어보기

관련 기사

Key in blue circle

무료 30일 체험 키를 즉시 받으세요.

Your trial license will be sent to your email address

제한 없음. 100% 무제한 이용. 신용카드 불필요.

bullet_checked신용카드나 계정 생성은 필요하지 않습니다.제한 없음. 100% 무제한 이용. 신용카드 불필요.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
무료 라이브 데모를 예약하세요
Booking Badge

전 세계 수백만 엔지니어들이 신뢰하는 제품입니다.

Iron Software의 고객 로고
부담 없는 무료 상담을 받아보세요
아래 양식을 작성하시거나 sales@ironsoftware.com으로 이메일을 보내주세요.
고객님의 정보는 항상 비밀로 유지됩니다.
전 세계 수백만 엔지니어들이 신뢰하는 제품입니다.
Iron Software의 고객 로고
지금 바로 30일 무료 체험판 키를 받으세요.
신용카드나 계정 생성은 필요하지 않습니다.