Jak zarządzać czcionkami podczas konwersji HTML do PDF
EO.PDF stwarza kilka wyzwań architektonicznych, które skłaniają zespoły programistów do rozważania alternatywnych rozwiązań. Zrozumienie tych kwestii jest niezbędne do zaplanowania strategii migracji.
Problemy z plikiem EO.PDF
-
Powiązania Chromium: EO.Pdf (aktualna wersja NuGet 26.1.34, marzec 2026) dostarcza własny renderer oparty na Chromium, co zwiększa ślad instalacji w porównaniu z bibliotekami nie opartymi na Chromium i dodaje wagę do obrazów Docker i potoków CI/CD.
-
Dziedzictwo architektury: Konwerter HTML-to-PDF EO.Pdf został początkowo stworzony na wbudowanym silniku Internet Explorer / Trident, zanim projekt przeszedł na renderer oparty na Chromium. Przejście pozostawiło za sobą pewne dziwactwa API i różnice w zachowaniu między wersjami.
-
Tylko Windows na .NET Core: Pomimo marketingu jako "cross-platform", dokumentacja .NET Core mówi, że EO.Pdf wspiera .NET Core 3.1+ i .NET 5/6 tylko na Windows — Linux i macOS nie są oficjalnie wspierane.
-
Globalne opcje statyczne: Głównym punktem wyjścia HTML do PDF w EO.Pdf jest statyczna klasa
HtmlToPdfz dzielonymHtmlToPdf.Options. Zmiana tego globalnego stanu z wielu wątków nie jest bezpieczna i jest kłopotliwa w wielo-wynajmowych aplikacjach internetowych. -
Płatna licencja komercyjna: EO.Pdf jest sprzedawane jako Single, 3-License Bundle, Corporate i Corporate Plus (brak trwałej darmowej wersji — tylko 30-dniowa wersja próbna z oznaczeniem wodnym). Dokładne ceny znajdują się na stronie zamówienia.
Porównanie architektur
| Aspekt | EO.Pdf | IronPDF |
|---|---|---|
| Renderer | Powszechny Chromium (przeszedł z IE/Trident) | Osadzone Chromium |
| Kwestie związane z dziedzictwem | bagaż migracji z IE/Trident | Zbudowany na Chromium od początku |
| Obsługa platform | Tylko Windows na .NET Core | Windows, Linux, macOS, Docker, Azure |
| Konfiguracja | Statyczna HtmlToPdf.Options (nie jest bezpieczna dla wątków) | Oparta na instancji ChromePdfRenderer (bezpieczna dla wątków) |
| Projektowanie API | Mieszany (statyczny HtmlToPdf + model obiektowy ACM) | Zunifikowany ChromePdfRenderer + HTML/CSS |
| Model licencji | Single / 3-License / Corporate / Corporate Plus (30-dniowy okres próbny) | Komercyjna per developer; Darmowa wersja próbna |
| Nowoczesny .NET | .NET Framework + .NET Core 3.1+ (Windows only) | .NET Framework, .NET 6/7/8/9 wieloplatformowo |
| Obsługa asynchroniczna | Ograniczone | Pełny RenderHtmlAsPdfAsync / RenderUrlAsPdfAsync |
Kluczowe korzyści z migracji
- Cross-platform na .NET Core / .NET 6+: Działa na Linux, macOS i Docker — nie tylko Windows
- Thread-Safe Configuration: Opcje renderera oparte na instancji zamiast statycznych globalnych
- Nowoczesny API: Spójne nazwy metod —
RenderHtmlAsPdf,RenderUrlAsPdf,PdfDocument.Merge - Pełne wsparcie asynchroniczne:
RenderHtmlAsPdfAsynciRenderUrlAsPdfAsyncdla nieblokujących potoków - Dokumentacja: Rozbudowane samouczki, poradniki i aktywna dokumentacja obiektowa
Przygotowania przed migracją
Wymagania wstępne
Upewnij się, że Twoje środowisko spełnia następujące wymagania:
- .NET Framework 4.6.2+ lub .NET Core 3.1 / .NET 5-9
- 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)
Sprawdź użycie pliku EO.PDF
Uruchom te polecenia w katalogu rozwiązania, aby zidentyfikować wszystkie odwołania do plików EO.PDF:
# Find all EO.Pdf references
grep -r "EO.Pdf\|HtmlToPdf\|AcmRender\|PdfDocument" --include="*.cs" .
# Check NuGet packages
dotnet list package | grep -i "EO.Pdf"
Typowe przestrzenie nazw EO.PDF, na które należy zwrócić uwagę:
EO.Pdf- Podstawowe HTML do PDFEO.Pdf.Acm- Zaawansowany Model Treści (ACM)EO.Pdf.Contents- Manipulacja treścią na niskim poziomieEO.Pdf.Drawing- Operacje graficzne
Zrozumienie zmiany wzorca podstawowego
Najważniejszą różnicą architektoniczną między EO.PDF a IronPDF jest zakres konfiguracji. EO.PDF wykorzystuje metody statyczne z opcjami globalnymi, które mają wpływ na wszystkie konwersje — jest to wzorzec powodujący problemy z bezpieczeństwem wątków w aplikacjach internetowych.IronPDF wykorzystuje renderery oparte na instancjach z opcjami lokalnymi, co zapewnia izolację każdej konwersji.
Proces migracji krok po kroku
Krok 1: Zaktualizuj pakiety NuGet
Usuń EO.Pdf i zainstaluj IronPDF:
# Remove EO.Pdf
dotnet remove package EO.Pdf
# Install IronPDF
dotnet add package IronPdf
Krok 2: Aktualizacja odniesień do przestrzeni nazw
Zastąp przestrzenie nazw EO.PDF przez IronPDF:
// Remove these
using EO.Pdf;
using EO.Pdf.Acm;
// Add this
using IronPdf;Imports IronPdfKrok 3: Skonfiguruj licencję
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"Kompletna dokumentacja API
Mapowanie klas podstawowych
| Klasa EO.PDF | Odpowiednik IronPDF |
|---|---|
HtmlToPdf | ChromePdfRenderer |
PdfDocument | PdfDocument |
HtmlToPdfOptions | ChromePdfRenderOptions |
AcmRender | Nie jest potrzebne |
AcmText | HTML <span>, <p> |
AcmBlock | HTML <div> |
Mapowanie metod
| Metoda EO.PDF | Metoda IronPDF |
|---|---|
HtmlToPdf.ConvertHtml(html, path) | renderer.RenderHtmlAsPdf(html) potem SaveAs(path) |
HtmlToPdf.ConvertUrl(url, path) | renderer.RenderUrlAsPdf(url) potem SaveAs(path) |
PdfDocument.Save(path) | pdf.SaveAs(path) |
new PdfDocument(path) | PdfDocument.FromFile(path) |
PdfDocument.Merge(doc1, doc2) (statyczny) | PdfDocument.Merge(doc1, doc2) (statyczny) |
Mapowanie opcji
| Opcja EO.PDF | IronPDF RenderingOptions |
|---|---|
Options.PageSize = PdfPageSizes.A4 | PaperSize = PdfPaperSize.A4 |
Options.OutputArea (RectangleF) | MarginTop, MarginBottom, itd. |
Przykłady migracji kodu
Konwersja HTML do PDF
Podstawowa konwersja HTML do PDF ilustruje przejście od metod statycznych do renderowania opartego na instancjach.
Wdrożenie EO.PDF:
// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF generated from HTML.</p></body></html>";
HtmlToPdf.ConvertHtml(html, "output.pdf");
Console.WriteLine("PDF created successfully!");
}
}' NuGet: Install-Package EO.Pdf
Imports EO.Pdf
Imports System
Module Program
Sub Main()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF generated from HTML.</p></body></html>"
HtmlToPdf.ConvertHtml(html, "output.pdf")
Console.WriteLine("PDF created successfully!")
End Sub
End ModuleWdrożenie IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF generated from HTML.</p></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}' NuGet: Install-Package IronPdf
Imports IronPdf
Imports System
Module Program
Sub Main()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF generated from HTML.</p></body></html>"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully!")
End Sub
End ModuleDwustopniowy wzorzec IronPDF(generowanie, a następnie zapis) zapewnia dostęp do obiektu PdfDocument do dodatkowej manipulacji przed zapisem. Aby uzyskać więcej opcji, zapoznaj się z dokumentacją dotyczącą konwersji HTML do PDF.
Konwersja adresów URL do formatu PDF
Wdrożenie EO.PDF:
// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
string url = "https://www.example.com";
HtmlToPdf.ConvertUrl(url, "webpage.pdf");
Console.WriteLine("PDF from URL created successfully!");
}
}' NuGet: Install-Package EO.Pdf
Imports EO.Pdf
Imports System
Module Program
Sub Main()
Dim url As String = "https://www.example.com"
HtmlToPdf.ConvertUrl(url, "webpage.pdf")
Console.WriteLine("PDF from URL created successfully!")
End Sub
End ModuleWdrożenie IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string url = "https://www.example.com";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf(url);
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL created successfully!");
}
}' NuGet: Install-Package IronPdf
Imports IronPdf
Imports System
Module Program
Sub Main()
Dim url As String = "https://www.example.com"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf(url)
pdf.SaveAs("webpage.pdf")
Console.WriteLine("PDF from URL created successfully!")
End Sub
End ModuleRenderUrlAsPdfIronPDF zapewnia pełne wykonanie JavaScript i nowoczesne wsparcie CSS. Aby uzyskać więcej opcji, zapoznaj się z dokumentacją dotyczącą konwersji URL na PDF.
Plik HTML z niestandardowymi ustawieniami
Ten przykład demonstruje kluczową różnicę we wzorcach konfiguracji — OutputArea EO.Pdf z calami versus indywidualne właściwości marginesów IronPDF w milimetrach.
Wdrożenie EO.PDF:
// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
HtmlToPdfOptions options = new HtmlToPdfOptions();
options.PageSize = PdfPageSizes.A4;
options.OutputArea = new RectangleF(0.5f, 0.5f, 7.5f, 10.5f);
HtmlToPdf.ConvertUrl("file:///C:/input.html", "output.pdf", options);
Console.WriteLine("PDF with custom settings created.");
}
}' NuGet: Install-Package EO.Pdf
Imports EO.Pdf
Imports System
Module Program
Sub Main()
Dim options As New HtmlToPdfOptions()
options.PageSize = PdfPageSizes.A4
options.OutputArea = New RectangleF(0.5F, 0.5F, 7.5F, 10.5F)
HtmlToPdf.ConvertUrl("file:///C:/input.html", "output.pdf", options)
Console.WriteLine("PDF with custom settings created.")
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.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var pdf = renderer.RenderHtmlFileAsPdf("C:/input.html");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF with custom settings created.");
}
}' NuGet: Install-Package IronPdf
Imports IronPdf
Imports IronPdf.Rendering
Imports System
Module Program
Sub Main()
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.MarginLeft = 20
renderer.RenderingOptions.MarginRight = 20
Dim pdf = renderer.RenderHtmlFileAsPdf("C:/input.html")
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF with custom settings created.")
End Sub
End ModuleZwróć uwagę na konwersję jednostek: EO.Pdf używa cali w OutputArea, podczas gdy IronPDF wykorzystuje milimetry. Konwertuj przy użyciu: inches × 25.4 = mm. Aby uzyskać więcej opcji, zapoznaj się z dokumentacją opcji renderowania.
Łączenie wielu plików PDF
Obie biblioteki udostępniają statyczny PdfDocument.Merge do łączenia dokumentów — EO.Pdf nie ma metody Append w instancji, więc wszelki kod używający doc.Append(other) jest nieprawidłowy i musi zostać przeniesiony do Merge.
Wdrożenie EO.PDF:
// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
PdfDocument doc1 = new PdfDocument("file1.pdf");
PdfDocument doc2 = new PdfDocument("file2.pdf");
// EO.Pdf has no Append; merge is a static method that returns a new PdfDocument.
PdfDocument mergedDoc = PdfDocument.Merge(doc1, doc2);
mergedDoc.Save("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}Imports EO.Pdf
Imports System
Module Program
Sub Main()
Dim doc1 As New PdfDocument("file1.pdf")
Dim doc2 As New PdfDocument("file2.pdf")
' EO.Pdf has no Append; merge is a static method that returns a new PdfDocument.
Dim mergedDoc As PdfDocument = PdfDocument.Merge(doc1, doc2)
mergedDoc.Save("merged.pdf")
Console.WriteLine("PDFs merged successfully!")
End Sub
End ModuleWdrożenie IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.pdf");
var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
merged.SaveAs("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}' NuGet: Install-Package IronPdf
Imports IronPdf
Imports System
Imports System.Collections.Generic
Module Program
Sub Main()
Dim pdf1 = PdfDocument.FromFile("file1.pdf")
Dim pdf2 = PdfDocument.FromFile("file2.pdf")
Dim merged = PdfDocument.Merge(New List(Of PdfDocument) From {pdf1, pdf2})
merged.SaveAs("merged.pdf")
Console.WriteLine("PDFs merged successfully!")
End Sub
End ModuleStatyczny MergeIronPDF akceptuje listę dokumentów lub List<PdfDocument>. Zwróć uwagę na zmianę z konstruktora (new PdfDocument(path)) na statyczną fabrykę (PdfDocument.FromFile(path)). Aby uzyskać więcej opcji, zapoznaj się z dokumentacją dotyczącą scałania plików PDF.
Ważne uwagi dotyczące migracji
Konwersja jednostek marginesu
EO.Pdf używa cali w OutputArea.IronPDF używa milimetrów. Konwertuj przy użyciu: inches × 25.4 = mm
// EO.Pdf - 0.5 inch margins
options.OutputArea = new RectangleF(0.5f, 0.5f, 7.5f, 10.5f);
//IronPDF- equivalent in millimeters (0.5" = 12.7mm)
renderer.RenderingOptions.MarginTop = 12.7;
renderer.RenderingOptions.MarginBottom = 12.7;
renderer.RenderingOptions.MarginLeft = 12.7;
renderer.RenderingOptions.MarginRight = 12.7;' EO.Pdf - 0.5 inch margins
options.OutputArea = New RectangleF(0.5F, 0.5F, 7.5F, 10.5F)
' IronPDF- equivalent in millimeters (0.5" = 12.7mm)
renderer.RenderingOptions.MarginTop = 12.7
renderer.RenderingOptions.MarginBottom = 12.7
renderer.RenderingOptions.MarginLeft = 12.7
renderer.RenderingOptions.MarginRight = 12.7Konfiguracja statyczna a konfiguracja oparta na instancjach
Zamień wszystkie HtmlToPdf.Options.X na renderer.RenderingOptions.X:
// EO.Pdf - static options (NOT thread-safe!)
HtmlToPdf.Options.PageSize = PdfPageSizes.A4;
//IronPDF- instance options (thread-safe)
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;' EO.Pdf - static options (NOT thread-safe!)
HtmlToPdf.Options.PageSize = PdfPageSizes.A4
' IronPDF- instance options (thread-safe)
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4Migracja z ACM do HTML
Jeśli używasz Zaawansowanego Modelu Treści (AcmRender, AcmText, AcmBlock) EO.Pdf, przejdź na standardowe HTML/CSS:
// EO.Pdf ACM approach
var acmContent = new AcmContent();
acmContent.Add(new AcmText("Sample Text"));
//IronPDF HTML approach
var html = "<div>Sample Text</div>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
Wzorzec zapisywania dwuetapowego
EO.Pdf zapisuje bezpośrednio w ConvertHtml().IronPDF zwraca obiekt PdfDocument, następnie wywołujesz SaveAs():
// EO.Pdf - one step
HtmlToPdf.ConvertHtml(html, "output.pdf");
//IronPDF- two steps (enables manipulation before save)
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");' EO.Pdf - one step
HtmlToPdf.ConvertHtml(html, "output.pdf")
' IronPDF- two steps (enables manipulation before save)
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")Konstruktor do statycznej fabryki
Zamień new PdfDocument(path) na PdfDocument.FromFile(path):
// EO.Pdf
var doc = new PdfDocument("file.pdf");
// IronPDF
var doc = PdfDocument.FromFile("file.pdf");' EO.Pdf
Dim doc = New PdfDocument("file.pdf")
' IronPDF
Dim doc = PdfDocument.FromFile("file.pdf")Lista kontrolna po migracji
Po zakończeniu migracji kodu sprawdź, czy:
- Wizualne porównanie wygenerowanych plików PDF
- Sprawdź, czy nagłówki/stopki wyświetlają się poprawnie
- Sprawdź ustawienia bezpieczeństwa/szyfrowania
- Sprawdzanie poprawności operacji scałania
- Testy porównawcze wydajności
- Testowanie na różnych platformach (Windows, Linux, macOS)
- Usuń pliki licencji EO.PDF
- Aktualizacja dokumentacji
Dodatkowe zasoby
- Dokumentacja IronPDF
- Samouczki dotyczące konwersji HTML do PDF
- Dokumentacja API
- Pakiet NuGet
- Opcje licencyjne
Migracja z EO.Pdf do IronPDF rozwiązuje bagaż z ery IE/Trident i obawy związane z bezpieczeństwem wątków globalnych opcji statycznych EO.Pdf. Przejście do konfiguracji opartej na instancji zapewnia, że twój kod generujący PDF działa niezawodnie przy jednoczesnym obciążeniu, a wsparcie IronPDF dla platform krzyżowych rozszerza wdrażanie poza Windows na Linux, macOS i Docker.

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.