Jak używać JavaScript z HTML do PDF przy użyciu C#
Dlaczego warto przejść zDynamicPDFna IronPDF?
Fragmentacja produktówDynamicPDFjest częstym motorem migracji. Zrozumienie modelu licencyjnego pomaga ocenić prawdziwe koszty bieżącej implementacji.
Problem fragmentacji produktów
DynamicPDF (ceTe Software) dostarcza funkcjonalność PDF jako oddzielnie licencjonowane pakiety:
- DynamicPDF Core Suite (
ceTe.DynamicPDF.CoreSuite.NET, v12.43.0): Bundles Generator, Merger, and ReportWriter - DynamicPDF HTML Converter (
ceTe.DynamicPDF.HtmlConverter.NET, v3.3.0): HTML-na-PDF jako osobny dodatek - DynamicPDF Converter (
ceTe.DynamicPDF.Converter.NET, v3.32.0): Konwersja Office i 50+ formatów plików - DynamicPDF PrintManager (
ceTe.DynamicPDF.Printing.NET): Programatyczne drukowanie - DynamicPDF Rasterizer (
ceTe.DynamicPDF.Rasterizer.NET): PDF-to-image - DynamicPDF Viewer (
ceTe.DynamicPDF.Viewer.NET): Kontrola widoku WinForms/WPF
Generator, Merger i ReportWriter są zintegrowane w Core Suite, ale renderowanie HTML, rasteryzacja, drukowanie i przeglądanie wciąż wymagają oddzielnego zakupu.IronPDFłączy te funkcje w jednej bibliotece i licencji.
Porównanie architektur
| Aspekt | DynamicPDF | IronPDF |
|---|---|---|
| Model produktu | Fragmentaryczne (5+ produktów) | Biblioteka typu "wszystko w jednym" |
| Licencjonowanie | Wymagane są liczne licencje | Licencja pojedyncza |
| HTML do PDF | Oddzielny zakup dodatku | Wbudowany, oparty na Chromium |
| Obsługa CSS | Ograniczone (wymaga dodatku) | Pełna obsługa CSS3 z Flexbox/Grid |
| Styl API | Pozycjonowanie oparte na współrzędnych | HTML/CSS + API do manipulacji |
| Krzywa uczenia się | Steep (wiele interfejsów API) | Gentle (technologie internetowe) |
| Nowoczesny .NET | .NET Standard 2.0 / .NET 6 / .NET 8 / .NET Framework 4.6.2 | .NET 6/7/8/9+ natywne |
Kluczowe korzyści z migracji
- Pojedynczy pakiet: Jeden pakiet NuGet zastępuje 3–5 pakietów DynamicPDF
- Nowoczesne renderowanie: silnik Chromium a renderowanie tradycyjne
- Technologie internetowe: Użyj HTML/CSS zamiast pozycjonowania opartego na współrzędnych
- Prostsze API: mniej kodu, większa czytelność, łatwiejsza konserwacja
- Brak konieczności dokupowania dodatków: HTML, scałanie, zabezpieczenia – wszystko w cenie
Przygotowania przed migracją
Wymagania wstępne
Upewnij się, że Twoje środowisko spełnia następujące wymagania:
- .NET Framework 4.6.2+ or .NET 6/7/8/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)
Audyt wykorzystania DynamicPDF
Uruchom te polecenia w katalogu rozwiązania, aby zidentyfikować wszystkie odwołania do DynamicPDF:
# Find allDynamicPDFreferences
grep -r "ceTe.DynamicPDF\|DynamicPDF" --include="*.cs" --include="*.csproj" .
# Check NuGet packages
dotnet list package | grep -i dynamic
Typowe pakiety, na które należy zwrócić uwagę:
ceTe.DynamicPDF.CoreSuite.NET(Generator + Merger + ReportWriter)ceTe.DynamicPDF.HtmlConverter.NET(HTML-na-PDF dodatek)ceTe.DynamicPDF.Converter.NET(Office / multi-format to PDF)ceTe.DynamicPDF.Rasterizer.NET,ceTe.DynamicPDF.Printing.NET,ceTe.DynamicPDF.Viewer.NET
Zrozumienie zmiany paradygmatu
Najważniejszą zmianą przy migracji zDynamicPDFdo IronPDF jest fundamentalne podejście do tworzenia dokumentów.DynamicPDFwykorzystuje pozycjonowanie oparte na współrzędnych, w którym elementy umieszcza się w określonych współrzędnych X,Y na stronie.IronPDF wykorzystuje renderowanie HTML/CSS, co pozwala projektować przy użyciu technologii internetowych.
Ta zmiana paradygmatu oznacza konwersję elementów Label, TextArea i Table2 na ich odpowiedniki HTML — zmiana ta zwykle skutkuje bardziej czytelnym i łatwiejszym do utrzymania kodem.
Proces migracji krok po kroku
Krok 1: Zaktualizuj pakiety NuGet
Usuń pakiety DynamicPDF, które rzeczywiście masz zainstalowane i dodaj IronPDF:
# RemoveDynamicPDFpackages (only those you actually have)
dotnet remove package ceTe.DynamicPDF.CoreSuite.NET
dotnet remove package ceTe.DynamicPDF.HtmlConverter.NET
dotnet remove package ceTe.DynamicPDF.Converter.NET
dotnet remove package ceTe.DynamicPDF.Rasterizer.NET
dotnet remove package ceTe.DynamicPDF.Printing.NET
# Install IronPDF
dotnet add package IronPdf
Krok 2: Aktualizacja odniesień do przestrzeni nazw
Zastąp przestrzenie nazwDynamicPDFna IronPDF:
// Remove these
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
using ceTe.DynamicPDF.Conversion;
// 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
| KlasaDynamicPDF | Odpowiednik IronPDF |
|---|---|
Document | ChromePdfRenderer |
Document | PdfDocument |
Page | HTML <div> z przerwą na stronę |
MergeDocument | PdfDocument.Merge() |
HtmlConverter | ChromePdfRenderer |
Mapowanie elementów strony do HTML
| DynamicPDF PageElement | IronPDF/Równoważnik HTML |
|---|---|
Label | <p>, <span>, <div> |
TextArea | <div>, <p> z CSS |
Image | <img> tag |
Table2 | HTML <table> |
PageNumberingLabel | {page} / {total-pages} zastępniki |
Kluczowe mapowania API
| DynamicPDF | IronPDF |
|---|---|
Document + Page | ChromePdfRenderer |
Label, TextArea | HTML <p>, <div> |
Table2 | HTML <table> |
MergeDocument | PdfDocument.Merge() |
HtmlConverter | ChromePdfRenderer |
document.Draw() | pdf.SaveAs() / pdf.BinaryData |
PageNumberingLabel %%CP%% | {page} zastępnik |
Przykłady migracji kodu
Konwersja HTML do PDF
Konwersja HTML na PDF demonstruje wymógDynamicPDFna osobny dodatek HtmlConverter w przeciwieństwie do wbudowanego renderowania Chromium w IronPDF.
Wdrożenie DynamicPDF:
// NuGet: Install-Package ceTe.DynamicPDF.Converter.NET
// HTML-to-PDF is a separate add-on; CoreSuite alone does not include it.
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Conversion;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
HtmlConverter converter = new HtmlConverter(html);
converter.Convert("output.pdf");
}
}Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.Conversion
Class Program
Shared Sub Main()
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim converter As New HtmlConverter(html)
converter.Convert("output.pdf")
End Sub
End ClassWdrożenie IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}Imports IronPdf
Class Program
Shared Sub Main()
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End ClassIronPDF's ChromePdfRenderer zapewnia renderowanie oparte na Chromium z pełnym wsparciem CSS3, bez konieczności zakupu osobnego dodatku. Aby uzyskać więcej opcji, zapoznaj się z dokumentacją dotyczącą konwersji HTML do PDF.
Łączenie wielu plików PDF
Scalanie PDF pokazuje różnicę między klasą MergeDocumentDynamicPDF(wymagająca licencji produktu Merger) a wbudowaną metodą statyczną Merge IronPDF.
Wdrożenie DynamicPDF:
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;
class Program
{
static void Main()
{
MergeDocument document = new MergeDocument("document1.pdf");
document.Append("document2.pdf");
document.Draw("merged.pdf");
}
}Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.Merger
Class Program
Shared Sub Main()
Dim document As New MergeDocument("document1.pdf")
document.Append("document2.pdf")
document.Draw("merged.pdf")
End Sub
End ClassWdrożenie IronPDF:
// NuGet: Install-Package IronPdf
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 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 ClassStatyczna metoda MergeIronPDF akceptuje bezpośrednio wiele obiektów PdfDocument. Aby uzyskać więcej opcji, zapoznaj się z dokumentacją dotyczącą scałania plików PDF.
Dodawanie tekstu do plików PDF
Umiejscowienie tekstu ilustruje zmianę paradygmatu od elementów opartych na współrzędnych w DynamicPDF, do elementów opartych na HTML w IronPDF.
Wdrożenie DynamicPDF:
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
class Program
{
static void Main()
{
Document document = new Document();
Page page = new Page(PageSize.Letter);
Label label = new Label("Hello from DynamicPDF!", 0, 0, 504, 100);
page.Elements.Add(label);
document.Pages.Add(page);
document.Draw("output.pdf");
}
}Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.PageElements
Class Program
Shared Sub Main()
Dim document As New Document()
Dim page As New Page(PageSize.Letter)
Dim label As New Label("Hello from DynamicPDF!", 0, 0, 504, 100)
page.Elements.Add(label)
document.Pages.Add(page)
document.Draw("output.pdf")
End Sub
End ClassWdrożenie IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
var textStamper = new TextStamper()
{
Text = "Hello from IronPDF!",
FontSize = 20,
VerticalAlignment = VerticalAlignment.Top
};
pdf.ApplyStamp(textStamper);
pdf.SaveAs("output.pdf");
}
}Imports IronPdf
Imports IronPdf.Editing
Class Program
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>")
Dim textStamper As New TextStamper() With {
.Text = "Hello from IronPDF!",
.FontSize = 20,
.VerticalAlignment = VerticalAlignment.Top
}
pdf.ApplyStamp(textStamper)
pdf.SaveAs("output.pdf")
End Sub
End ClassTextStamperIronPDF zapewnia pozycjonowanie oparte na wyrównaniu zamiast umiejscowienia opartego na współrzędnych, co sprawia, że układy są bardziej dostosowalne do różnych rozmiarów stron. Aby uzyskać więcej opcji, zapoznaj się z dokumentacją dotyczącą znaków wodnych i stempli.
Przykład kompletnego generowania dokumentu
Ten obszerny przykład pokazuje konwersję dokumentuDynamicPDFzawierającego wiele elementów do formatu HTML przy użyciu biblioteki IronPDF.
Wdrożenie DynamicPDF:
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
// Generation (requires Generator license)
Document document = new Document();
Page page = new Page(PageSize.A4);
Label title = new Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18);
title.Align = TextAlign.Center;
page.Elements.Add(title);
Table2 table = new Table2(40, 60, 515, 500);
// ... complex table setup with columns, rows, cells...
page.Elements.Add(table);
document.Pages.Add(page);
document.Draw("invoice.pdf");
// Merging (requires Merger license)
MergeDocument mergeDoc = new MergeDocument("cover.pdf");
mergeDoc.Append("invoice.pdf");
mergeDoc.Draw("final.pdf");Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.PageElements
Imports ceTe.DynamicPDF.Merger
' Generation (requires Generator license)
Dim document As New Document()
Dim page As New Page(PageSize.A4)
Dim title As New Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18)
title.Align = TextAlign.Center
page.Elements.Add(title)
Dim table As New Table2(40, 60, 515, 500)
' ... complex table setup with columns, rows, cells...
page.Elements.Add(table)
document.Pages.Add(page)
document.Draw("invoice.pdf")
' Merging (requires Merger license)
Dim mergeDoc As New MergeDocument("cover.pdf")
mergeDoc.Append("invoice.pdf")
mergeDoc.Draw("final.pdf")Wdrożenie IronPDF:
using IronPdf;
var renderer = new ChromePdfRenderer();
// All features in one library
var html = @"
<html>
<head>
<style>
body { font-family: Helvetica, sans-serif; padding: 40px; }
h1 { text-align: center; font-size: 18pt; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ccc; padding: 8px; }
</style>
</head>
<body>
<h1>Invoice Report</h1>
<table>
<tr><th>Product</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
</table>
</body>
</html>";
var invoice = renderer.RenderHtmlAsPdf(html);
// Merging included - no separate license
var cover = PdfDocument.FromFile("cover.pdf");
var final = PdfDocument.Merge(cover, invoice);
final.SaveAs("final.pdf");Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' All features in one library
Dim html As String = "
<html>
<head>
<style>
body { font-family: Helvetica, sans-serif; padding: 40px; }
h1 { text-align: center; font-size: 18pt; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ccc; padding: 8px; }
</style>
</head>
<body>
<h1>Invoice Report</h1>
<table>
<tr><th>Product</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
</table>
</body>
</html>"
Dim invoice As PdfDocument = renderer.RenderHtmlAsPdf(html)
' Merging included - no separate license
Dim cover As PdfDocument = PdfDocument.FromFile("cover.pdf")
Dim final As PdfDocument = PdfDocument.Merge(cover, invoice)
final.SaveAs("final.pdf")Ważne uwagi dotyczące migracji
Pozycjonowanie oparte na współrzędnych do HTML/CSS
Fundamentalna zmiana paradygmatu wymaga przekształcenia pozycjonowania współrzędnych X,Y na układy oparte na CSS:
//DynamicPDF- coordinate-based
var label = new Label("Hello World", 100, 200, 300, 50);
//IronPDF- CSS positioning (if absolute positioning needed)
var html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>";
//IronPDF- preferred approach (flow-based)
var html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>";' DynamicPDF- coordinate-based
Dim label = New Label("Hello World", 100, 200, 300, 50)
' IronPDF- CSS positioning (if absolute positioning needed)
Dim html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>"
' IronPDF- preferred approach (flow-based)
html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>"Składnia numeracji stron
DynamicPDF i IronPDF używają różnych składni symboli zastępczych dla numerów stron:
//DynamicPDFplaceholders
"Page %%CP%% of %%TP%%"
//IronPDF placeholders
"Page {page} of {total-pages}"
Nagłówki i stopki
Konwertuj elementy TemplateDynamicPDFna HtmlHeaderFooter IronPDF:
//IronPDF header/footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};'IronPDF header/footer
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
.MaxHeight = 25
}Aby uzyskać więcej opcji nagłówków i stopek, zapoznaj się z dokumentacją dotyczącą nagłówków i stopek.
Ustawienia zabezpieczeń
//IronPDF security
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";'IronPDF security
pdf.SecuritySettings.OwnerPassword = "ownerPassword"
pdf.SecuritySettings.UserPassword = "userPassword"Aby uzyskać informacje na temat kompleksowych opcji bezpieczeństwa, zapoznaj się z dokumentacją dotyczącą szyfrowania.
Lista kontrolna po migracji
Po zakończeniu migracji kodu sprawdź, czy:
- Wizualne porównanie wygenerowanych plików PDF
- Sprawdź rozmieszczenie tekstu i układ
- Sprawdź renderowanie tabeli i przepełnienie
- Sprawdź nagłówki/stopki na wszystkich stronach
- Testowanie funkcji wypełniania formularzy
- Sprawdź zabezpieczenia/szyfrowanie
- Testy porównawcze wydajności
- Usuń nieużywane pliki licencji DynamicPDF
- Aktualizacja dokumentacji
Dodatkowe zasoby
- Dokumentacja IronPDF
- Samouczki dotyczące konwersji HTML do PDF
- Dokumentacja API
- Pakiet NuGet
- Opcje licencyjne
Migracja zDynamicPDFdo IronPDFłączy wiele licencji produktowych w jedną bibliotekę i zastępuje pozycjonowanie oparte na współrzędnych renderowaniem HTML/CSS na Chromium. Zespoły już zaznajomione z technologiami webowymi zazwyczaj uważają, że wynikowy kod jest łatwiejszy do utrzymania.

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.