IronPDF 2021: Chrome Rendering Engine EAP – przełomowe rozwiązanie w tworzeniu plików PDF!
DinkToPdf wykorzystuje bibliotekę wkhtmltopdf, dziedzicząc wszystkie jej luki w zabezpieczeniach i ograniczenia techniczne. Zrozumienie tych kwestii ma kluczowe znaczenie dla oceny pilności migracji.
Krytyczne kwestie bezpieczeństwa
DinkToPdf dziedziczy niezałatane porady dotyczące bezpieczeństwa z wkhtmltopdf:
- CVE-2022-35583 (SSRF): Porada dotycząca Server-Side Request Forgery przeciw wkhtmltopdf 0.12.6 (CVSS 9.8 w NVD; zakwestionowane przez projekt źródłowy jako problem z sanitacją danych wejściowych aplikacji, a nie błąd biblioteki). Tak czy inaczej, nie zostanie to załatane.
- Archiwizowany projekt: Repozytorium
wkhtmltopdf/wkhtmltopdfzostało zarchiwizowane 2 stycznia 2023, a cała organizacja GitHubwkhtmltopdfzostała zarchiwizowana 10 lipca 2024. - Brak przyszłych łatek zabezpieczeń: Wszelkie znane lub przyszłe podatności nie zostaną naprawione upstream.
Problemy techniczne
| Problem | Wpływ |
|---|---|
| Bezpieczeństwo wątków | BasicConverter jest tylko jednowątkowy; SynchronizedConverter serializuje wywołania i nadal może powodować awarie po stronie natywnej pod obciążeniem |
| Pliki binarne | Złożona implementacja z binariami specyficznymi dla platformy libwkhtmltox |
| Ograniczenia CSS | Starsza gałąź QtWebKit—brak wsparcia dla nowoczesnych układów Flexbox/Grid |
| JavaScript | Niespójne wykonanie, przekroczenie limitów czasu |
| Renderowanie | Przestarzały silnik oparty na QtWebKit (wkhtmltopdf 0.12.6, ostatnie wydanie czerwiec 2020) |
| Konserwacja | DinkToPdf 1.0.8 ostatnio wydana 18 kwietnia 2017 na NuGet |
Porównanie architektur
| Aspekt | DinkToPdf | IronPDF |
|---|---|---|
| Bezpieczeństwo | CVE-2022-35583 (SSRF), niezałatane / zakwestionowane upstream | Brak znanych krytycznych CVE |
| Silnik renderujący | Starsza gałąź QtWebKit (wkhtmltopdf 0.12.6) | Nowoczesny Chromium |
| Bezpieczeństwo wątków | SynchronizedConverter serializuje wywołania; native-side crashes reported under load | Zabezpieczone przed współbieżnością już w fazie projektowania |
| Zależności natywne | Binaria specyficzne dla platformy libwkhtmltox | Zarządzany pakiet NuGet |
| Obsługa CSS | Brak nowoczesnegoFlexbox/Grid | PełnyCSS3 |
| JavaScript | Ograniczone, niespójne | Obsługiwane |
| Konserwacja | Ostatnie wydanieDinkToPdfkwiecień 2017; organizacja wkhtmltopdf zarchiwizowana lipiec 2024 | Aktywnie utrzymywane |
Porównanie funkcji
| Funkcja | DinkToPdf | IronPDF |
|---|---|---|
| HTML do PDF | ✅(przestarzały silnik) | ✅ (Chromium) |
| URL do pliku PDF | ✅ | ✅ |
| Niestandardowe marginesy | ✅ | ✅ |
| Nagłówki/stopki | ✅(ograniczone) | ✅(pełny kod HTML) |
| CSS3 | ❌Ograniczone | ✅Pełne |
| Flexbox/Grid | ❌ | ✅ |
| JavaScript | ⚠ Ograniczone | ✅Pełne |
| Manipulacja plikami PDF | ❌ | ✅ |
| Wypełnianie formularzy | ❌ | ✅ |
| Podpisy cyfrowe | ❌ | ✅ |
| Szyfrowanie | ❌ | ✅ |
| Znaki wodne | ❌ | ✅ |
| Scal/Podziel | ❌ | ✅ |
Przygotowania przed migracją
Wymagania wstępne
Upewnij się, że Twoje środowisko spełnia następujące wymagania:
- .NET Framework 4.6.2+, .NET Core 3.1+, or .NET 5/6/7/8/9/10
- Visual Studio 2019+ lub VS Code z rozszerzeniem C#
- Dostęp do menedżera pakietów NuGet
- Klucz licencyjny IronPDF(bezpłatna wersja próbna dostępna na stronie ironpdf.com)
Audyt wykorzystania DinkToPdf
Uruchom te polecenia w katalogu rozwiązania, aby zidentyfikować wszystkie odwołania do 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*"
Zmiany wymagające dostosowania
| Zmiana | DinkToPdf | IronPDF | Wpływ |
|---|---|---|---|
| Konwerter | SynchronizedConverter(new PdfTools()) | ChromePdfRenderer | Prostsze tworzenie instancji |
| Dokument | HtmlToPdfDocument | Bezpośrednie wywołanie metody | Brak obiektu dokumentu |
| Ustawienia | GlobalSettings + ObjectSettings | RenderingOptions | Obiekt z pojedynczymi opcjami |
| Typ zwracanej wartości | byte[] | PdfDocument | Bardziej wydajny obiekt |
| Binarny | libwkhtmltox.dll/so | Brak (zarządzane) | Usuń pliki natywne |
| Bezpieczeństwo wątków | BasicConverter jednowątkowy; SynchronizedConverter serializuje | Domyślnie bezpieczne dla wątków | Prostszy kod |
| DI | Wymagany singleton | Każdy okres użytkowania | Elastyczny |
Proces migracji krok po kroku
Krok 1: Zaktualizuj pakiety NuGet
UsuńDinkToPdfi zainstaluj IronPDF:
# Remove DinkToPdf
dotnet remove package DinkToPdf
# Install IronPDF
dotnet add package IronPdf
Krok 2: Usuń natywne pliki binarne
Usuń z projektu następujące pliki specyficzne dla platformy:
libwkhtmltox.dll(Windows)libwkhtmltox.so(Linux)libwkhtmltox.dylib(macOS)
IronPDF nie ma żadnych natywnych zależności — wszystko jest kodem zarządzanym.
Krok 3: Zaktualizuj odniesienia do przestrzeni nazw
Zastąp przestrzenie nazwDinkToPdfna IronPDF:
// Remove these
using DinkToPdf;
using DinkToPdf.Contracts;
// Add this
using IronPdf;Imports IronPdfKrok 4: Skonfiguruj licencję
// 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"Kompletna dokumentacja API
Mapowanie klas podstawowych
| DinkToPdf | IronPDF |
|---|---|
SynchronizedConverter | ChromePdfRenderer |
BasicConverter | ChromePdfRenderer |
PdfTools | Nie jest potrzebne |
HtmlToPdfDocument | Nie jest potrzebne |
GlobalSettings | RenderingOptions |
ObjectSettings | RenderingOptions |
MarginSettings | Właściwości poszczególnych marginesów |
Mapowanie ustawień globalnych
| DinkToPdf GlobalSettings | Odpowiednik IronPDF |
|---|---|
ColorMode = ColorMode.Color | Domyślnie (zawsze kolor) |
Orientation = Orientation.Portrait | PaperOrientation = PdfPaperOrientation.Portrait |
Orientation = Orientation.Landscape | PaperOrientation = PdfPaperOrientation.Landscape |
PaperSize = PaperKind.A4 | PaperSize = PdfPaperSize.A4 |
Margins = new MarginSettings() | Właściwości poszczególnych marginesów |
Mapowanie ustawień marginesów
| DinkToPdfMarginesy | Odpowiednik IronPDF |
|---|---|
Margins.Top = 10 | MarginTop = 10 |
Margins.Bottom = 10 | MarginBottom = 10 |
Margins.Left = 15 | MarginLeft = 15 |
Margins.Right = 15 | MarginRight = 15 |
Przykłady migracji kodu
Podstawowy HTML do PDF
Podstawowa konwersja pokazuje radykalne uproszczenie w porównaniu z rozbudowaną konfiguracjąDinkToPdfi usprawnionym API IronPDF.
Wdrożenie 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);
}
}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 ModuleWdrożenie 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");
}
}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 ClassIronPDF redukuje 20-wierszową konfiguracjęDinkToPdfdo 4 wierszy. Brak SynchronizedConverter, brak PdfTools, brak HtmlToPdfDocument, brak ObjectSettings — tylko renderowanie i zapis. Aby uzyskać więcej opcji, zapoznaj się z dokumentacją dotyczącą konwersji HTML do PDF.
Konwersja adresów URL do formatu PDF
Wdrożenie 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);
}
}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 ModuleWdrożenie 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");
}
}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 ClassFunkcja RenderUrlAsPdfIronPDF zastępuje zagnieżdżoną konfigurację ObjectSettings.Page bezpośrednim wywołaniem metody. Aby uzyskać więcej opcji, zapoznaj się z dokumentacją dotyczącą konwersji URL na PDF.
Ustawienia niestandardowe z orientacją poziomą i marginesami
Wdrożenie 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);
}
}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 ModuleWdrożenie 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
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 ModuleFunkcja RenderingOptionsIronPDF zastępuje zarówno GlobalSettings, jak i MarginSettings zintegrowanym, płynnym API. Aby uzyskać więcej opcji konfiguracyjnych, zapoznaj się z dokumentacją opcji renderowania.
Ważne uwagi dotyczące migracji
Usuń pliki binarne
Najważniejszym etapem porządkowania jest usunięcie natywnych plików binarnych wkhtmltopdf.IronPDF nie ma żadnych natywnych zależności:
# Delete native binaries
rm libwkhtmltox.* 2>/dev/null
Nie jest wymagany singleton
DokumentacjaDinkToPdfsugeruje zarejestrowanie SynchronizedConverter jako singleton. Biblioteka ChromePdfRendererIronPDF jest bezpieczna dla wątków w dowolnym czasie życia 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();
Bogatszy typ zwracanej wartości
DinkToPdf zwraca byte[].IronPDF zwraca PdfDocument z możliwościami manipulacji:
//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");
Pełna obsługa CSS3
Nowoczesne układy, które nie działają w DinkToPdf, działają idealnie w 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)
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!Lista kontrolna po migracji
Po zakończeniu migracji kodu sprawdź, czy:
- Uruchom wszystkie testy jednostkowe, aby sprawdzić, czy generowanie plików PDF działa poprawnie
- Przetestuj scenariusze wielowątkowe (ścieżka
SynchronizedConverterserializuje wywołania i była podatna na awarie po stronie natywnej pod obciążeniem) - Porównaj jakość wyjściowego pliku PDF (renderowanie IronPDF w Chromium jest lepsze)
- Sprawdź renderowanie CSS (Flexbox/Grid teraz działa)
- Testowanie działania koduJavaScript(niezawodne w połączeniu z IronPDF)
- Zaktualizuj potoki CI/CD, aby usunąć instalację wkhtmltopdf
- Sprawdź, czy skanowanie bezpieczeństwa zakończyło się pomyślnie (brak flag CVE-2022-35583)
- Usuń natywne wdrażanie plików binarnych ze skryptów Docker/wdrożeniowych
Dodatkowe zasoby
- Dokumentacja IronPDF
- Samouczki dotyczące konwersji HTML do PDF
- Dokumentacja API
- Pakiet NuGet
- Opcje licencyjne
Migracja zDinkToPdfdo IronPDF eliminuje niezaktualizowaną powierzchnię ataku wkhtmltopdf (CVE-2022-35583), zserializowany model współbieżności SynchronizedConverter, wdrażanie binariów natywnych oraz starszą ścieżkę renderowania QtWebKit. Przejście na nowoczesny silnik Chromium dostarcza pełne wsparcie dla CSS3, niezawodne wykonywanieJavaScripti aktywnie utrzymywaną bibliotekę.

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podręczników.