Jak korzystać z silnika IronPDF w Dockerze | IronPDF
27.05.2025 Apryse przejęło TallComponents. Nie oferuje się już nowych licencji na TallPDF.NET i PDFKit.NET, a Apryse kieruje nowych nabywców do iText SDK (również posiadanego przez Apryse). Istniejący klienci nadal otrzymują wsparcie, ale silnik jest tylko w trybie utrzymania. Dla zespołów obecnie korzystających z TallComponents, teraz planowanie migracji pozwala uniknąć wymuszonego przejścia później.
Ten przewodnik zapewnia ścieżkę migracji zTallComponentsdo IronPDF, w tym instrukcje krok po kroku, mapowania API i przykłady kodu dla deweloperów .NET planujących przejście.
Dlaczego planować migrację z TallComponents
TallComponents (założone w 2001) wprowadziło dwa główne produkty PDF dla .NET: PDFKit.NET do ładowania i manipulacji PDF oraz TallPDF.NET do generowania dokumentów ukierunkowanych na układ. Po przejęciu przez Apryse zakończono sprzedaż nowych licencji, co zmienia horyzont planowania dla zespołów polegających na bibliotece.
Kluczowe ograniczeniaTallComponentsdzisiaj
Zamknięte na nowe licencje: StronaTallComponentsApryse stwierdza, że nie oferuje już nowych licencji na produktyTallComponentsi kieruje nowych nabywców do iText SDK. Dotychczasowi posiadacze licencji nadal otrzymują wsparcie.
Tylko potok XHTML: TallPDF.NET dostarcza klasę XhtmlParagraph, która parsuje XHTML 1.0 Strict / XHTML 1.1 + CSS 2.1. PDFKit.NET sam w sobie nie ma potoku HTML. Nowoczesne HTML5 + CSS3 +JavaScriptnie renderuje się niezawodnie - brak jest silnika przeglądarki bezgłowej w pakiecie.
Zamrożony cel platformy: TallComponents.PDFKit5 wspiera .NET Standard 2.0; starszy TallComponents.PDFKit (4.x) wspiera .NET Framework 2.0. Nie opublikowano TFM dla .NET 8/9.
Mapa drogowa tylko dla utrzymania: Z energią rozwojową Apryse skupioną na Apryse SDK i iText, pakiety oznaczone markąTallComponentsotrzymują aktualizacje konserwacyjne, ale nie nową mapę drogową funkcji.
IronPDF: nowoczesna alternatywa dla TallComponents
IronPDF rozwiązuje kluczowe luki, które wpływają na użytkownikówTallComponentsna bieżących stosach .NET:
| Funkcja | TallComponents | IronPDF |
|---|---|---|
| Aktualny status sprzedaży | Zamknięte na nowe licencje (Apryse przejęty 2025-05-27) | Sprzedawane aktywnie |
| Wsparcie HTML-do-PDF | XHTML 1.0/1.1 +CSS 2.1via XhtmlParagraph (TallPDF.NET) | Tak (HTML5/CSS3 z Chromium) |
| JavaScriptwHTML | Nie | Pełna wersja ES2024 |
| Instalacja | NuGet (TallComponents.PDFKit5, TallComponents.TallPDF5) | NuGet (IronPdf) |
| Wsparcie klienta | Tylko dla istniejących klientów; nowi nabywcy kierowani do iText | Aktywne wsparcie i społeczność |
| Przyszłe inwestycje | Tylko utrzymanie | Długoterminowa mapa drogowa |
TallComponents używa modelu XML/ułożenia zakorzenionego w wcześniejszej erze generowania dokumentów .NET, podczas gdy IronPDF zapewnia renderowanieHTMLzasilane przez Chromium zgodnie z tym, jak zespoły obecnie budują aplikacje frontend.
Szybki start: Migracja zTallComponentsdo IronPDF
Krok 1: Zastąp pakiety NuGet
Usuń pakiety TallComponents, na które wskazuje twój projekt. Prawdziwe identyfikatory pakietów na nuget.org to TallComponents.PDFKit5 (lub TallComponents.PDFKit dla wersji 4.x) i TallComponents.TallPDF5 / TallPDF6:
# RemoveTallComponentspackages (whichever your project uses)
dotnet remove package TallComponents.PDFKit5
dotnet remove package TallComponents.TallPDF5
dotnet remove package TallComponents.PDFRasterizer4
Zainstaluj IronPDF:
W przypadku specjalistycznych frameworków IronPDF oferuje dedykowane pakiety rozszerzeń:
Blazor Server:
MAUI:
Framework MVC:
Krok 2: Aktualizacja przestrzeni nazw
Zastąp przestrzenie nazwTallComponentsprzestrzenią nazw IronPDF:
// Before (TallComponents — real namespaces)
using TallComponents.PDF; // Document, Page (PDFKit.NET)
using TallComponents.PDF.Shapes; // TextShape, ImageShape (PDFKit)
using TallComponents.PDF.Security; // PasswordSecurity
using TallComponents.PDF.Layout; // Document, Section (TallPDF.NET)
using TallComponents.PDF.Layout.Paragraphs; // TextParagraph, XhtmlParagraph
// After (IronPDF)
using IronPdf;Imports IronPdf
' Before (TallComponents — real namespaces)
' Imports TallComponents.PDF ' Document, Page (PDFKit.NET)
' Imports TallComponents.PDF.Shapes ' TextShape, ImageShape (PDFKit)
' Imports TallComponents.PDF.Security ' PasswordSecurity
' Imports TallComponents.PDF.Layout ' Document, Section (TallPDF.NET)
' Imports TallComponents.PDF.Layout.Paragraphs ' TextParagraph, XhtmlParagraph
' After (IronPDF)
Imports IronPdfKrok 3: Zainicjuj swoją licencję
Dodaj inicjalizację licencji podczas uruchamiania aplikacji:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"##TallComponentsdo IronPDF API – dokumentacja API
Zrozumienie, w jaki sposób koncepcjeTallComponentsodnoszą się do IronPDF, przyspiesza proces migracji:
| TallComponents | IronPDF | Uwagi |
|---|---|---|
Document (TallPDF.NET: układ) | ChromePdfRenderer | Utwórz renderer do generowania plików PDF |
Document (PDFKit.NET: manipulacja) | PdfDocument | Ładowanie/edycja istniejących PDF |
Section | Automatyczne | Sekcje pochodzące ze strukturyHTML |
TextParagraph | Elementy tekstoweHTML | Użyj <p>, <h1>, <div> itp. |
ImageParagraph | Tag <img> | Standardowe obrazyHTML |
TableParagraph | HTML<table> | Standardowe tabeleHTML |
XhtmlParagraph (XHTML 1.x + CSS 2.1) | RenderHtmlAsPdf() (HTML5/CSS3 przez Chromium) | NowoczesnyHTMLdziała |
Font | CSS font-family | Obsługiwane czcionki webowe |
document.Write(...) | pdf.SaveAs() / pdf.BinaryData | Plik lub byte[] wyjście |
page.Overlay.Add(shape) | pdf.ApplyStamp(stamper) | Znak wodny / nakładka |
outputDoc.Pages.Add(page.Clone()) | PdfDocument.Merge(...) / pdf.AppendPdf(...) | Łączenie wielu plików PDF |
Document.Security = new PasswordSecurity { ... } | pdf.SecuritySettings | Konfiguracja zabezpieczeń plików PDF |
PageLayout | RenderingOptions | Ustawienia strony i marginesy |
Przykłady migracji kodu
KonwersjaHTMLdo PDF
TallComponents obsługujeHTMLprzez XhtmlParagraph w TallPDF.NET, który parsuje tylko XHTML 1.0/1.1 + CSS 2.1. Nowoczesne HTML5, CSS3, flexbox, grid i treści napędzane przezJavaScriptleżą poza tą składnią:
Podejście TallComponents:
// NuGet: Install-Package TallComponents.TallPDF5
// (HTML/XHTML conversion lives in TallPDF.NET, not in PDFKit.NET.)
using TallComponents.PDF.Layout;
using TallComponents.PDF.Layout.Paragraphs;
using System.IO;
class Program
{
static void Main()
{
Document document = new Document();
Section section = document.Sections.Add();
// XhtmlParagraph supports XHTML 1.0/1.1 +CSS 2.1only.
XhtmlParagraph xhtml = new XhtmlParagraph();
xhtml.Text = "<html><body><h1>Hello World</h1><p>This is a PDF from XHTML.</p></body></html>";
section.Paragraphs.Add(xhtml);
using (FileStream fs = new FileStream("output.pdf", FileMode.Create))
{
document.Write(fs);
}
}
}
Podejście IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
// Create a PDF fromHTMLstring
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
IronPDF's ChromePdfRenderer używa prawdziwego silnika Chromium, zapewniając pełne wsparcie dla HTML5 i CSS3. Oznacza to, że pliki PDF wyświetlają się dokładnie tak, jak wyglądałyby w nowoczesnej przeglądarce. Dowiedz się więcej w samouczku dotyczącym konwersji HTML do PDF.
Łączenie wielu plików PDF
Łączenie plików PDF pokazuje różnicę w szczegółowości międzyTallComponentsa IronPDF.
Podejście TallComponents:
// NuGet: Install-Package TallComponents.PDFKit5
using TallComponents.PDF;
using System.IO;
class Program
{
static void Main()
{
// Create target document
Document outputDoc = new Document();
// Load first PDF and clone each page into the target
using (FileStream fs1 = new FileStream("document1.pdf", FileMode.Open, FileAccess.Read))
{
Document doc1 = new Document(fs1);
foreach (Page page in doc1.Pages)
{
outputDoc.Pages.Add(page.Clone()); // clone is required across documents
}
}
// Load second PDF and append the whole page collection
using (FileStream fs2 = new FileStream("document2.pdf", FileMode.Open, FileAccess.Read))
{
Document doc2 = new Document(fs2);
outputDoc.Pages.AddRange(doc2.Pages.CloneToArray());
}
// Save merged document
using (FileStream output = new FileStream("merged.pdf", FileMode.Create))
{
outputDoc.Write(output);
}
}
}Imports TallComponents.PDF
Imports System.IO
Class Program
Shared Sub Main()
' Create target document
Dim outputDoc As New Document()
' Load first PDF and clone each page into the target
Using fs1 As New FileStream("document1.pdf", FileMode.Open, FileAccess.Read)
Dim doc1 As New Document(fs1)
For Each page As Page In doc1.Pages
outputDoc.Pages.Add(page.Clone()) ' clone is required across documents
Next
End Using
' Load second PDF and append the whole page collection
Using fs2 As New FileStream("document2.pdf", FileMode.Open, FileAccess.Read)
Dim doc2 As New Document(fs2)
outputDoc.Pages.AddRange(doc2.Pages.CloneToArray())
End Using
' Save merged document
Using output As New FileStream("merged.pdf", FileMode.Create)
outputDoc.Write(output)
End Using
End Sub
End ClassPodejście IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
// Load PDFs
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
// Merge PDFs
var merged = PdfDocument.Merge(pdf1, pdf2);
// Save merged document
merged.SaveAs("merged.pdf");
}
}' NuGet: Install-Package IronPdf
Imports IronPdf
Module Program
Sub Main()
' Load PDFs
Dim pdf1 As PdfDocument = PdfDocument.FromFile("document1.pdf")
Dim pdf2 As PdfDocument = PdfDocument.FromFile("document2.pdf")
' Merge PDFs
Dim merged As PdfDocument = PdfDocument.Merge(pdf1, pdf2)
' Save merged document
merged.SaveAs("merged.pdf")
End Sub
End ModuleWersjaTallComponentswymaga ręcznego przeglądania stron i klonowania.IronPDF redukuje to do pojedynczego wywołania PdfDocument.Merge(). W przypadku zaawansowanych scenariuszy łączenia plików zapoznaj się z dokumentacją dotyczącą łączenia plików PDF.
Dodawanie znaków wodnych
Znakowanie wodne plików PDF ujawnia kolejną istotną różnicę w doświadczeniach programistów.
Podejście TallComponents:
// NuGet: Install-Package TallComponents.PDFKit5
using TallComponents.PDF;
using TallComponents.PDF.Shapes;
using System.IO;
using System.Drawing;
class Program
{
static void Main()
{
// Load existing PDF
using (FileStream fs = new FileStream("input.pdf", FileMode.Open, FileAccess.Read))
{
Document document = new Document(fs);
foreach (Page page in document.Pages)
{
TextShape watermark = new TextShape();
watermark.Text = "CONFIDENTIAL";
watermark.Font = new Font("Arial", 60);
watermark.Pen = new Pen(Color.FromArgb(128, 255, 0, 0));
watermark.X = 200;
watermark.Y = 400;
// Rotation is applied via a transform on PDFKit.NET
// (TextShape has no Rotate property in the PDFKit API).
watermark.Transform = new RotateTransform(45);
page.Overlay.Add(watermark);
}
using (FileStream output = new FileStream("watermarked.pdf", FileMode.Create))
{
document.Write(output);
}
}
}
}Imports TallComponents.PDF
Imports TallComponents.PDF.Shapes
Imports System.IO
Imports System.Drawing
Class Program
Shared Sub Main()
' Load existing PDF
Using fs As New FileStream("input.pdf", FileMode.Open, FileAccess.Read)
Dim document As New Document(fs)
For Each page As Page In document.Pages
Dim watermark As New TextShape()
watermark.Text = "CONFIDENTIAL"
watermark.Font = New Font("Arial", 60)
watermark.Pen = New Pen(Color.FromArgb(128, 255, 0, 0))
watermark.X = 200
watermark.Y = 400
' Rotation is applied via a transform on PDFKit.NET
' (TextShape has no Rotate property in the PDFKit API).
watermark.Transform = New RotateTransform(45)
page.Overlay.Add(watermark)
Next
Using output As New FileStream("watermarked.pdf", FileMode.Create)
document.Write(output)
End Using
End Using
End Sub
End ClassPodejście IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
class Program
{
static void Main()
{
// Load existing PDF
var pdf = PdfDocument.FromFile("input.pdf");
// Create watermark
var watermark = new TextStamper()
{
Text = "CONFIDENTIAL",
FontSize = 60,
Opacity = 50,
Rotation = 45,
VerticalAlignment = VerticalAlignment.Middle,
HorizontalAlignment = HorizontalAlignment.Center
};
// Apply watermark to all pages
pdf.ApplyStamp(watermark);
// Save watermarked PDF
pdf.SaveAs("watermarked.pdf");
}
}' NuGet: Install-Package IronPdf
Imports IronPdf
Imports IronPdf.Editing
Module Program
Sub Main()
' Load existing PDF
Dim pdf = PdfDocument.FromFile("input.pdf")
' Create watermark
Dim watermark = New TextStamper() With {
.Text = "CONFIDENTIAL",
.FontSize = 60,
.Opacity = 50,
.Rotation = 45,
.VerticalAlignment = VerticalAlignment.Middle,
.HorizontalAlignment = HorizontalAlignment.Center
}
' Apply watermark to all pages
pdf.ApplyStamp(watermark)
' Save watermarked PDF
pdf.SaveAs("watermarked.pdf")
End Sub
End ModuleKlasa TextStamper w IronPDF zapewnia intuicyjne opcje wyrównania i automatyczne iterowanie stron. Przewodnik dotyczący stempli i znaków wodnych zawiera informacje o dodatkowych opcjach dostosowywania.
Podpisy cyfrowe
Podpisywanie dokumentów ma kluczowe znaczenie dla aplikacji Enterprise.
Podejście TallComponents:
using TallComponents.PDF;
using TallComponents.PDF.Signing;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using (FileStream fs = new FileStream("unsigned.pdf", FileMode.Open, FileAccess.Read))
{
Document document = new Document(fs);
X509Certificate2 cert = new X509Certificate2("certificate.pfx", "password");
SignatureField field = new SignatureField("Signature1");
field.Sign(cert);
document.Fields.Add(field);
using (FileStream output = new FileStream("signed.pdf", FileMode.Create))
{
document.Write(output);
}
}Imports TallComponents.PDF
Imports TallComponents.PDF.Signing
Imports System.IO
Imports System.Security.Cryptography.X509Certificates
Using fs As New FileStream("unsigned.pdf", FileMode.Open, FileAccess.Read)
Dim document As New Document(fs)
Dim cert As New X509Certificate2("certificate.pfx", "password")
Dim field As New SignatureField("Signature1")
field.Sign(cert)
document.Fields.Add(field)
Using output As New FileStream("signed.pdf", FileMode.Create)
document.Write(output)
End Using
End UsingPodejście IronPDF:
using IronPdf;
using IronPdf.Signing;
var pdf = PdfDocument.FromFile("unsigned.pdf");
// Sign with certificate
var signature = new PdfSignature("certificate.pfx", "password")
{
SigningContact = "support@company.com",
SigningLocation = "New York",
SigningReason = "Document Approval"
};
pdf.Sign(signature);
pdf.SaveAs("signed.pdf");Imports IronPdf
Imports IronPdf.Signing
Dim pdf = PdfDocument.FromFile("unsigned.pdf")
' Sign with certificate
Dim signature = New PdfSignature("certificate.pfx", "password") With {
.SigningContact = "support@company.com",
.SigningLocation = "New York",
.SigningReason = "Document Approval"
}
pdf.Sign(signature)
pdf.SaveAs("signed.pdf")Charakterystyczne API IronPDF zawiera dodatkowe właściwości metadanych dotyczące informacji kontaktowych, lokalizacji i powodu podpisania — ważne dla ścieżek audytu. Zapoznaj się z dokumentacją dotyczącą podpisu cyfrowego, aby uzyskać szczegółowe informacje na temat wdrożenia.
Porównanie funkcji:TallComponentsvs IronPDF
| Funkcja | TallComponents | IronPDF |
|---|---|---|
| Status | Zamknięte na nowe licencje (Apryse przejęty 2025-05-27) | Aktywne |
| Wsparcie | Tylko dla obecnych klientów | Pełna |
| Aktualizacje | Tylko utrzymanie | Regularne wydania funkcji |
| Tworzenie treści | ||
| HTMLdo PDF | XHTML 1.0/1.1 +CSS 2.1(XhtmlParagraph) | Pełne HTML5/CSS3 przez Chromium |
| URL do pliku PDF | Tak dla URL-ów XHTML (XhtmlParagraph.Path) | Tak |
| Obsługa CSS | CSS 2.1 | Pełny CSS3 |
| JavaScript | Nie | Pełna wersja ES2024 |
| XML / Szablony DOM układu | Tak (TallPDF.NET) | Niepotrzebne (HTML) |
| Operacje na plikach PDF | ||
| Łączenie plików PDF | Tak (Pages.Add(page.Clone())) | Tak (PdfDocument.Merge) |
| Podział plików PDF | Tak | Tak |
| Znaki wodne | page.Overlay.Add(TextShape) | pdf.ApplyStamp(...) |
| Nagłówki/stopki | Układ DOM | HTML/CSS |
| Bezpieczeństwo | ||
| Ochrona hasłem | Tak (PasswordSecurity) | Tak |
| Podpisy cyfrowe | Tak (SignatureField.Sign) | Tak |
| Szyfrowanie | RC4 / AES-128 / AES-256 | AES-128 / AES-256 |
| PDF/A | PDF/A-1, PDF/A-2, PDF/A-3 | Tak |
| Platforma | ||
| Docelowe Frameworki | PDFKit5: .NET Standard 2.0; PDFKit (4.x): .NET Framework 2.0 | .NET Framework 4.6.2+, .NET 6/7/8/9 |
| Rozwój | ||
| Krzywa uczenia się | XML / układ DOM | HTML |
| Dokumentacja | Zamrożony w momencie przejęcia; nowe dokumenty skierowane do Apryse / iText | Utrzymywany |
| Społeczność | Cichy (brak nowej sprzedaży) | Aktywne |
Lista kontrolna migracji TallComponents
Zadania przed migracją
Przeprowadź audyt bazy kodu, aby zidentyfikować wszystkie użycia TallComponents:
grep -r "using TallComponents" --include="*.cs" .
grep -rE "XhtmlParagraph|TextParagraph|PasswordSecurity|page\.Overlay" --include="*.cs" .
Udokumentuj istniejące szablony XML/ułożenia — będą one przekształcone na HTML. Zidentyfikuj obecnie używane ustawienia zabezpieczeń, zwracając uwagę na konfiguracje hasła i implementacje podpisu cyfrowego.
Zadania związane z aktualizacją kodu
- Usuń pakietyTallComponentsprzez NuGet
- Zainstaluj pakiet IronPDF
- Przekształć szablony XHTML / DOM ułożenia na HTML5
- Zastąp model sekcji/akapitów elementami HTML
- Zaktualizuj kod tabel do używania standardowych tabel HTML
- Konwertowanie nagłówków/stopki naHTMLza pomocą
HtmlHeaderFooter - Aktualizuj ustawienia zabezpieczeń, aby używać
pdf.SecuritySettings - Dodaj inicjalizację licencji podczas uruchamiania
Migracja nagłówków i stopek
TallPDF.NET używa DOM układów (Section.Header / Section.Footer) dla nagłówków stron.IronPDF zapewnia nagłówki oparte naHTMLz dynamicznymi zastępcami:
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center;'>Header Text</div>",
MaxHeight = 25
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center;'>Footer Text</div>",
MaxHeight = 25
};Imports System
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center;'>Header Text</div>",
.MaxHeight = 25
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center;'>Footer Text</div>",
.MaxHeight = 25
}Dowiedz się więcej o nagłówkach i stopkach w IronPDF.
Faza testów
- Porównaj wizualne wyjście między wersjamiTallComponentsi IronPDF
- Przetestuj wszystkie szablony dokumentów
- Zwaliduj funkcjonalność łączenia PDF
- Przetestuj podpisy cyfrowe
- Potwierdź poprawność zastosowania ustawień zabezpieczeń
Zalecany harmonogram migracji
PonieważTallComponentsjest zamknięte na nowe licencje i na wsparciu tylko dla utrzymania, planuj przejście we własnym tempie, ale nie zwlekaj:
Tydzień 1: Przeprowadź audyt bazy kodu i zidentyfikuj wszystkie użycia TallComponents Tydzień 2: Przekształć szablony XHTML / DOM ułożenia na HTML5 Tydzień 3: Zaktualizuj kod bezpieczeństwa, łączenia i podpisywania Tydzień 4: Testowanie i wdrażanie na produkcję
Im dłużej stos pozostaje na TallComponents, tym bardziej odbiega od bieżących celów .NET i bieżącego HTML.

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.