C#에서 DinkToPdf에서 IronPDF로 마이그레이션하는 방법
DinkToPdf는 wkhtmltopdf를 래핑하여 모든 보안 취약성과 기술적 제한을 계승합니다. 이 문제를 이해하는 것이 이주 시급성을 평가하는 데 중요합니다.
중대한 보안 문제
DinkToPdf는 wkhtmltopdf로부터 패치되지 않은 보안 권고를 상속받습니다:
- CVE-2022-35583 (SSRF): wkhtmltopdf 0.12.6에 대한 서버 사이드 요청 위조 권고 (NVD의 CVSS 9.8; 라이브러리 문제라기보다는 애플리케이션 측 입력 검증 문제로 상위 프로젝트에서 다투어진 사항). 어쨌든, 이는 패치되지 않을 것입니다.
- 보관된 프로젝트:
wkhtmltopdf/wkhtmltopdf리포지토리는 2023년 1월 2일에 보관되었으며, 전체wkhtmltopdfGitHub 조직은 2024년 7월 10일에 보관되었습니다. - 향후 보안 패치 없음: 어떤 알려진 또는 향후 취약점이 상위에서 수정되지 않을 것입니다.
기술적 문제
| 문제 | 영향 |
|---|---|
| 스레드 안전성 | BasicConverter는 단일 스레드 전용입니다; SynchronizedConverter가 호출을 직렬화하며, 부하가 걸릴 경우 여전히 네이티브 측에서 충돌이 발생할 수 있습니다 |
| 네이티브 바이너리 | 플랫폼에 따라 다르게 필요한 복잡한 libwkhtmltox 배포 |
| CSS 제한 | 구식 QtWebKit 포크 — 최신Flexbox/Grid레이아웃 지원 없음 |
| JavaScript | 일관되지 않은 실행 및 타임아웃 |
| 렌더링 | 구식 QtWebKit 기반 엔진 (wkhtmltopdf 0.12.6, 마지막 릴리스 2020년 6월) |
| 유지보수 | DinkToPdf 1.0.8 마지막 릴리스 2017년 4월 18일 NuGet에서 |
아키텍처 비교
| 측면 | DinkToPdf | IronPDF |
|---|---|---|
| 보안 | CVE-2022-35583 (SSRF), 패치되지 않음 / 상위에서 다투어짐 | 알려진 중요한 CVE 없음 |
| 렌더링 엔진 | 구식 QtWebKit 포크 (wkhtmltopdf 0.12.6) | 최신 크로뮴 |
| 스레드 안전성 | SynchronizedConverter가 호출을 직렬화합니다; native-side crashes reported under load |
설계상 스레드 안전 |
| 네이티브 종속성 | 플랫폼에 따라 다른 libwkhtmltox 바이너리 |
관리 NuGet 패키지 |
| CSS 지원 | 최신 Flexbox/그리드 없음 | 전체CSS3 |
| JavaScript | 제한적, 일관성 없음 | 지원됨 |
| 유지보수 | DinkToPdf 마지막 릴리스 2017년 4월; wkhtmltopdf org 보관 2024년 7월 | 적극적으로 유지보수됨 |
기능 비교
| 기능 | DinkToPdf | IronPDF |
|---|---|---|
| HTML to PDF | ✅ (구식 엔진) | ✅ (Chromium) |
| URL을 PDF로 변환 | ✅ | ✅ |
| 사용자 정의 여백 | ✅ | ✅ |
| 헤더/푸터 | ✅ (제한적) | ✅ (전체 HTML) |
| CSS3 | ❌ 제한적 | ✅ 전체 |
| Flexbox/Grid | ❌ | ✅ |
| JavaScript | ⚠ 제한됨 | ✅ 전체 |
| PDF 조작 | ❌ | ✅ |
| 양식 채우기 | ❌ | ✅ |
| 디지털 서명 | ❌ | ✅ |
| 암호화 | ❌ | ✅ |
| 워터마크 | ❌ | ✅ |
| 병합/분할 | ❌ | ✅ |
이전 준비
필수 조건
환경이 다음 요구 사항을 충족하는지 확인하세요:
- .NET Framework 4.6.2+, .NET Core 3.1+, or .NET 5/6/7/8/9/10
- 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 |
없음 (관리됨) | 네이티브 파일 제거 |
| 스레드 안전성 | BasicConverter 단일 스레드; 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- typically registered as 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- typically registered as 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 - typically registered as 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");
//IronPDF returns 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");
//IronPDF returns 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 pdfDoc = renderer.RenderHtmlAsPdf(html)
pdfDoc.SaveAs("output.pdf")
Return File(pdfDoc.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 생성이 올바르게 작동하는지 확인하기 위해 모든 단위 테스트를 수행합니다
- 멀티 스레드 시나리오를 테스트하세요 (경로
SynchronizedConverter가 호출을 직렬화하며, 부하가 걸릴 경우 네이티브 측에서 충돌하기 쉬웠습니다) - PDF 출력 품질 비교(IronPDF의 Chromium이 더 나음)
- CSS 렌더링 확인(Flexbox/Grid가 이제 작동) -JavaScript실행 테스트(IronPDF에서는 신뢰할 수 있음)
- wkhtmltopdf 설치 제거를 위한 CI/CD 파이프라인 업데이트
- 보안 스캔 통과 확인(CVE-2022-35583 플래그 없음)
- Docker/배포 스크립트에서 네이티브 바이너리 배포 제거
추가 리소스
DinkToPdf에서 IronPDF로의 마이그레이션은 패치되지 않은 wkhtmltopdf 공격 표면(CVE-2022-35583), 직렬 SynchronizedConverter 동시성 모델, 네이티브 바이너리 배포, 그리고 오래된 QtWebKit 렌더링 경로를 폐기합니다. 최신 Chromium 엔진으로의 전환은 전체CSS3지원, 신뢰할 수 있는JavaScript실행, 적극적으로 유지 관리되는 라이브러리를 제공합니다.

