C#에서 DinkToPdf에서 IronPDF로 마이그레이션하는 방법
DinkToPdf는 wkhtmltopdf를 래핑하여 모든 보안 취약성과 기술적 제한을 계승합니다. 이 문제를 이해하는 것이 이주 시급성을 평가하는 데 중요합니다.
중대한 보안 문제
DinkToPdf는 wkhtmltopdf에서 패치되지 않은 심각한 보안 취약성을 계승합니다:
- CVE-2022-35583 (SSRF): 공격자가 내부 네트워크 리소스에 접근할 수 있게 하는 서버사이드 요청 위조
- 프로젝트 철회: wkhtmltopdf는 2020년 이후로 유지 관리되지 않음
- 보안 패치 없음: 알려진 취약점은 결코 수정되지 않을 것임
기술적 문제
| 문제 | 영향 |
|---|---|
| 스레드 안전성 | SynchronizedConverter는 동시 로드 아래에서 여전히 프로덕션에서 충돌합니다. |
| 네이티브 바이너리 | 플랫폼별 libwkhtmltox 바이너리를 사용한 복잡한 배포 |
| CSS 제한 | Flexbox, Grid 또는 최신 CSS 지원 없음 |
| JavaScript | 일관되지 않은 실행 및 타임아웃 |
| 렌더링 | 구형 WebKit 엔진 (2015년 경) |
| 유지보수 | 마지막 업데이트: 2018 |
아키텍처 비교
| 측면 | DinkToPdf | IronPDF |
|---|---|---|
| 보안 | CVE-2022-35583 (SSRF), 패치되지 않음 | 알려진 취약점 없음 |
| 렌더링 엔진 | 구형 WebKit (2015) | 최신 크로뮴 |
| 스레드 안전성 | 동시 사용 시 충돌 | 완전한 스레드 안전성 |
| 네이티브 종속성 | 플랫폼별 바이너리 | 순수 NuGet 패키지 |
| CSS 지원 | Flexbox/Grid 없음 | 전체CSS3 |
| JavaScript | 제한적, 일관성 없음 | 지원됨 |
| 유지보수 | 2018년 중단됨 | 적극적으로 유지보수됨 |
기능 비교
| 기능 | DinkToPdf | IronPDF |
|---|---|---|
| HTML to PDF | ✅ (구식 엔진) | ✅ (Chromium) |
| URL을 PDF로 변환 | ✅ | ✅ |
| 사용자 정의 여백 | ✅ | ✅ |
| 헤더/푸터 | ✅ (제한적) | ✅ (전체 HTML) |
| CSS3 | ❌ 제한적 | ✅ 전체 |
| Flexbox/Grid | ❌ | ✅ |
| JavaScript | ⚠️ 제한적 | ✅ 전체 |
| PDF 조작 | ❌ | ✅ |
| 양식 채우기 | ❌ | ✅ |
| 디지털 서명 | ❌ | ✅ |
| 암호화 | ❌ | ✅ |
| 워터마크 | ❌ | ✅ |
| 병합/분할 | ❌ | ✅ |
이전 준비
필수 조건
환경이 다음 요구 사항을 충족하는지 확인하세요:
- .NET Framework 4.6.2+ 또는 .NET Core 3.1 / .NET 5-9
- Visual Studio 2019+ 또는 VS Code와 C# 확장
- NuGet 패키지 관리자 접근 -IronPDF라이선스 키 (ironpdf.com에서 무료 체험판 제공)
DinkToPdf사용 감사
솔루션 디렉토리에서 다음 명령을 실행하여 모든DinkToPdf참조를 식별하세요:
# Find allDinkToPdfusages in your codebase
grep -r "using DinkToPdf" --include="*.cs" .
grep -r "SynchronizedConverter\|HtmlToPdfDocument\|ObjectSettings" --include="*.cs" .
# Find NuGet package references
grep -r "DinkToPdf" --include="*.csproj" .
# Find wkhtmltopdf binaries
find . -name "libwkhtmltox*"
# Find allDinkToPdfusages in your codebase
grep -r "using DinkToPdf" --include="*.cs" .
grep -r "SynchronizedConverter\|HtmlToPdfDocument\|ObjectSettings" --include="*.cs" .
# Find NuGet package references
grep -r "DinkToPdf" --include="*.csproj" .
# Find wkhtmltopdf binaries
find . -name "libwkhtmltox*"
예상해야 할 주요 변경사항
| 변경 | DinkToPdf | IronPDF | 영향 |
|---|---|---|---|
| 변환기 | SynchronizedConverter(new PdfTools()) |
ChromePdfRenderer |
보다 간단한 인스턴스화 |
| 문서 | HtmlToPdfDocument |
직접 메소드 호출 | 문서 객체 없음 |
| 설정 | GlobalSettings + ObjectSettings |
RenderingOptions |
단일 옵션 객체 |
| 반환 유형 | byte[] |
PdfDocument |
더 강력한 객체 |
| 이진 | libwkhtmltox.dll/so |
없음 (관리됨) | 네이티브 파일 제거 |
| 스레드 안전성 | SynchronizedConverter 필요함 |
기본적으로 스레드 안전 | 더 간단한 코드 |
| DI | 싱글톤 필요 | 어느 수명 주기나 | 유연함 |
단계별 마이그레이션 프로세스
1단계: NuGet 패키지 업데이트
DinkToPdf 제거하고IronPDF설치:
# Remove DinkToPdf
dotnet remove package DinkToPdf
# Install IronPDF
dotnet add package IronPdf
# Remove DinkToPdf
dotnet remove package DinkToPdf
# Install IronPDF
dotnet add package IronPdf
2단계: 네이티브 이진 파일 제거
프로젝트에서 이 플랫폼별 파일들을 삭제하십시오:
libwkhtmltox.dll(Windows)libwkhtmltox.so(Linux)libwkhtmltox.dylib(macOS)
IronPDF에는 네이티브 종속성이 없습니다—모두 관리 코드입니다.
3단계: 네임스페이스 참조 업데이트
DinkToPdf 네임스페이스를 IronPDF로 대체:
// Remove these
using DinkToPdf;
using DinkToPdf.Contracts;
// Add this
using IronPdf;
// Remove these
using DinkToPdf;
using DinkToPdf.Contracts;
// Add this
using IronPdf;
Imports IronPdf
4단계: 라이선스 구성
// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
완전한 API 마이그레이션 참조
핵심 클래스 매핑
| DinkToPdf | IronPDF |
|---|---|
SynchronizedConverter |
ChromePdfRenderer |
BasicConverter |
ChromePdfRenderer |
PdfTools |
필요 없음 |
HtmlToPdfDocument |
필요 없음 |
GlobalSettings |
RenderingOptions |
ObjectSettings |
RenderingOptions |
MarginSettings |
개별 여백 속성 |
GlobalSettings 매핑
| DinkToPdf GlobalSettings | IronPDF 동등 |
|---|---|
ColorMode = ColorMode.Color |
기본값 (항상 색상) |
Orientation = Orientation.Portrait |
PaperOrientation = PdfPaperOrientation.Portrait |
Orientation = Orientation.Landscape |
PaperOrientation = PdfPaperOrientation.Landscape |
PaperSize = PaperKind.A4 |
PaperSize = PdfPaperSize.A4 |
Margins = new MarginSettings() |
개별 여백 속성 |
MarginSettings 매핑
| DinkToPdf 여백 | IronPDF 동등 |
|---|---|
Margins.Top = 10 |
MarginTop = 10 |
Margins.Bottom = 10 |
MarginBottom = 10 |
Margins.Left = 15 |
MarginLeft = 15 |
Margins.Right = 15 |
MarginRight = 15 |
코드 마이그레이션 예제
기본 HTML에서 PDF로
기본 변환은 DinkToPdf의 장황한 구성에서 IronPDF의 간소화된 API로의 극적인 단순화를 보여줍니다.
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 = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>",
WebSettings = { DefaultEncoding = "utf-8" }
}
}
};
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 = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>",
WebSettings = { DefaultEncoding = "utf-8" }
}
}
};
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 ObjectSettings() With {
.HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>",
.WebSettings = New WebSettings() With {
.DefaultEncoding = "utf-8"
}
}
}
}
Dim pdf As Byte() = converter.Convert(doc)
File.WriteAllBytes("output.pdf", pdf)
End Sub
End Module
IronPDF 구현:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>")
pdf.SaveAs("output.pdf")
End Sub
End Class
IronPDF는DinkToPdf구성 20줄을 4줄로 줄입니다. 아무 SynchronizedConverter도, PdfTools도, HtmlToPdfDocument도, ObjectSettings도 없이—단지 렌더링하고 저장할 뿐입니다. 더 많은 옵션을 보려면 HTML to PDF 문서를 참조하세요.
URL을 PDF로 변환
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
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
IronPDF의 RenderUrlAsPdf이 중첩된 ObjectSettings.Page 구성을 직접적인 메서드 호출로 대체합니다. 더 많은 옵션을 보려면 URL to PDF 문서를 참조하세요.
Landscape 및 여백을 가진 사용자 정의 설정
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.A4,
Margins = new MarginSettings { Top = 10, Bottom = 10, Left = 15, Right = 15 }
},
Objects = {
new ObjectSettings() {
HtmlContent = "<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>",
WebSettings = { DefaultEncoding = "utf-8" }
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("custom.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.A4,
Margins = new MarginSettings { Top = 10, Bottom = 10, Left = 15, Right = 15 }
},
Objects = {
new ObjectSettings() {
HtmlContent = "<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>",
WebSettings = { DefaultEncoding = "utf-8" }
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("custom.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.A4,
.Margins = New MarginSettings() With {
.Top = 10,
.Bottom = 10,
.Left = 15,
.Right = 15
}
},
.Objects = {
New ObjectSettings() With {
.HtmlContent = "<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>",
.WebSettings = New WebSettings() With {
.DefaultEncoding = "utf-8"
}
}
}
}
Dim pdf As Byte() = converter.Convert(doc)
File.WriteAllBytes("custom.pdf", pdf)
End Sub
End Module
IronPDF 구현:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 15;
renderer.RenderingOptions.MarginRight = 15;
var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>");
pdf.SaveAs("custom.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 15;
renderer.RenderingOptions.MarginRight = 15;
var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>");
pdf.SaveAs("custom.pdf");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System
Module Program
Sub Main()
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
renderer.RenderingOptions.MarginTop = 10
renderer.RenderingOptions.MarginBottom = 10
renderer.RenderingOptions.MarginLeft = 15
renderer.RenderingOptions.MarginRight = 15
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>")
pdf.SaveAs("custom.pdf")
End Sub
End Module
IronPDF의 RenderingOptions이 GlobalSettings 및 MarginSettings을 통합된, 유창한 API로 대체합니다. 더 많은 구성 옵션을 보려면 렌더링 옵션 문서를 참조하십시오.
중요한 마이그레이션 노트
네이티브 이진 파일 제거
가장 중요한 정리 단계는 wkhtmltopdf 네이티브 이진 파일들을 제거하는 것입니다. IronPDF에는 네이티브 종속성이 없습니다:
# Delete native binaries
rm libwkhtmltox.* 2>/dev/null
# Delete native binaries
rm libwkhtmltox.* 2>/dev/null
싱글톤 필요 없음
DinkToPdf의 SynchronizedConverter는 충돌을 피하기 위해 싱글톤으로 등록되어야 했습니다. IronPDF의 ChromePdfRenderer는 모든 DI 수명주기에서 스레드 안전성을 보장합니다:
//DinkToPdf- MUST be singleton
services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));
//IronPDF- any lifetime works
services.AddScoped<ChromePdfRenderer>();
// Or just create inline:
var renderer = new ChromePdfRenderer();
//DinkToPdf- MUST be singleton
services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));
//IronPDF- any lifetime works
services.AddScoped<ChromePdfRenderer>();
// Or just create inline:
var renderer = new ChromePdfRenderer();
' DinkToPdf- MUST be singleton
services.AddSingleton(GetType(IConverter), New SynchronizedConverter(New PdfTools()))
' IronPDF- any lifetime works
services.AddScoped(Of ChromePdfRenderer)()
' Or just create inline:
Dim renderer As New ChromePdfRenderer()
더 풍부한 반환 유형
DinkToPdf는 byte[]을 반환합니다. IronPDF는 PdfDocument을 조작 기능과 함께 반환합니다:
//DinkToPdfreturns byte[]
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
return File(pdf, "application/pdf");
//IronPDFreturns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
return File(pdf.BinaryData, "application/pdf");
//DinkToPdfreturns byte[]
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
return File(pdf, "application/pdf");
//IronPDFreturns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
return File(pdf.BinaryData, "application/pdf");
' DinkToPdf returns byte()
Dim pdf As Byte() = converter.Convert(doc)
File.WriteAllBytes("output.pdf", pdf)
Return File(pdf, "application/pdf")
' IronPDF returns PdfDocument
Dim pdfDocument = renderer.RenderHtmlAsPdf(html)
pdfDocument.SaveAs("output.pdf")
Return File(pdfDocument.BinaryData, "application/pdf")
전체CSS3지원
DinkToPdf에서 실패하는 최신 레이아웃이 IronPDF에서는 완벽하게 작동합니다:
//DinkToPdf- doesn't work (wkhtmltopdf uses 2015 WebKit)
var html = "<div style='display: flex;'>...</div>"; // Broken!
//IronPDF- full support (modern Chromium)
var html = @"
<div style='display: flex; justify-content: space-between;'>
<div>Left</div>
<div>Right</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html); // Works!
//DinkToPdf- doesn't work (wkhtmltopdf uses 2015 WebKit)
var html = "<div style='display: flex;'>...</div>"; // Broken!
//IronPDF- full support (modern Chromium)
var html = @"
<div style='display: flex; justify-content: space-between;'>
<div>Left</div>
<div>Right</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html); // Works!
' DinkToPdf- doesn't work (wkhtmltopdf uses 2015 WebKit)
Dim html As String = "<div style='display: flex;'>...</div>" ' Broken!
' IronPDF- full support (modern Chromium)
Dim html As String = "
<div style='display: flex; justify-content: space-between;'>
<div>Left</div>
<div>Right</div>
</div>"
Dim pdf = renderer.RenderHtmlAsPdf(html) ' Works!
마이그레이션 후 점검 목록
코드 마이그레이션을 완료한 후, 다음을 확인하십시오:
- PDF 생성이 올바르게 작동하는지 확인하기 위해 모든 단위 테스트를 수행합니다
- 다중 스레드 시나리오 테스트(DinkToPdf에서는 오류 발생)
- PDF 출력 품질 비교(IronPDF의 Chromium이 더 나음)
- CSS 렌더링 확인(Flexbox/Grid가 이제 작동) -JavaScript실행 테스트(IronPDF에서는 신뢰할 수 있음)
- wkhtmltopdf 설치 제거를 위한 CI/CD 파이프라인 업데이트
- 보안 스캔 통과 확인(CVE-2022-35583 플래그 없음)
- Docker/배포 스크립트에서 네이티브 바이너리 배포 제거
PDF 인프라의 미래 대비
.NET 10이 다가오고 C# 14가 새로운 언어 기능을 도입함에 따라, 적극적으로 유지 보수되는 PDF 라이브러리를 선택하는 것은 장기적인 호환성을 보장합니다. IronPDF의 최신 Chromium 엔진은 정기적으로 업데이트되는 반면, DinkToPdf의 중단된 wkhtmltopdf는 2015년의 기능에 고정되어 있으며, 웹 표준이 2025년과 2026년을 통해 발전함에 따라 점점 더 격차가 벌어질 것입니다.
추가 리소스
DinkToPdf에서 IronPDF로의 마이그레이션은 중요한 보안 취약성(CVE-2022-35583), 스레드 안전성 충돌, 네이티브 바이너리 배포 복잡성, 그리고 구식 CSS 렌더링을 제거합니다. 최신 Chromium 엔진으로의 전환은 전체CSS3지원, 신뢰할 수 있는JavaScript실행, 그리고 적극적으로 유지 보수되는 라이브러리로 인해 마음의 평화를 제공합니다.

