Jak przeprowadzić migrację z Apryse PDF do IronPDF w języku C#
Full Comparison
Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Apryse PDF on pricing, HTML support, and licensing.
Apryse PDF (wcześniej PDFTron) to wysokiej klasy Enterprise zestaw SDK do obsługi plików PDF, znany ze swoich wszechstronnych możliwości przetwarzania dokumentów. Jednak model cenowy klasy premium (ponad 1500 USD rocznie na programistę), złożone wymagania integracyjne oraz dziedzictwo języka C++ stanowią bariery dla zespołów programistycznych poszukujących prostych funkcji związanych z plikami PDF. Ten kompleksowy przewodnik przedstawia krok po kroku ścieżkę migracji z Apryse PDF doIronPDF— natywnej biblioteki PDF dla platformy .NET, charakteryzującej się nowoczesnymi konwencjami języka C#, prostszą integracją oraz jednorazową Licencją wieczystą.
Dlaczego warto odejść od Apryse PDF?
Chociaż Apryse PDF zapewnia solidną funkcjonalność, kilka czynników skłania zespoły programistów do poszukiwania alternatywnych rozwiązań dla swoich potrzeb w zakresie generowania plików PDF.
Ceny premium i model subskrypcji
Apryse PDF jest skierowany do klientów Enterprise, a jego ceny mogą być zbyt wysokie dla małych i średnich projektów:
| Aspekt | Apryse PDF (PDFTron) | IronPDF |
|---|---|---|
| Cena wywoławcza | 1500 USD+/programista/rok (według doniesień) | 749 USD jednorazowo (wersja Lite) |
| Model licencji | Roczna subskrypcja | Licencja wieczysta |
| Licencja użytkownika | Oddzielny, dodatkowy koszt | Nie dotyczy (użyj standardowych przeglądarek) |
| Licencja serwerowa | Wymagane ceny dla Enterprise | Zawarte w poziomach licencji |
| Całkowity koszt w ciągu 3 lat | 4500 USD+ na programistę | 749 USD jednorazowo |
Złożoność integracji
Dziedzictwo C++ w Apryse PDF wprowadza złożoność, która wpływa na tempo rozwoju:
| Funkcja | Apryse PDF | IronPDF |
|---|---|---|
| Konfiguracja | Ścieżki modułów, pliki binarne zewnętrzne | Pojedynczy pakiet NuGet |
| Inicjalizacja | PDFNet.Initialize() z licencją |
Proste przypisywanie właściwości |
| Renderowanie HTML | Wymagany zewnętrzny moduł html2pdf | Wbudowany silnik Chromium |
| Styl API | Dziedzictwo C++, złożone | Nowoczesne konwencje języka C# |
| Zależności | Wiele bibliotek DLL, specyficznych dla platformy | Samodzielny pakiet |
Kiedy rozważyć migrację
Przejdź na IronPDF, jeśli:
- Potrzebujesz przede wszystkim konwersji HTML/URL do formatu PDF
- Potrzebujesz prostszego API z mniejszą ilością szablonowego kodu
- W Twoim przypadku stosowanie cen premium nie jest uzasadnione
- Nie potrzebujesz kontrolek przeglądarki PDFViewCtrl
- Wolisz licencję jednorazową zamiast subskrypcji
Wybierz Apryse PDF, jeśli:
- Potrzebne są ich natywne kontrolki przeglądarki (PDFViewCtrl)
- Korzystasz intensywnie z XOD lub formatów zastrzeżonych
- Potrzebujesz konkretnych funkcji dla Enterprise (zaawansowane redagowanie itp.)
- Twoja organizacja posiada już Licencje Enterprise
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 licencyjnyIronPDF(bezpłatna wersja próbna dostępna na stronie ironpdf.com)
Audyt wykorzystania plików PDF w Apryse
Uruchom te polecenia w katalogu rozwiązania, aby zidentyfikować wszystkie odwołania do Apryse:
# Find all pdftron using statements
grep -r "using pdftron" --include="*.cs" .
# Find PDFNet initialization
grep -r "PDFNet.Initialize\|PDFNet.SetResourcesPath" --include="*.cs" .
# Find PDFDoc usage
grep -r "new PDFDoc\|PDFDoc\." --include="*.cs" .
# Find HTML2PDF usage
grep -r "HTML2PDF\|InsertFromURL\|InsertFromHtmlString" --include="*.cs" .
# Find ElementReader/Writer usage
grep -r "ElementReader\|ElementWriter\|ElementBuilder" --include="*.cs" .
# Find all pdftron using statements
grep -r "using pdftron" --include="*.cs" .
# Find PDFNet initialization
grep -r "PDFNet.Initialize\|PDFNet.SetResourcesPath" --include="*.cs" .
# Find PDFDoc usage
grep -r "new PDFDoc\|PDFDoc\." --include="*.cs" .
# Find HTML2PDF usage
grep -r "HTML2PDF\|InsertFromURL\|InsertFromHtmlString" --include="*.cs" .
# Find ElementReader/Writer usage
grep -r "ElementReader\|ElementWriter\|ElementBuilder" --include="*.cs" .
Zmiany wymagające dostosowania
| Wzór pliku PDF firmy Apryse | Wymagana zmiana |
|---|---|
PDFNet.Initialize() |
Zastąp przez IronPdf.License.LicenseKey |
HTML2PDF moduł |
Wbudowane ChromePdfRenderer |
ElementWriter |
IronPDFprzetwarza treści wewnętrznie |
SDFDoc.SaveOptions |
Prosta metoda SaveAs() |
PDFViewCtrl |
Użyj zewnętrznych przeglądarek plików PDF |
| Format XOD | Konwertuj do formatu PDF lub obrazów |
| Konfiguracja ścieżki modułu | Nie jest potrzebne |
Proces migracji krok po kroku
Krok 1: Zaktualizuj pakiety NuGet
Usuń pakiety Apryse/PDFTron i zainstaluj IronPDF:
# Remove Apryse/PDFTron packages
dotnet remove package PDFTron.NET.x64
dotnet remove package PDFTron.NET.x86
dotnet remove package pdftron
# Install IronPDF
dotnet add package IronPdf
# Remove Apryse/PDFTron packages
dotnet remove package PDFTron.NET.x64
dotnet remove package PDFTron.NET.x86
dotnet remove package pdftron
# Install IronPDF
dotnet add package IronPdf
Lub za pomocą konsoli menedżera pakietów:
Uninstall-Package PDFTron.NET.x64
Install-Package IronPdf
Krok 2: Aktualizacja odniesień do przestrzeni nazw
Zastąp przestrzenie nazw Apryse nazwami IronPDF:
// Remove these
using pdftron;
using pdftron.PDF;
using pdftron.PDF.Convert;
using pdftron.SDF;
using pdftron.Filters;
// Add these
using IronPdf;
using IronPdf.Rendering;
// Remove these
using pdftron;
using pdftron.PDF;
using pdftron.PDF.Convert;
using pdftron.SDF;
using pdftron.Filters;
// Add these
using IronPdf;
using IronPdf.Rendering;
Imports IronPdf
Imports IronPdf.Rendering
Krok 3: Usuń standardowy kod inicjalizacyjny
Apryse PDF wymaga złożonej inicjalizacji.IronPDFcałkowicie eliminuje ten problem.
Wdrożenie Apryse PDF:
// Complex initialization
PDFNet.Initialize("YOUR_LICENSE_KEY");
PDFNet.SetResourcesPath("path/to/resources");
// Plus module path for HTML2PDF...
// Complex initialization
PDFNet.Initialize("YOUR_LICENSE_KEY");
PDFNet.SetResourcesPath("path/to/resources");
// Plus module path for HTML2PDF...
' Complex initialization
PDFNet.Initialize("YOUR_LICENSE_KEY")
PDFNet.SetResourcesPath("path/to/resources")
' Plus module path for HTML2PDF...
Wdrożenie IronPDF:
// Simple license assignment (optional for development)
IronPdf.License.LicenseKey = "YOUR_LICENSE_KEY";
// Simple license assignment (optional for development)
IronPdf.License.LicenseKey = "YOUR_LICENSE_KEY";
' Simple license assignment (optional for development)
IronPdf.License.LicenseKey = "YOUR_LICENSE_KEY"
W przypadkuIronPDFnie jest wymagane wywołanie PDFNet.Terminate() — zasoby są zarządzane automatycznie.
Kompletna dokumentacja API
Mapowanie klas podstawowych
| Klasa Apryse PDF | OdpowiednikIronPDF |
|---|---|
PDFDoc |
PdfDocument |
HTML2PDF |
ChromePdfRenderer |
TextExtractor |
PdfDocument.ExtractAllText() |
Stamper |
PdfDocument.ApplyWatermark() |
PDFDraw |
PdfDocument.ToBitmap() |
SecurityHandler |
PdfDocument.SecuritySettings |
PDFNet |
IronPdf.License |
Operacje na dokumentach
| Metoda Apryse PDF | MetodaIronPDF |
|---|---|
new PDFDoc() |
new PdfDocument() |
new PDFDoc(path) |
PdfDocument.FromFile(path) |
new PDFDoc(buffer) |
PdfDocument.FromBinaryData(bytes) |
doc.Save(path, options) |
pdf.SaveAs(path) |
doc.Save(buffer) |
pdf.BinaryData |
doc.Close() |
pdf.Dispose() |
doc.GetPageCount() |
pdf.PageCount |
doc.AppendPages(doc2, start, end) |
PdfDocument.Merge(pdfs) |
Konwersja HTML do PDF
| Metoda Apryse PDF | MetodaIronPDF |
|---|---|
HTML2PDF.Convert(doc) |
renderer.RenderHtmlAsPdf(html) |
converter.InsertFromURL(url) |
renderer.RenderUrlAsPdf(url) |
converter.InsertFromHtmlString(html) |
renderer.RenderHtmlAsPdf(html) |
converter.SetModulePath(path) |
Nie jest potrzebne |
converter.SetPaperSize(width, height) |
RenderingOptions.PaperSize |
converter.SetLandscape(true) |
RenderingOptions.PaperOrientation |
Przykłady migracji kodu
Ciąg znaków HTML do pliku PDF
Najczęstsza operacja pokazuje radykalne zmniejszenie ilości kodu szablonowego.
Wdrożenie Apryse PDF:
using pdftron;
using pdftron.PDF;
class Program
{
static void Main()
{
PDFNet.Initialize("YOUR_LICENSE_KEY");
PDFNet.SetResourcesPath("path/to/resources");
string html = "<html><body><h1>Hello World</h1><p>Content here</p></body></html>";
using (PDFDoc doc = new PDFDoc())
{
HTML2PDF converter = new HTML2PDF();
converter.SetModulePath("path/to/html2pdf");
converter.InsertFromHtmlString(html);
HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
settings.SetPrintBackground(true);
settings.SetLoadImages(true);
if (converter.Convert(doc))
{
doc.Save("output.pdf", SDFDoc.SaveOptions.e_linearized);
Console.WriteLine("PDF created successfully");
}
else
{
Console.WriteLine($"Conversion failed: {converter.GetLog()}");
}
}
PDFNet.Terminate();
}
}
using pdftron;
using pdftron.PDF;
class Program
{
static void Main()
{
PDFNet.Initialize("YOUR_LICENSE_KEY");
PDFNet.SetResourcesPath("path/to/resources");
string html = "<html><body><h1>Hello World</h1><p>Content here</p></body></html>";
using (PDFDoc doc = new PDFDoc())
{
HTML2PDF converter = new HTML2PDF();
converter.SetModulePath("path/to/html2pdf");
converter.InsertFromHtmlString(html);
HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
settings.SetPrintBackground(true);
settings.SetLoadImages(true);
if (converter.Convert(doc))
{
doc.Save("output.pdf", SDFDoc.SaveOptions.e_linearized);
Console.WriteLine("PDF created successfully");
}
else
{
Console.WriteLine($"Conversion failed: {converter.GetLog()}");
}
}
PDFNet.Terminate();
}
}
Imports pdftron
Imports pdftron.PDF
Class Program
Shared Sub Main()
PDFNet.Initialize("YOUR_LICENSE_KEY")
PDFNet.SetResourcesPath("path/to/resources")
Dim html As String = "<html><body><h1>Hello World</h1><p>Content here</p></body></html>"
Using doc As New PDFDoc()
Dim converter As New HTML2PDF()
converter.SetModulePath("path/to/html2pdf")
converter.InsertFromHtmlString(html)
Dim settings As New HTML2PDF.WebPageSettings()
settings.SetPrintBackground(True)
settings.SetLoadImages(True)
If converter.Convert(doc) Then
doc.Save("output.pdf", SDFDoc.SaveOptions.e_linearized)
Console.WriteLine("PDF created successfully")
Else
Console.WriteLine($"Conversion failed: {converter.GetLog()}")
End If
End Using
PDFNet.Terminate()
End Sub
End Class
Wdrożenie IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class
IronPDF eliminuje kod inicjalizacji, ścieżki modułów i kod czyszczący — redukując ponad 35 wierszy do 5 wierszy.
Konwersja adresów URL do formatu PDF
Wdrożenie Apryse PDF:
using pdftron;
using pdftron.PDF;
PDFNet.Initialize("YOUR_LICENSE_KEY");
using (PDFDoc doc = new PDFDoc())
{
HTML2PDF converter = new HTML2PDF();
converter.SetModulePath("path/to/html2pdf");
HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
settings.SetLoadImages(true);
settings.SetAllowJavaScript(true);
settings.SetPrintBackground(true);
converter.InsertFromURL("https://example.com", settings);
if (converter.Convert(doc))
{
doc.Save("webpage.pdf", SDFDoc.SaveOptions.e_linearized);
}
}
PDFNet.Terminate();
using pdftron;
using pdftron.PDF;
PDFNet.Initialize("YOUR_LICENSE_KEY");
using (PDFDoc doc = new PDFDoc())
{
HTML2PDF converter = new HTML2PDF();
converter.SetModulePath("path/to/html2pdf");
HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
settings.SetLoadImages(true);
settings.SetAllowJavaScript(true);
settings.SetPrintBackground(true);
converter.InsertFromURL("https://example.com", settings);
if (converter.Convert(doc))
{
doc.Save("webpage.pdf", SDFDoc.SaveOptions.e_linearized);
}
}
PDFNet.Terminate();
Imports pdftron
Imports pdftron.PDF
PDFNet.Initialize("YOUR_LICENSE_KEY")
Using doc As New PDFDoc()
Dim converter As New HTML2PDF()
converter.SetModulePath("path/to/html2pdf")
Dim settings As New HTML2PDF.WebPageSettings()
settings.SetLoadImages(True)
settings.SetAllowJavaScript(True)
settings.SetPrintBackground(True)
converter.InsertFromURL("https://example.com", settings)
If converter.Convert(doc) Then
doc.Save("webpage.pdf", SDFDoc.SaveOptions.e_linearized)
End If
End Using
PDFNet.Terminate()
Wdrożenie IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string url = "https://www.example.com";
var pdf = renderer.RenderUrlAsPdf(url);
pdf.SaveAs("webpage.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string url = "https://www.example.com";
var pdf = renderer.RenderUrlAsPdf(url);
pdf.SaveAs("webpage.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim url As String = "https://www.example.com"
Dim pdf = renderer.RenderUrlAsPdf(url)
pdf.SaveAs("webpage.pdf")
End Sub
End Class
Łączenie wielu plików PDF
Wdrożenie Apryse PDF:
using pdftron;
using pdftron.PDF;
PDFNet.Initialize("YOUR_LICENSE_KEY");
using (PDFDoc mainDoc = new PDFDoc())
{
string[] files = { "doc1.pdf", "doc2.pdf", "doc3.pdf" };
foreach (string file in files)
{
using (PDFDoc doc = new PDFDoc(file))
{
mainDoc.AppendPages(doc, 1, doc.GetPageCount());
}
}
mainDoc.Save("merged.pdf", SDFDoc.SaveOptions.e_linearized);
}
PDFNet.Terminate();
using pdftron;
using pdftron.PDF;
PDFNet.Initialize("YOUR_LICENSE_KEY");
using (PDFDoc mainDoc = new PDFDoc())
{
string[] files = { "doc1.pdf", "doc2.pdf", "doc3.pdf" };
foreach (string file in files)
{
using (PDFDoc doc = new PDFDoc(file))
{
mainDoc.AppendPages(doc, 1, doc.GetPageCount());
}
}
mainDoc.Save("merged.pdf", SDFDoc.SaveOptions.e_linearized);
}
PDFNet.Terminate();
Imports pdftron
Imports pdftron.PDF
PDFNet.Initialize("YOUR_LICENSE_KEY")
Using mainDoc As New PDFDoc()
Dim files As String() = {"doc1.pdf", "doc2.pdf", "doc3.pdf"}
For Each file As String In files
Using doc As New PDFDoc(file)
mainDoc.AppendPages(doc, 1, doc.GetPageCount())
End Using
Next
mainDoc.Save("merged.pdf", SDFDoc.SaveOptions.e_linearized)
End Using
PDFNet.Terminate()
Wdrożenie IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
merged.SaveAs("merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
merged.SaveAs("merged.pdf");
}
}
Imports IronPdf
Imports System.Collections.Generic
Class Program
Shared Sub Main()
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(New List(Of PdfDocument) From {pdf1, pdf2})
merged.SaveAs("merged.pdf")
End Sub
End Class
Metoda statyczna Merge bibliotekiIronPDFakceptuje bezpośrednio wiele dokumentów, eliminując konieczność iteracji po stronach.
Wyodrębnianie tekstu
Wdrożenie Apryse PDF:
using pdftron;
using pdftron.PDF;
PDFNet.Initialize("YOUR_LICENSE_KEY");
using (PDFDoc doc = new PDFDoc("document.pdf"))
{
TextExtractor extractor = new TextExtractor();
for (int i = 1; i <= doc.GetPageCount(); i++)
{
Page page = doc.GetPage(i);
extractor.Begin(page);
string pageText = extractor.GetAsText();
Console.WriteLine($"Page {i}:");
Console.WriteLine(pageText);
}
}
PDFNet.Terminate();
using pdftron;
using pdftron.PDF;
PDFNet.Initialize("YOUR_LICENSE_KEY");
using (PDFDoc doc = new PDFDoc("document.pdf"))
{
TextExtractor extractor = new TextExtractor();
for (int i = 1; i <= doc.GetPageCount(); i++)
{
Page page = doc.GetPage(i);
extractor.Begin(page);
string pageText = extractor.GetAsText();
Console.WriteLine($"Page {i}:");
Console.WriteLine(pageText);
}
}
PDFNet.Terminate();
Imports pdftron
Imports pdftron.PDF
PDFNet.Initialize("YOUR_LICENSE_KEY")
Using doc As New PDFDoc("document.pdf")
Dim extractor As New TextExtractor()
For i As Integer = 1 To doc.GetPageCount()
Dim page As Page = doc.GetPage(i)
extractor.Begin(page)
Dim pageText As String = extractor.GetAsText()
Console.WriteLine($"Page {i}:")
Console.WriteLine(pageText)
Next
End Using
PDFNet.Terminate()
Wdrożenie IronPDF:
using IronPdf;
var pdf = PdfDocument.FromFile("document.pdf");
// Extract all text at once
string allText = pdf.ExtractAllText();
Console.WriteLine(allText);
// Extract from specific page
string page1Text = pdf.ExtractTextFromPage(0); // 0-indexed
Console.WriteLine($"Page 1: {page1Text}");
using IronPdf;
var pdf = PdfDocument.FromFile("document.pdf");
// Extract all text at once
string allText = pdf.ExtractAllText();
Console.WriteLine(allText);
// Extract from specific page
string page1Text = pdf.ExtractTextFromPage(0); // 0-indexed
Console.WriteLine($"Page 1: {page1Text}");
Imports IronPdf
Dim pdf = PdfDocument.FromFile("document.pdf")
' Extract all text at once
Dim allText As String = pdf.ExtractAllText()
Console.WriteLine(allText)
' Extract from specific page
Dim page1Text As String = pdf.ExtractTextFromPage(0) ' 0-indexed
Console.WriteLine($"Page 1: {page1Text}")
Dodawanie znaków wodnych
Wdrożenie Apryse PDF:
using pdftron;
using pdftron.PDF;
PDFNet.Initialize("YOUR_LICENSE_KEY");
using (PDFDoc doc = new PDFDoc("document.pdf"))
{
Stamper stamper = new Stamper(Stamper.SizeType.e_relative_scale, 0.5, 0.5);
stamper.SetAlignment(Stamper.HorizontalAlignment.e_horizontal_center,
Stamper.VerticalAlignment.e_vertical_center);
stamper.SetOpacity(0.3);
stamper.SetRotation(45);
stamper.SetFontColor(new ColorPt(1, 0, 0));
stamper.SetTextAlignment(Stamper.TextAlignment.e_align_center);
stamper.StampText(doc, "CONFIDENTIAL",
new PageSet(1, doc.GetPageCount()));
doc.Save("watermarked.pdf", SDFDoc.SaveOptions.e_linearized);
}
PDFNet.Terminate();
using pdftron;
using pdftron.PDF;
PDFNet.Initialize("YOUR_LICENSE_KEY");
using (PDFDoc doc = new PDFDoc("document.pdf"))
{
Stamper stamper = new Stamper(Stamper.SizeType.e_relative_scale, 0.5, 0.5);
stamper.SetAlignment(Stamper.HorizontalAlignment.e_horizontal_center,
Stamper.VerticalAlignment.e_vertical_center);
stamper.SetOpacity(0.3);
stamper.SetRotation(45);
stamper.SetFontColor(new ColorPt(1, 0, 0));
stamper.SetTextAlignment(Stamper.TextAlignment.e_align_center);
stamper.StampText(doc, "CONFIDENTIAL",
new PageSet(1, doc.GetPageCount()));
doc.Save("watermarked.pdf", SDFDoc.SaveOptions.e_linearized);
}
PDFNet.Terminate();
Imports pdftron
Imports pdftron.PDF
PDFNet.Initialize("YOUR_LICENSE_KEY")
Using doc As New PDFDoc("document.pdf")
Dim stamper As New Stamper(Stamper.SizeType.e_relative_scale, 0.5, 0.5)
stamper.SetAlignment(Stamper.HorizontalAlignment.e_horizontal_center, Stamper.VerticalAlignment.e_vertical_center)
stamper.SetOpacity(0.3)
stamper.SetRotation(45)
stamper.SetFontColor(New ColorPt(1, 0, 0))
stamper.SetTextAlignment(Stamper.TextAlignment.e_align_center)
stamper.StampText(doc, "CONFIDENTIAL", New PageSet(1, doc.GetPageCount()))
doc.Save("watermarked.pdf", SDFDoc.SaveOptions.e_linearized)
End Using
PDFNet.Terminate()
Wdrożenie IronPDF:
using IronPdf;
using IronPdf.Editing;
var pdf = PdfDocument.FromFile("document.pdf");
// HTML-based watermark with full styling control
string watermarkHtml = @"
<div style='
color: red;
opacity: 0.3;
font-size: 72px;
font-weight: bold;
text-align: center;
'>CONFIDENTIAL</div>";
pdf.ApplyWatermark(watermarkHtml,
rotation: 45,
verticalAlignment: VerticalAlignment.Middle,
horizontalAlignment: HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");
using IronPdf;
using IronPdf.Editing;
var pdf = PdfDocument.FromFile("document.pdf");
// HTML-based watermark with full styling control
string watermarkHtml = @"
<div style='
color: red;
opacity: 0.3;
font-size: 72px;
font-weight: bold;
text-align: center;
'>CONFIDENTIAL</div>";
pdf.ApplyWatermark(watermarkHtml,
rotation: 45,
verticalAlignment: VerticalAlignment.Middle,
horizontalAlignment: HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");
Imports IronPdf
Imports IronPdf.Editing
Dim pdf = PdfDocument.FromFile("document.pdf")
' HTML-based watermark with full styling control
Dim watermarkHtml As String = "
<div style='
color: red;
opacity: 0.3;
font-size: 72px;
font-weight: bold;
text-align: center;
'>CONFIDENTIAL</div>"
pdf.ApplyWatermark(watermarkHtml,
rotation:=45,
verticalAlignment:=VerticalAlignment.Middle,
horizontalAlignment:=HorizontalAlignment.Center)
pdf.SaveAs("watermarked.pdf")
IronPDF wykorzystuje znak wodny oparty na HTML/CSS, zapewniając pełną kontrolę nad stylem za pomocą znanych technologii internetowych.
Ochrona hasłem
Wdrożenie Apryse PDF:
using pdftron;
using pdftron.PDF;
using pdftron.SDF;
PDFNet.Initialize("YOUR_LICENSE_KEY");
using (PDFDoc doc = new PDFDoc("document.pdf"))
{
SecurityHandler handler = new SecurityHandler();
handler.ChangeUserPassword("user123");
handler.ChangeMasterPassword("owner456");
handler.SetPermission(SecurityHandler.Permission.e_print, false);
handler.SetPermission(SecurityHandler.Permission.e_extract_content, false);
doc.SetSecurityHandler(handler);
doc.Save("protected.pdf", SDFDoc.SaveOptions.e_linearized);
}
PDFNet.Terminate();
using pdftron;
using pdftron.PDF;
using pdftron.SDF;
PDFNet.Initialize("YOUR_LICENSE_KEY");
using (PDFDoc doc = new PDFDoc("document.pdf"))
{
SecurityHandler handler = new SecurityHandler();
handler.ChangeUserPassword("user123");
handler.ChangeMasterPassword("owner456");
handler.SetPermission(SecurityHandler.Permission.e_print, false);
handler.SetPermission(SecurityHandler.Permission.e_extract_content, false);
doc.SetSecurityHandler(handler);
doc.Save("protected.pdf", SDFDoc.SaveOptions.e_linearized);
}
PDFNet.Terminate();
Imports pdftron
Imports pdftron.PDF
Imports pdftron.SDF
PDFNet.Initialize("YOUR_LICENSE_KEY")
Using doc As New PDFDoc("document.pdf")
Dim handler As New SecurityHandler()
handler.ChangeUserPassword("user123")
handler.ChangeMasterPassword("owner456")
handler.SetPermission(SecurityHandler.Permission.e_print, False)
handler.SetPermission(SecurityHandler.Permission.e_extract_content, False)
doc.SetSecurityHandler(handler)
doc.Save("protected.pdf", SDFDoc.SaveOptions.e_linearized)
End Using
PDFNet.Terminate()
Wdrożenie IronPDF:
using IronPdf;
var pdf = PdfDocument.FromFile("document.pdf");
// Set passwords
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.OwnerPassword = "owner456";
// Set permissions
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;
pdf.SaveAs("protected.pdf");
using IronPdf;
var pdf = PdfDocument.FromFile("document.pdf");
// Set passwords
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.OwnerPassword = "owner456";
// Set permissions
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;
pdf.SaveAs("protected.pdf");
Imports IronPdf
Dim pdf = PdfDocument.FromFile("document.pdf")
' Set passwords
pdf.SecuritySettings.UserPassword = "user123"
pdf.SecuritySettings.OwnerPassword = "owner456"
' Set permissions
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit
pdf.SaveAs("protected.pdf")
Nagłówki i stopki
Wdrożenie IronPDF:
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center; font-size:12px;'>Company Header</div>",
DrawDividerLine = true,
MaxHeight = 30
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center; font-size:10px;'>Page {page} of {total-pages}</div>",
DrawDividerLine = true,
MaxHeight = 25
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Content</h1>");
pdf.SaveAs("with_headers.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center; font-size:12px;'>Company Header</div>",
DrawDividerLine = true,
MaxHeight = 30
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center; font-size:10px;'>Page {page} of {total-pages}</div>",
DrawDividerLine = true,
MaxHeight = 25
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Content</h1>");
pdf.SaveAs("with_headers.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.HtmlFragment = "<div style='text-align:center; font-size:12px;'>Company Header</div>",
.DrawDividerLine = True,
.MaxHeight = 30
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "<div style='text-align:center; font-size:10px;'>Page {page} of {total-pages}</div>",
.DrawDividerLine = True,
.MaxHeight = 25
}
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Content</h1>")
pdf.SaveAs("with_headers.pdf")
IronPDF obsługuje tokeny zastępcze, takie jak {page} i {total-pages}, służące do dynamicznego numerowania stron. Aby uzyskać więcej opcji, zapoznaj się z dokumentacją dotyczącą nagłówków i stopek.
Integracja z ASP.NET Core.NET Core
Wymagania dotyczące inicjalizacji PDF komplikują integrację z aplikacjami internetowymi.IronPDFupraszcza ten proces.
Wzór IronPDF:
[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
[HttpGet("generate")]
public IActionResult GeneratePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
[HttpGet("generate-async")]
public async Task<IActionResult> GeneratePdfAsync()
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");
return File(pdf.Stream, "application/pdf", "report.pdf");
}
}
[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
[HttpGet("generate")]
public IActionResult GeneratePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
[HttpGet("generate-async")]
public async Task<IActionResult> GeneratePdfAsync()
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");
return File(pdf.Stream, "application/pdf", "report.pdf");
}
}
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("[controller]")>
Public Class PdfController
Inherits ControllerBase
<HttpGet("generate")>
Public Function GeneratePdf() As IActionResult
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>")
Return File(pdf.BinaryData, "application/pdf", "report.pdf")
End Function
<HttpGet("generate-async")>
Public Async Function GeneratePdfAsync() As Task(Of IActionResult)
Dim renderer = New ChromePdfRenderer()
Dim pdf = Await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>")
Return File(pdf.Stream, "application/pdf", "report.pdf")
End Function
End Class
Konfiguracja wstrzykiwania zależności
// Program.cs
public void ConfigureServices(IServiceCollection services)
{
// Set license once
IronPdf.License.LicenseKey = Configuration["IronPdf:LicenseKey"];
// Register renderer as scoped service
services.AddScoped<ChromePdfRenderer>();
// Or create a wrapper service
services.AddScoped<IPdfService, IronPdfService>();
}
// IronPdfService.cs
public class IronPdfService : IPdfService
{
private readonly ChromePdfRenderer _renderer;
public IronPdfService()
{
_renderer = new ChromePdfRenderer();
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
_renderer.RenderingOptions.PrintHtmlBackgrounds = true;
}
public PdfDocument GenerateFromHtml(string html) =>
_renderer.RenderHtmlAsPdf(html);
public Task<PdfDocument> GenerateFromHtmlAsync(string html) =>
_renderer.RenderHtmlAsPdfAsync(html);
}
// Program.cs
public void ConfigureServices(IServiceCollection services)
{
// Set license once
IronPdf.License.LicenseKey = Configuration["IronPdf:LicenseKey"];
// Register renderer as scoped service
services.AddScoped<ChromePdfRenderer>();
// Or create a wrapper service
services.AddScoped<IPdfService, IronPdfService>();
}
// IronPdfService.cs
public class IronPdfService : IPdfService
{
private readonly ChromePdfRenderer _renderer;
public IronPdfService()
{
_renderer = new ChromePdfRenderer();
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
_renderer.RenderingOptions.PrintHtmlBackgrounds = true;
}
public PdfDocument GenerateFromHtml(string html) =>
_renderer.RenderHtmlAsPdf(html);
public Task<PdfDocument> GenerateFromHtmlAsync(string html) =>
_renderer.RenderHtmlAsPdfAsync(html);
}
' Program.vb
Public Sub ConfigureServices(services As IServiceCollection)
' Set license once
IronPdf.License.LicenseKey = Configuration("IronPdf:LicenseKey")
' Register renderer as scoped service
services.AddScoped(Of ChromePdfRenderer)()
' Or create a wrapper service
services.AddScoped(Of IPdfService, IronPdfService)()
End Sub
' IronPdfService.vb
Public Class IronPdfService
Implements IPdfService
Private ReadOnly _renderer As ChromePdfRenderer
Public Sub New()
_renderer = New ChromePdfRenderer()
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
_renderer.RenderingOptions.PrintHtmlBackgrounds = True
End Sub
Public Function GenerateFromHtml(html As String) As PdfDocument Implements IPdfService.GenerateFromHtml
Return _renderer.RenderHtmlAsPdf(html)
End Function
Public Function GenerateFromHtmlAsync(html As String) As Task(Of PdfDocument) Implements IPdfService.GenerateFromHtmlAsync
Return _renderer.RenderHtmlAsPdfAsync(html)
End Function
End Class
Porownanie wydajnosci
| Metryka | Apryse PDF | IronPDF |
|---|---|---|
| Zimny start | Szybki (kod natywny) | ~2 s (inicjalizacja Chromium) |
| Kolejne wersje | Szybko | Szybko |
| Złożony kod HTML | Zmienna (moduł html2pdf) | Doskonałe (Chromium) |
| Obsługa CSS | Ograniczone | Pełny CSS3 |
| JavaScript | Ograniczone | Obsługiwane |
Wskazówki dotyczące optymalizacji wydajności
// 1. Reuse renderer instance
private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer();
// 2. Disable unnecessary features for speed
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = false; // If not needed
renderer.RenderingOptions.WaitFor.RenderDelay(0); // No delay
renderer.RenderingOptions.Timeout = 30000; // 30s max
// 3. Proper disposal
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
pdf.SaveAs("output.pdf");
}
// 1. Reuse renderer instance
private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer();
// 2. Disable unnecessary features for speed
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = false; // If not needed
renderer.RenderingOptions.WaitFor.RenderDelay(0); // No delay
renderer.RenderingOptions.Timeout = 30000; // 30s max
// 3. Proper disposal
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
pdf.SaveAs("output.pdf");
}
' 1. Reuse renderer instance
Private Shared ReadOnly SharedRenderer As New ChromePdfRenderer()
' 2. Disable unnecessary features for speed
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.EnableJavaScript = False ' If not needed
renderer.RenderingOptions.WaitFor.RenderDelay(0) ' No delay
renderer.RenderingOptions.Timeout = 30000 ' 30s max
' 3. Proper disposal
Using pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Using
Rozwiązywanie typowych problemów związanych z migracją
Problem: Błędy ścieżki modułu
Usuń wszystkie konfiguracje ścieżek modułów — silnik ChromiumIronPDFjest wbudowany:
// Remove this
converter.SetModulePath("path/to/html2pdf");
// Just use the renderer
var renderer = new ChromePdfRenderer();
// Remove this
converter.SetModulePath("path/to/html2pdf");
// Just use the renderer
var renderer = new ChromePdfRenderer();
Problem: Nie znaleziono funkcji PDFNet.Initialize()
Zastąp przez konfigurację licencji IronPDF:
// Remove this
PDFNet.Initialize("KEY");
PDFNet.SetResourcesPath("path");
// Use this (optional for development)
IronPdf.License.LicenseKey = "YOUR-KEY";
// Remove this
PDFNet.Initialize("KEY");
PDFNet.SetResourcesPath("path");
// Use this (optional for development)
IronPdf.License.LicenseKey = "YOUR-KEY";
' Remove this
PDFNet.Initialize("KEY")
PDFNet.SetResourcesPath("path")
' Use this (optional for development)
IronPdf.License.LicenseKey = "YOUR-KEY"
Problem: Zastąpienie PDFViewCtrl
IronPDF nie zawiera elementów sterujących przeglądarki. Opcje:
- Użyj PDF.js do przeglądarek internetowych
- Użyj systemowych przeglądarek plików PDF
- Rozważ użycie komponentów przeglądarek innych firm
Lista kontrolna po migracji
Po zakończeniu migracji kodu sprawdź, czy:
- Sprawdź, czy jakość pliku PDF odpowiada oczekiwaniom
- Przetestuj wszystkie skrajne przypadki (duże dokumenty, złożone arkusze CSS)
- Porównaj wskaźniki wydajności
- W razie potrzeby zaktualizuj konfiguracje Docker
- Usuń licencję Apryse i powiązane konfiguracje
- Udokumentuj wszelkie konfiguracje specyficzne dla IronPDF
- Przeszkol zespół w zakresie nowych wzorców API
- W razie potrzeby zaktualizuj potoki CI/CD
Zabezpieczenie infrastruktury PDF na przyszłość
W obliczu zbliżającej się premiery .NET 10 i wprowadzenia nowych funkcji językowych w C# 14, wybór natywnej biblioteki PDF dla platformy .NET, zgodnej z nowoczesnymi standardami, zapewnia kompatybilność z ewoluującymi możliwościami środowiska uruchomieniowego. ZaangażowanieIronPDFw obsługę najnowszych wersji .NET oznacza, że inwestycja w migrację przyniesie korzyści w miarę rozszerzania się projektów w latach 2025 i 2026 — bez konieczności corocznego odnawiania subskrypcji.
Dodatkowe zasoby
- Dokumentacja IronPDF
- Samouczki dotyczące konwersji HTML do PDF
- Dokumentacja API
- Pakiet NuGet
- Opcje licencyjne
Migracja z Apryse PDF doIronPDFprzekształca kod bazy PDF ze złożonych wzorców C++ na idiomatyczny C#. Wyeliminowanie powtarzających się fragmentów kodu inicjalizacyjnego, konfiguracji ścieżek modułów oraz licencji opartych na subskrypcji zapewnia natychmiastowy wzrost wydajności przy jednoczesnym obniżeniu kosztów w dłuższej perspektywie.

