Jak przejść z ABCpdf for .NET na IronPDF
Przejście z ABCpdf dla .NET na IronPDF for .NET to strategiczna aktualizacja dla zespołów programistów, które chcą uprościć licencjonowanie, uzyskać nowoczesną dokumentację i natywną obsługę wielu platform. Ten szczegółowy przewodnik zawiera szczegółowy plan migracji, wraz z mapowaniami API i przykładami konwersji kodu z rzeczywistych scenariuszy.
Niezależnie od tego, czy pracujesz z .NET Framework 4.6.2, czy celujesz w .NET 9, ten przewodnik po migracji ABCpdf zapewnia łatwe przejście do silnika renderującego opartego na Chrome w IronPDF.
Dlaczego warto rozważyć migrację do ABCpdf?
ABCpdf od WebSupergoo (aktualna linia: v13.4.4, wydanie 9 kwietnia 2026) od lat jest zdolną biblioteką PDF dla .NET. Jednak kilka czynników sprawia, że IronPDF jest atrakcyjną alternatywą dla nowoczesnych zespołów deweloperskich.
Złożoność licencji
ABCpdf używa modelu licencjonowania warstwowego, który może wymagać wysiłku przy nawigacji. Standardowa licencja na jeden komputer to $329 (tylko 32-bitowa); Professional to $479; Profesjonalna redystrybucja to $4 790; grupowa licencja wynosi $33 530. Licencje są wieczyste, a klucze v13 obejmują również v8–v12. Wielu programistów zgłasza labirynt poziomów jako znaczące obciążenie administracyjne przy budżetowaniu projektów.
Architektura zorientowana na Windows (do v13)
ABCpdf był tylko na Windows przez większość swojej historii. Wsparcie dla Linux dodano w v13 za pomocą pakietów uruchomieniowych ABCpdf.ABCChrome117.Linux i ABCpdf.ABCChrome123.Linux. macOS nie jest obsługiwany, a kilka funkcji specyficznych dla Windows (XPS, WPF) pozostaje niedostępnych na Linux.
Styl dokumentacji
Dokumentacja ABCpdf, choć wyczerpująca, jest napisana w starszym stylu, który może wydawać się przestarzały w porównaniu z nowoczesnymi standardami dokumentacji API. Nowi użytkownicy często mają trudności ze znalezieniem dokładnie takich przykładów, jakich potrzebują, zwłaszcza podczas pracy z nowszymi wersjami .NET.
Obróbka konfiguracji silnika
ABCpdf wymaga jawnego wyboru silnika — EngineType.Chrome123 (domyślny w v13), Chrome117, Chrome86, Chrome65, Gecko, WebKit, lub MSHtml — oraz ręcznego zarządzania zasobami z wywołaniami doc.Clear(). Powoduje to dodanie standardowego kodu do każdej operacji na plikach PDF, czego współcześni programiści woleliby uniknąć.
IronPDF vs ABCpdf: Porównanie funkcji
Poniższa tabela porównawcza przedstawia kluczowe różnice między dwiema bibliotekami .NET do obsługi plików PDF:
| Funkcja | ABCpdf dla .NET | IronPDF |
|---|---|---|
| Silnik renderujący | ABCChrome (Chrome123/117/86/65), Gecko, WebKit, MSHtml | Pełny Chromium (CSS3, JavaScript) |
| Wielopłatformowe | Pierwszeństwo dla Windowsa; Linux dodany w v13 (brak macOS) | Natywne systemy Windows, Linux, macOS, Docker |
| Model licencyjny | Standard $329 / Pro $479 / Pro Redystrybucja $4 790 / Grupa $33 530, wieczyste | Prosta, przejrzysta polityka cenowa |
| Wsparcie .NET | .NET Framework 4.0+, .NET Core 3.0+, .NET 5+ | Framework 4.6.2 do .NET Framework 9 |
| Zarządzanie zasobami | Wymagane ręczne doc.Clear() |
IDisposable z instrukcjami using |
| Konfiguracja licencji | Często korzysta z rejestru | Prosty klucz licencyjny oparty na kodzie |
| Dokumentacja | Styl przestarzały | Nowoczesna dokumentacja z obszernymi przykładami |
Przed rozpoczęciem migracji
Wymagania wstępne
Upewnij się, że Twoje środowisko programistyczne spełnia następujące wymagania:
- .NET Framework 4.6.2+ lub .NET Core 3.1+ / .NET 5-9
- Visual Studio 2019+ lub JetBrains Rider
- Dostęp do menedżera pakietów NuGet
- Klucz licencyjny IronPDF (dostępna bezpłatna wersja próbna)
Znajdź wszystkie odniesienia do ABCpdf
Uruchom te polecenia w katalogu rozwiązania, aby zlokalizować wszystkie pliki korzystające z biblioteki ABCpdf dla platformy .NET:
grep -r "using WebSupergoo" --include="*.cs" .
grep -r "ABCpdf" --include="*.csproj" .
grep -r "using WebSupergoo" --include="*.cs" .
grep -r "ABCpdf" --include="*.csproj" .
Niniejszy audyt identyfikuje wszystkie pliki wymagające modyfikacji, zapewniając pełny zakres migracji.
Zmiany wymagające dostosowania
Zrozumienie różnic architektonicznych między ABCpdf dla .NET a IronPDF pozwala uniknąć niespodzianek podczas migracji:
| Kategoria | Zachowanie ABCpdf | Działanie IronPDF | Działanie migracyjne |
|---|---|---|---|
| Model obiektowy | Klasa Doc jest centralna |
ChromePdfRenderer + PdfDocument |
Oddziel renderowanie od dokumentu |
| Porządkowanie zasobów | Ręczne doc.Clear() |
Wzorzec IDisposable | Użyj instrukcji using |
| Wybór silnika | doc.HtmlOptions.Engine = EngineType.Chrome123 (lub MSHtml) |
Wbudowany Chromium | Usuń konfigurację silnika |
| Indeksowanie stron | 1-based (doc.Page = 1) |
0-based (pdf.Pages[0]) |
Dostosuj odniesienia do indeksu |
| Współrzędne | Oparte na punktach z doc.Rect |
Marginesy oparte na CSS | Użyj CSS lub RenderingOptions |
Szybki start: 5-minutowa migracja
Krok 1: Zaktualizuj pakiety NuGet
# Remove ABCpdf
dotnet remove package ABCpdf
# Install IronPDF
dotnet add package IronPdf
# Remove ABCpdf
dotnet remove package ABCpdf
# Install IronPDF
dotnet add package IronPdf
Krok 2: Ustaw swój klucz licencyjny
Dodaj to przy uruchomieniu aplikacji, przed wykonaniem jakichkolwiek operacji IronPDF:
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// 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"
Krok 3: Globalne wyszukiwanie i zamiana
Zaktualizuj wszystkie odniesienia do przestrzeni nazw w całym kodzie:
| Znajdź | Zastąp przez |
|---|---|
using WebSupergoo.ABCpdf13; |
using IronPdf; |
using WebSupergoo.ABCpdf13.Objects; |
using IronPdf; |
using WebSupergoo.ABCpdf12; |
using IronPdf; |
using WebSupergoo.ABCpdf11; |
using IronPdf; |
Kompletna dokumentacija API
Metody tworzenia dokumentów
Poniższa tabela przedstawia mapowanie metod ABCpdf dla .NET na ich odpowiedniki w IronPDF for .NET:
| Metoda ABCpdf | Metoda IronPDF |
|---|---|
new Doc() |
new ChromePdfRenderer() |
doc.AddImageUrl(url) |
renderer.RenderUrlAsPdf(url) |
doc.AddImageHtml(html) |
renderer.RenderHtmlAsPdf(html) |
doc.AddImageFile(path) |
renderer.RenderHtmlFileAsPdf(path) |
doc.Read(path) |
PdfDocument.FromFile(path) |
doc.Save(path) |
pdf.SaveAs(path) |
doc.GetData() |
pdf.BinaryData |
doc.Clear() |
Użyj instrukcji using |
Metody manipulacji stronami
| Metoda ABCpdf | Metoda IronPDF |
|---|---|
doc.PageCount |
pdf.PageCount |
doc.Page = n |
pdf.Pages[n-1] |
doc.Delete(pageId) |
pdf.RemovePages(index) |
doc.Append(otherDoc) |
PdfDocument.Merge(pdf1, pdf2) |
doc.Rect.Inset(x, y) |
RenderingOptions.MarginTop/Bottom/Left/Right |
Metody bezpieczeństwa i szyfrowania
| Metoda ABCpdf | Metoda IronPDF |
|---|---|
doc.Encryption.Password |
pdf.SecuritySettings.OwnerPassword |
doc.Encryption.CanPrint |
pdf.SecuritySettings.AllowUserPrinting |
doc.Encryption.CanCopy |
pdf.SecuritySettings.AllowUserCopyPasteContent |
doc.SetInfo("Title", value) |
pdf.MetaData.Title |
Przykłady migracji kodu
Przykład 1: Konwersja HTML do PDF z adresu URL
Ten przykład pokazuje konwersję strony internetowej do formatu PDF, co jest jednym z najczęstszych zadań związanych z generowaniem plików PDF.
Wdrożenie ABCpdf dla .NET:
// NuGet: Install-Package ABCpdf
using System;
using WebSupergoo.ABCpdf13;
using WebSupergoo.ABCpdf13.Objects;
class Program
{
static void Main()
{
Doc doc = new Doc();
doc.HtmlOptions.Engine = EngineType.Chrome123;
doc.AddImageUrl("https://www.example.com");
doc.Save("output.pdf");
doc.Clear();
}
}
// NuGet: Install-Package ABCpdf
using System;
using WebSupergoo.ABCpdf13;
using WebSupergoo.ABCpdf13.Objects;
class Program
{
static void Main()
{
Doc doc = new Doc();
doc.HtmlOptions.Engine = EngineType.Chrome123;
doc.AddImageUrl("https://www.example.com");
doc.Save("output.pdf");
doc.Clear();
}
}
Imports System
Imports WebSupergoo.ABCpdf13
Imports WebSupergoo.ABCpdf13.Objects
Class Program
Shared Sub Main()
Dim doc As New Doc()
doc.HtmlOptions.Engine = EngineType.Chrome123
doc.AddImageUrl("https://www.example.com")
doc.Save("output.pdf")
doc.Clear()
End Sub
End Class
Wdrożenie IronPDF:
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("output.pdf");
}
}
Imports System
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("output.pdf")
End Sub
End Class
Podejście IronPDF eliminuje potrzebę jawnej konfiguracji silnika i ręcznego czyszczenia, zmniejszając złożoność kodu przy zachowaniu pełnych możliwości renderowania w przeglądarce Chrome.
Przykład 2: Ciąg znaków HTML do pliku PDF
Konwersja ciągów HTML do formatu PDF jest niezbędna do generowania dynamicznych raportów i dokumentów.
Wdrożenie ABCpdf dla .NET:
// NuGet: Install-Package ABCpdf
using System;
using WebSupergoo.ABCpdf13;
using WebSupergoo.ABCpdf13.Objects;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
Doc doc = new Doc();
doc.HtmlOptions.Engine = EngineType.Chrome123;
doc.AddImageHtml(html);
doc.Save("output.pdf");
doc.Clear();
}
}
// NuGet: Install-Package ABCpdf
using System;
using WebSupergoo.ABCpdf13;
using WebSupergoo.ABCpdf13.Objects;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
Doc doc = new Doc();
doc.HtmlOptions.Engine = EngineType.Chrome123;
doc.AddImageHtml(html);
doc.Save("output.pdf");
doc.Clear();
}
}
Imports System
Imports WebSupergoo.ABCpdf13
Imports WebSupergoo.ABCpdf13.Objects
Module Program
Sub Main()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"
Dim doc As New Doc()
doc.HtmlOptions.Engine = EngineType.Chrome123
doc.AddImageHtml(html)
doc.Save("output.pdf")
doc.Clear()
End Sub
End Module
Wdrożenie IronPDF:
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
Imports System
Imports IronPdf
Module Program
Sub Main()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Module
Wersja IronPDF wymaga mniej linii kodu i domyślnie korzysta z renderowania Chrome, co zapewnia spójny wynik na wszystkich platformach.
Przykład 3: Łączenie wielu plików PDF
Łączenie wielu dokumentów PDF jest częstym wymaganiem w procesach przetwarzania dokumentów.
Wdrożenie ABCpdf dla .NET:
// NuGet: Install-Package ABCpdf
using System;
using WebSupergoo.ABCpdf13;
using WebSupergoo.ABCpdf13.Objects;
class Program
{
static void Main()
{
Doc doc1 = new Doc();
doc1.Read("document1.pdf");
Doc doc2 = new Doc();
doc2.Read("document2.pdf");
doc1.Append(doc2);
doc1.Save("merged.pdf");
doc1.Clear();
doc2.Clear();
}
}
// NuGet: Install-Package ABCpdf
using System;
using WebSupergoo.ABCpdf13;
using WebSupergoo.ABCpdf13.Objects;
class Program
{
static void Main()
{
Doc doc1 = new Doc();
doc1.Read("document1.pdf");
Doc doc2 = new Doc();
doc2.Read("document2.pdf");
doc1.Append(doc2);
doc1.Save("merged.pdf");
doc1.Clear();
doc2.Clear();
}
}
Imports System
Imports WebSupergoo.ABCpdf13
Imports WebSupergoo.ABCpdf13.Objects
Class Program
Shared Sub Main()
Dim doc1 As New Doc()
doc1.Read("document1.pdf")
Dim doc2 As New Doc()
doc2.Read("document2.pdf")
doc1.Append(doc2)
doc1.Save("merged.pdf")
doc1.Clear()
doc2.Clear()
End Sub
End Class
Wdrożenie IronPDF:
// NuGet: Install-Package IronPdf
using System;
using System.Collections.Generic;
using IronPdf;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using System;
using System.Collections.Generic;
using IronPdf;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
Imports System
Imports System.Collections.Generic
Imports IronPdf
Class Program
Shared Sub Main()
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
End Sub
End Class
Statyczna metoda Merge w IronPDF dostarcza czystsze API, które akceptuje wiele dokumentów, eliminując potrzebę śledzenia i czyszczenia pojedynczych instancji Doc.
Przykład 4: Kompletny wzorzec migracji z marginesami
Ten przykład pokazuje kompletną migrację przed i po, dotyczącą generowania plików PDF z niestandardowymi marginesami.
Przed (ABCpdf dla .NET):
using WebSupergoo.ABCpdf13;
using WebSupergoo.ABCpdf13.Objects;
public byte[] GeneratePdf(string html)
{
Doc doc = new Doc();
doc.HtmlOptions.Engine = EngineType.Chrome123;
doc.Rect.Inset(20, 20);
doc.AddImageHtml(html);
byte[] data = doc.GetData();
doc.Clear(); // Manual cleanup required
return data;
}
using WebSupergoo.ABCpdf13;
using WebSupergoo.ABCpdf13.Objects;
public byte[] GeneratePdf(string html)
{
Doc doc = new Doc();
doc.HtmlOptions.Engine = EngineType.Chrome123;
doc.Rect.Inset(20, 20);
doc.AddImageHtml(html);
byte[] data = doc.GetData();
doc.Clear(); // Manual cleanup required
return data;
}
Imports WebSupergoo.ABCpdf13
Imports WebSupergoo.ABCpdf13.Objects
Public Function GeneratePdf(html As String) As Byte()
Dim doc As New Doc()
doc.HtmlOptions.Engine = EngineType.Chrome123
doc.Rect.Inset(20, 20)
doc.AddImageHtml(html)
Dim data As Byte() = doc.GetData()
doc.Clear() ' Manual cleanup required
Return data
End Function
Po (IronPDF):
using IronPdf;
public byte[] GeneratePdf(string html)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
using var pdf = renderer.RenderHtmlAsPdf(html);
return pdf.BinaryData; // Automatic cleanup with 'using'
}
using IronPdf;
public byte[] GeneratePdf(string html)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
using var pdf = renderer.RenderHtmlAsPdf(html);
return pdf.BinaryData; // Automatic cleanup with 'using'
}
Imports IronPdf
Public Function GeneratePdf(html As String) As Byte()
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.MarginLeft = 20
renderer.RenderingOptions.MarginRight = 20
Using pdf = renderer.RenderHtmlAsPdf(html)
Return pdf.BinaryData ' Automatic cleanup with 'Using'
End Using
End Function
Zaawansowane scenariusze migracji
Aplikacja internetowa ASP.NET Core .NET Core
Dla zespołów budujących aplikacje webowe z .NET 6+, oto zalecany wzorzec:
Wzór ABCpdf:
[HttpPost]
public IActionResult GeneratePdf([FromBody] ReportRequest request)
{
Doc doc = new Doc();
doc.HtmlOptions.Engine = EngineType.Chrome123;
doc.AddImageHtml(request.Html);
byte[] pdfBytes = doc.GetData();
doc.Clear();
return File(pdfBytes, "application/pdf", "report.pdf");
}
[HttpPost]
public IActionResult GeneratePdf([FromBody] ReportRequest request)
{
Doc doc = new Doc();
doc.HtmlOptions.Engine = EngineType.Chrome123;
doc.AddImageHtml(request.Html);
byte[] pdfBytes = doc.GetData();
doc.Clear();
return File(pdfBytes, "application/pdf", "report.pdf");
}
<HttpPost>
Public Function GeneratePdf(<FromBody> request As ReportRequest) As IActionResult
Dim doc As New Doc()
doc.HtmlOptions.Engine = EngineType.Chrome123
doc.AddImageHtml(request.Html)
Dim pdfBytes As Byte() = doc.GetData()
doc.Clear()
Return File(pdfBytes, "application/pdf", "report.pdf")
End Function
Wzór IronPDF:
[HttpPost]
public IActionResult GeneratePdf([FromBody] ReportRequest request)
{
var renderer = new ChromePdfRenderer();
using var pdf = renderer.RenderHtmlAsPdf(request.Html);
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
[HttpPost]
public IActionResult GeneratePdf([FromBody] ReportRequest request)
{
var renderer = new ChromePdfRenderer();
using var pdf = renderer.RenderHtmlAsPdf(request.Html);
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
<HttpPost>
Public Function GeneratePdf(<FromBody> request As ReportRequest) As IActionResult
Dim renderer As New ChromePdfRenderer()
Using pdf = renderer.RenderHtmlAsPdf(request.Html)
Return File(pdf.BinaryData, "application/pdf", "report.pdf")
End Using
End Function
Asynchroniczne generowanie plików PDF
ABCpdf nie obsługuje natywnie trybu asynchronicznego.IronPDF udostępnia metody asynchroniczne zapewniające lepszą wydajność aplikacji internetowych:
using IronPdf;
public async Task<byte[]> GeneratePdfAsync(string html)
{
var renderer = new ChromePdfRenderer();
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
using IronPdf;
public async Task<byte[]> GeneratePdfAsync(string html)
{
var renderer = new ChromePdfRenderer();
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
Imports IronPdf
Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte())
Dim renderer As New ChromePdfRenderer()
Using pdf = Await renderer.RenderHtmlAsPdfAsync(html)
Return pdf.BinaryData
End Using
End Function
Konfiguracja wstrzykiwania zależności
Zarejestruj IronPDF w nowoczesnych aplikacjach .NET, używając bieżących wzorców C#:
// Program.cs (.NET 6+)
builder.Services.AddSingleton<ChromePdfRenderer>();
// Or create a service wrapper
public interface IPdfService
{
Task<byte[]> GeneratePdfAsync(string html);
}
public class IronPdfService : IPdfService
{
private readonly ChromePdfRenderer _renderer;
public IronPdfService()
{
_renderer = new ChromePdfRenderer();
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
}
public async Task<byte[]> GeneratePdfAsync(string html)
{
using var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
}
// Register: builder.Services.AddSingleton<IPdfService, IronPdfService>();
// Program.cs (.NET 6+)
builder.Services.AddSingleton<ChromePdfRenderer>();
// Or create a service wrapper
public interface IPdfService
{
Task<byte[]> GeneratePdfAsync(string html);
}
public class IronPdfService : IPdfService
{
private readonly ChromePdfRenderer _renderer;
public IronPdfService()
{
_renderer = new ChromePdfRenderer();
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
}
public async Task<byte[]> GeneratePdfAsync(string html)
{
using var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
}
// Register: builder.Services.AddSingleton<IPdfService, IronPdfService>();
Imports Microsoft.Extensions.DependencyInjection
Imports System.Threading.Tasks
' Program.vb (.NET 6+)
builder.Services.AddSingleton(Of ChromePdfRenderer)()
' Or create a service wrapper
Public Interface IPdfService
Function GeneratePdfAsync(html As String) As Task(Of Byte())
End Interface
Public Class IronPdfService
Implements IPdfService
Private ReadOnly _renderer As ChromePdfRenderer
Public Sub New()
_renderer = New ChromePdfRenderer()
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
End Sub
Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte()) Implements IPdfService.GeneratePdfAsync
Using pdf = Await _renderer.RenderHtmlAsPdfAsync(html)
Return pdf.BinaryData
End Using
End Function
End Class
' Register: builder.Services.AddSingleton(Of IPdfService, IronPdfService)()
Wskazówki dotyczące optymalizacji wydajności
Ponowne wykorzystanie renderera do operacji wsadowych
// Good: Single renderer instance
var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs($"output_{i}.pdf");
}
// Bad: New renderer each time (slower startup)
foreach (var html in htmlList)
{
var renderer = new ChromePdfRenderer(); // Overhead!
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs($"output_{i}.pdf");
}
// Good: Single renderer instance
var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs($"output_{i}.pdf");
}
// Bad: New renderer each time (slower startup)
foreach (var html in htmlList)
{
var renderer = new ChromePdfRenderer(); // Overhead!
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs($"output_{i}.pdf");
}
Imports System
' Good: Single renderer instance
Dim renderer As New ChromePdfRenderer()
For Each html In htmlList
Using pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs($"output_{i}.pdf")
End Using
Next
' Bad: New renderer each time (slower startup)
For Each html In htmlList
Dim renderer As New ChromePdfRenderer() ' Overhead!
Using pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs($"output_{i}.pdf")
End Using
Next
Porównanie zużycia pamięci
| Scenariusz | ABCpdf dla .NET | IronPDF |
|---|---|---|
| Pojedynczy plik PDF o objętości 10 stron | ~80 MB | ~50 MB |
| Partia 100 plików PDF | Wysoki (ręczne czyszczenie) | ~100 MB |
| Duży plik HTML (5 MB+) | Zmienna | ~150 MB |
Rozwiązywanie typowych problemów związanych z migracją
Plik PDF wyświetla się jako pusty
Objaw: Wygenerowany plik PDF zawiera puste strony po migracji.
Rozwiązanie: Treść JavaScript może nie zostać w pełni załadowana przed renderowaniem:
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.RenderDelay(2000); // Wait 2 seconds
// Or wait for specific element:
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded");
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.RenderDelay(2000); // Wait 2 seconds
// Or wait for specific element:
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded");
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.WaitFor.RenderDelay(2000) ' Wait 2 seconds
' Or wait for specific element:
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded")
Brak nagłówków/stopek
Objaw: TextHeader/TextFooter nie są widoczne w wynikach.
Rozwiązanie: Upewnij się, że marginesy pozostawiają miejsce na treść nagłówka/stopki:
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.MarginTop = 40; // mm - leave room for header
renderer.RenderingOptions.MarginBottom = 40; // mm - leave room for footer
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Header Text",
FontSize = 12
};
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.MarginTop = 40; // mm - leave room for header
renderer.RenderingOptions.MarginBottom = 40; // mm - leave room for footer
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Header Text",
FontSize = 12
};
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.MarginTop = 40 ' mm - leave room for header
renderer.RenderingOptions.MarginBottom = 40 ' mm - leave room for footer
renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
.CenterText = "Header Text",
.FontSize = 12
}
Lista kontrolna migracji
Przed migracją
- Audytuj całe użycie ABCpdf z
grep -r "WebSupergoo" --include="*.cs" . - Dokumentacja aktualnych wymagań dotyczących wyjścia PDF
- Utwórz przypadki testowe z przykładowymi plikami PDF do porównania
- Uzyskaj klucz licencyjny IronPDF
- Kopia zapasowa kodu źródłowego
Podczas migracji
- Usuń pakiet ABCpdf NuGet
- Zainstaluj pakiet NuGet IronPDF
- Dodaj klucz licencyjny do uruchamiania aplikacji
- Zaktualizuj wszystkie instrukcje
using - Przekształć tworzenie
DocnaChromePdfRenderer - Zastąp
doc.Clear()instrukcjamiusing - Aktualizacja wywołań metod zgodnie z mapowaniem API
- Konwersja układów opartych na współrzędnych na marginesy CSS
Po migracji
- Uruchom wszystkie istniejące testy PDF
- Wizualne porównanie wyników w formacie PDF (ABCpdf vs IronPDF)
- Przetestuj wszystkie procesy związane z plikami PDF w środowisku testowym
- Porównanie wyników testów wydajnościowych
- Usuń konfigurację licencji ABCpdf
- Aktualizacja zależności potoku CI/CD

