Jak przejść z biblioteki Adobe PDF Library SDK na IronPDF
Pakiet Adobe PDF Library SDK, dostępny za pośrednictwem firmy Datalogics, zapewnia autentyczny silnik PDF o zaawansowanych możliwościach. Jednak wysokie koszty licencji, złożona Integracja SDK oraz niski poziom projektowania API sprawiają, że dla wielu zespołów programistycznych jest to niepraktyczne rozwiązanie. Niniejszy przewodnik przedstawia krok po kroku ścieżkę migracji zAdobe PDF Library SDKdoIronPDF— nowoczesnej, ekonomicznej biblioteki PDF dla platformy .NET, obsługującej .NET Framework 4.6.2 aż po .NET 9 i przyszłe wersje.
Dlaczego warto rozważyć odejście od biblioteki Adobe PDF Library SDK?
Chociaż bibliotekaAdobe PDF Library SDKoferuje oryginalny silnik Adobe PDF, kilka czynników skłania zespoły programistów do poszukiwania alternatywnych rozwiązań dla swoich potrzeb w zakresie generowania i przetwarzania plików PDF.
Wysokie koszty licencji
PakietAdobe PDF Library SDKjest dostępny w cenach dla Enterprise, zazwyczaj wynoszących od 10 000 do ponad 50 000 USD rocznie. Taka struktura kosztów sprawia, że SDK jest niepraktyczne dla małych i średnich przedsiębiorstw, start-upów, indywidualnych programistów oraz projektów, w których pełne możliwości silnika Adobe nie są niezbędne.
Złożona integracja SDK
Adobe PDF Library SDK jest oparty na natywnym kodzie C++ wymagającym plików binarnych specyficznych dla danej platformy. Programiści muszą starannie zarządzać pamięcią, obsługiwać jawne wzorce inicjalizacji i rozwiązania umowy oraz wykonywać skomplikowane procedury konfiguracyjne. Powoduje to znaczny wzrost nakładów na rozwój i komplikuje procesy CI/CD.
Projektowanie API niskiego poziomu
Tworzenie plików PDF za pomocąAdobe PDF Library SDKwymaga programowego konstruowania stron, strumieni treści, ciągów tekstowych i czcionek. Proste zadania, takie jak renderowanie treści HTML, stają się wieloetapowymi operacjami obejmującymi obliczenia współrzędnych, osadzanie czcionek i ręczne zarządzanie elementami treści.
Nakłady związane z zarządzaniem cyklem życia bibliotek
Każda operacja wymaga umieszczenia kodu w blokach Library.Initialize() i Library.Terminate() oraz starannego zwolnienia obiektów COM. Pominięcie kroków czyszczenia prowadzi do wycieków zasobów i niestabilności aplikacji.
Przesada w typowych projektach
W przypadku aplikacji wymagających przede wszystkim konwersji HTML do PDF, podstawowej obróbki dokumentów lub generowania raportów, pełny silnik Adobe PDF stanowi znaczne nadmierne zaawansowanie techniczne, podczas gdy prostsze rozwiązania zapewniają równoważne wyniki.
Adobe PDF Library SDKa IronPDF: kluczowe różnice
Zrozumienie podstawowych różnic architektonicznych między tymi bibliotekami pomaga w zaplanowaniu skutecznej strategii migracji.
| Aspekt | Adobe PDF Library SDK | IronPDF |
|---|---|---|
| Ceny | 10 000–50 000 USD+ rocznie dla Enterprise | Przystępne ceny licencji dla programistów |
| Instalacja | Natywne biblioteki DLL, specyficzne dla platformy | Prosty pakiet NuGet |
| Tworzenie dokumentów | Niskopoziomowa konstrukcja strony/treści | Renderowanie HTML/CSS |
| Inicjalizacja | Terminate() wymagane |
Automatyczne |
| Układ współrzędnych | Punkty PostScript, punkt początkowy w lewym dolnym rogu | Układ oparty na CSS |
| Obsługa czcionek | Wymagane ręczne osadzenie | Automatyczne |
| Zarządzanie pamięcią | Ręczne usuwanie obiektów COM | Standardowy wzorzec IDisposable |
| Obsługa asynchroniczna | Niedostępne | Pełna obsługa async/await |
Przygotowania przed migracją
Wymagania wstępne
Przed rozpoczęciem migracji upewnij się, że Twoje środowisko spełnia te 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 licencyjnyIronPDF(bezpłatna wersja próbna dostępna na stronie ironpdf.com)
Audyt wykorzystania biblioteki Adobe PDF Library SDK
Uruchom te polecenia w katalogu rozwiązania, aby zidentyfikować wszystkie odwołania do biblioteki Adobe PDF Library SDK:
grep -r "using Datalogics" --include="*.cs" .
grep -r "Adobe.PDF.Library" --include="*.csproj" .
grep -r "Library.Initialize\|Library.Terminate" --include="*.cs" .
grep -r "using Datalogics" --include="*.cs" .
grep -r "Adobe.PDF.Library" --include="*.csproj" .
grep -r "Library.Initialize\|Library.Terminate" --include="*.cs" .
Zmiany wymagające dostosowania
| Kategoria | Adobe PDF Library SDK | IronPDF | Działanie migracyjne |
|---|---|---|---|
| Inicjalizacja | Library.Initialize() / Terminate() |
Automatyczne | Usuń kod cyklu życia |
| Tworzenie dokumentów | new Document() z budową strony |
ChromePdfRenderer |
Użyj renderowania HTML |
| Układ współrzędnych | Punkty PostScript, punkt początkowy w lewym dolnym rogu | Układ oparty na CSS | Użyj HTML/CSS |
| Obsługa czcionek | Ręczne tworzenie i osadzanie Font |
Automatyczne | Usuń kod czcionki |
| Zarządzanie pamięcią | Ręczne usuwanie obiektów COM | Standardowy interfejs IDisposable | Użyj instrukcji using |
| Struktura strony | CreatePage(), AddContent() |
Automatycznie z HTML | Znacznie uprościć |
Proces migracji krok po kroku
Krok 1: Zaktualizuj pakiety NuGet
Usuń pakietAdobe PDF Library SDKi zainstaluj IronPDF:
# Remove Adobe PDF Library
dotnet remove package Adobe.PDF.Library.LM.NET
# Install IronPDF
dotnet add package IronPdf
# Remove Adobe PDF Library
dotnet remove package Adobe.PDF.Library.LM.NET
# Install IronPDF
dotnet add package IronPdf
Krok 2: Skonfiguruj klucz licencyjny
Zastąp licencję Adobe kluczem licencyjnym opartym na kodzie IronPDF:
// Replace Adobe's Library.LicenseKey withIronPDFlicense
// Add at application startup, before anyIronPDFoperations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Verify license status
bool isLicensed = IronPdf.License.IsLicensed;
// Replace Adobe's Library.LicenseKey withIronPDFlicense
// Add at application startup, before anyIronPDFoperations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Verify license status
bool isLicensed = IronPdf.License.IsLicensed;
' Replace Adobe's Library.LicenseKey with IronPDF license
' Add at application startup, before any IronPDF operations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
' Verify license status
Dim isLicensed As Boolean = IronPdf.License.IsLicensed
Krok 3: Zaktualizuj odniesienia do przestrzeni nazw
Przeprowadź globalne wyszukiwanie i zamianę w całym rozwiązaniu:
| Znajdź | Zastąp przez |
|---|---|
using Datalogics.PDFL; |
using IronPdf; |
using Datalogics.PDFL.Document; |
using IronPdf; |
using Datalogics.PDFL.Page; |
using IronPdf; |
using Datalogics.PDFL.Content; |
using IronPdf; |
Krok 4: Usuń kod cyklu życia biblioteki
Jednym z najważniejszych uproszczeń jest usunięcie wzorców inicjalizacji i zakończenia:
//Adobe PDF Library SDK- REMOVE THIS PATTERN
Library.Initialize();
try
{
// PDF operations
}
finally
{
Library.Terminate(); // Must always terminate
}
//IronPDF- Just use directly
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
//Adobe PDF Library SDK- REMOVE THIS PATTERN
Library.Initialize();
try
{
// PDF operations
}
finally
{
Library.Terminate(); // Must always terminate
}
//IronPDF- Just use directly
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
'Adobe PDF Library SDK- REMOVE THIS PATTERN
Library.Initialize()
Try
' PDF operations
Finally
Library.Terminate() ' Must always terminate
End Try
'IronPDF- Just use directly
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
Kompletna dokumentacja API
Metody cyklu życia biblioteki
| Metoda Adobe | OdpowiednikIronPDF |
|---|---|
Library.Initialize() |
Nie jest potrzebne |
Library.Terminate() |
Nie jest potrzebne |
Library.LicenseKey = "KEY" |
IronPdf.License.LicenseKey = "KEY" |
using (Library lib = new Library()) |
Nie jest potrzebne |
Metody tworzenia dokumentów
| Metoda Adobe | MetodaIronPDF |
|---|---|
new Document() |
new ChromePdfRenderer() |
new Document(path) |
PdfDocument.FromFile(path) |
doc.CreatePage(index, rect) |
Automatycznie z HTML |
doc.Save(SaveFlags.Full, path) |
pdf.SaveAs(path) |
doc.NumPages |
pdf.PageCount |
doc.GetPage(index) |
pdf.Pages[index] |
doc.InsertPages(...) |
PdfDocument.Merge() |
Tworzenie treści (główna zmiana paradygmatu)
Adobe PDF Library SDK wymaga tworzenia treści na niskim poziomie.IronPDFwykorzystuje HTML/CSS:
| Metoda Adobe | MetodaIronPDF |
|---|---|
new Text() |
Użyj HTML <p>, <h1> itp. |
text.AddRun(textRun) |
Użyj HTML |
new TextRun(text, font, size, point) |
Stylizacja CSS |
new Font(name, flags) |
CSS font-family |
new Image(path) |
Tag HTML <img> |
content.AddElement(...) |
Treść HTML |
page.UpdateContent() |
Nie jest potrzebne |
Znaki wodne i metody zabezpieczeń
| Metoda Adobe | MetodaIronPDF |
|---|---|
new Watermark(doc, textParams, wmParams) |
pdf.ApplyWatermark(html) |
WatermarkParams.Opacity |
CSS opacity |
new EncryptionHandler(user, owner, perms) |
pdf.SecuritySettings |
PermissionFlags.PrintDoc |
AllowUserPrinting |
Wyodrębnianie tekstu
| Metoda Adobe | MetodaIronPDF |
|---|---|
new WordFinder(doc, config) |
pdf.ExtractAllText() |
wordFinder.GetWordList() |
pdf.Pages[i].Text |
| Złożone iteracje słów/znaków | Pojedyncze wywołanie metody |
Przykłady migracji kodu
Konwersja HTML do PDF
Najbardziej radykalne uproszczenie następuje podczas konwersji treści do formatu PDF.Adobe PDF Library SDKwymaga ręcznego tworzenia stron, osadzania czcionek i pozycjonowania współrzędnych.
Wdrożenie biblioteki Adobe PDF Library SDK:
// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;
class AdobeHtmlToPdf
{
static void Main()
{
using (Library lib = new Library())
{
// Adobe PDF Library requires complex setup with HTML conversion parameters
HTMLConversionParameters htmlParams = new HTMLConversionParameters();
htmlParams.PaperSize = PaperSize.Letter;
htmlParams.Orientation = Orientation.Portrait;
string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
// Convert HTML to PDF
Document doc = Document.CreateFromHTML(htmlContent, htmlParams);
doc.Save(SaveFlags.Full, "output.pdf");
doc.Dispose();
}
}
}
// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;
class AdobeHtmlToPdf
{
static void Main()
{
using (Library lib = new Library())
{
// Adobe PDF Library requires complex setup with HTML conversion parameters
HTMLConversionParameters htmlParams = new HTMLConversionParameters();
htmlParams.PaperSize = PaperSize.Letter;
htmlParams.Orientation = Orientation.Portrait;
string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
// Convert HTML to PDF
Document doc = Document.CreateFromHTML(htmlContent, htmlParams);
doc.Save(SaveFlags.Full, "output.pdf");
doc.Dispose();
}
}
}
Imports Datalogics.PDFL
Imports System
Class AdobeHtmlToPdf
Shared Sub Main()
Using lib As New Library()
' Adobe PDF Library requires complex setup with HTML conversion parameters
Dim htmlParams As New HTMLConversionParameters()
htmlParams.PaperSize = PaperSize.Letter
htmlParams.Orientation = Orientation.Portrait
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
' Convert HTML to PDF
Dim doc As Document = Document.CreateFromHTML(htmlContent, htmlParams)
doc.Save(SaveFlags.Full, "output.pdf")
doc.Dispose()
End Using
End Sub
End Class
Wdrożenie IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class IronPdfHtmlToPdf
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
// Convert HTML to PDF with simple API
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class IronPdfHtmlToPdf
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
// Convert HTML to PDF with simple API
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports System
Class IronPdfHtmlToPdf
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
' Convert HTML to PDF with simple API
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
End Sub
End Class
IronPDF eliminuje opakowanie cyklu życia biblioteki, obiekty parametrów konwersji oraz jawną likwidację. ChromePdfRenderer wykorzystuje silnik oparty na Chromium, zapewniający idealną obsługę CSS i JavaScript. W przypadku zaawansowanych scenariuszy zapoznaj się z dokumentacją dotyczącą konwersji HTML do PDF.
Łączenie wielu plików PDF
Łączenie plików PDF wyraźnie pokazuje różnicę w złożoności API.
Wdrożenie biblioteki Adobe PDF Library SDK:
// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;
class AdobeMergePdfs
{
static void Main()
{
using (Library lib = new Library())
{
// Open first PDF document
Document doc1 = new Document("document1.pdf");
Document doc2 = new Document("document2.pdf");
// Insert pages from second document into first
PageInsertParams insertParams = new PageInsertParams();
insertParams.InsertFlags = PageInsertFlags.None;
for (int i = 0; i < doc2.NumPages; i++)
{
Page page = doc2.GetPage(i);
doc1.InsertPage(doc1.NumPages - 1, page, insertParams);
}
doc1.Save(SaveFlags.Full, "merged.pdf");
doc1.Dispose();
doc2.Dispose();
}
}
}
// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;
class AdobeMergePdfs
{
static void Main()
{
using (Library lib = new Library())
{
// Open first PDF document
Document doc1 = new Document("document1.pdf");
Document doc2 = new Document("document2.pdf");
// Insert pages from second document into first
PageInsertParams insertParams = new PageInsertParams();
insertParams.InsertFlags = PageInsertFlags.None;
for (int i = 0; i < doc2.NumPages; i++)
{
Page page = doc2.GetPage(i);
doc1.InsertPage(doc1.NumPages - 1, page, insertParams);
}
doc1.Save(SaveFlags.Full, "merged.pdf");
doc1.Dispose();
doc2.Dispose();
}
}
}
Imports Datalogics.PDFL
Imports System
Class AdobeMergePdfs
Shared Sub Main()
Using lib As New Library()
' Open first PDF document
Dim doc1 As New Document("document1.pdf")
Dim doc2 As New Document("document2.pdf")
' Insert pages from second document into first
Dim insertParams As New PageInsertParams()
insertParams.InsertFlags = PageInsertFlags.None
For i As Integer = 0 To doc2.NumPages - 1
Dim page As Page = doc2.GetPage(i)
doc1.InsertPage(doc1.NumPages - 1, page, insertParams)
Next
doc1.Save(SaveFlags.Full, "merged.pdf")
doc1.Dispose()
doc2.Dispose()
End Using
End Sub
End Class
Wdrożenie IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class IronPdfMergePdfs
{
static void Main()
{
// Load PDF documents
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
// Merge PDFs with simple method
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class IronPdfMergePdfs
{
static void Main()
{
// Load PDF documents
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
// Merge PDFs with simple method
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
Imports IronPdf
Imports System
Class IronPdfMergePdfs
Shared Sub Main()
' Load PDF documents
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
' Merge PDFs with simple method
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
End Sub
End Class
Podejście firmy Adobe wymaga iteracji strona po stronie z parametrami wstawiania.IronPDFudostępnia jedną metodę Merge, która obsługuje wiele dokumentów.
Dodawanie znaków wodnych
Znak wodny ilustruje, w jaki sposóbIronPDFwykorzystuje HTML/CSS do zapewnienia elastyczności stylizacji.
Wdrożenie biblioteki Adobe PDF Library SDK:
// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;
class AdobeAddWatermark
{
static void Main()
{
using (Library lib = new Library())
{
Document doc = new Document("input.pdf");
// Create watermark with complex API
WatermarkParams watermarkParams = new WatermarkParams();
watermarkParams.Opacity = 0.5;
watermarkParams.Rotation = 45.0;
watermarkParams.VerticalAlignment = WatermarkVerticalAlignment.Center;
watermarkParams.HorizontalAlignment = WatermarkHorizontalAlignment.Center;
WatermarkTextParams textParams = new WatermarkTextParams();
textParams.Text = "CONFIDENTIAL";
Watermark watermark = new Watermark(doc, textParams, watermarkParams);
doc.Save(SaveFlags.Full, "watermarked.pdf");
doc.Dispose();
}
}
}
// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;
class AdobeAddWatermark
{
static void Main()
{
using (Library lib = new Library())
{
Document doc = new Document("input.pdf");
// Create watermark with complex API
WatermarkParams watermarkParams = new WatermarkParams();
watermarkParams.Opacity = 0.5;
watermarkParams.Rotation = 45.0;
watermarkParams.VerticalAlignment = WatermarkVerticalAlignment.Center;
watermarkParams.HorizontalAlignment = WatermarkHorizontalAlignment.Center;
WatermarkTextParams textParams = new WatermarkTextParams();
textParams.Text = "CONFIDENTIAL";
Watermark watermark = new Watermark(doc, textParams, watermarkParams);
doc.Save(SaveFlags.Full, "watermarked.pdf");
doc.Dispose();
}
}
}
Imports Datalogics.PDFL
Imports System
Class AdobeAddWatermark
Shared Sub Main()
Using lib As New Library()
Dim doc As New Document("input.pdf")
' Create watermark with complex API
Dim watermarkParams As New WatermarkParams()
watermarkParams.Opacity = 0.5
watermarkParams.Rotation = 45.0
watermarkParams.VerticalAlignment = WatermarkVerticalAlignment.Center
watermarkParams.HorizontalAlignment = WatermarkHorizontalAlignment.Center
Dim textParams As New WatermarkTextParams()
textParams.Text = "CONFIDENTIAL"
Dim watermark As New Watermark(doc, textParams, watermarkParams)
doc.Save(SaveFlags.Full, "watermarked.pdf")
doc.Dispose()
End Using
End Sub
End Class
Wdrożenie IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;
class IronPdfAddWatermark
{
static void Main()
{
var pdf = PdfDocument.FromFile("input.pdf");
// Apply text watermark with simple API
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.5;'>CONFIDENTIAL</h1>",
rotation: 45,
verticalAlignment: VerticalAlignment.Middle,
horizontalAlignment: HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;
class IronPdfAddWatermark
{
static void Main()
{
var pdf = PdfDocument.FromFile("input.pdf");
// Apply text watermark with simple API
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.5;'>CONFIDENTIAL</h1>",
rotation: 45,
verticalAlignment: VerticalAlignment.Middle,
horizontalAlignment: HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");
}
}
Imports IronPdf
Imports IronPdf.Editing
Imports System
Class IronPdfAddWatermark
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("input.pdf")
' Apply text watermark with simple API
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.5;'>CONFIDENTIAL</h1>",
rotation:=45,
verticalAlignment:=VerticalAlignment.Middle,
horizontalAlignment:=HorizontalAlignment.Center)
pdf.SaveAs("watermarked.pdf")
End Sub
End Class
Funkcja znakowania wodnego oparta na HTML wIronPDFzapewnia pełną kontrolę nad projektem dzięki stylom CSS, eliminując potrzebę stosowania oddzielnych obiektów parametrów.
Ochrona hasłem i szyfrowanie
Wdrożenie biblioteki Adobe PDF Library SDK:
using Datalogics.PDFL;
public void ProtectPdf(string inputPath, string outputPath, string password)
{
Library.Initialize();
try
{
using (Document doc = new Document(inputPath))
{
PermissionFlags permissions =
PermissionFlags.PrintDoc |
PermissionFlags.PrintFidelity;
EncryptionHandler encHandler = new EncryptionHandler(
password, // User password
password, // Owner password
permissions,
EncryptionMethod.AES256);
doc.SetEncryptionHandler(encHandler);
doc.Save(SaveFlags.Full | SaveFlags.Encrypted, outputPath);
}
}
finally
{
Library.Terminate();
}
}
using Datalogics.PDFL;
public void ProtectPdf(string inputPath, string outputPath, string password)
{
Library.Initialize();
try
{
using (Document doc = new Document(inputPath))
{
PermissionFlags permissions =
PermissionFlags.PrintDoc |
PermissionFlags.PrintFidelity;
EncryptionHandler encHandler = new EncryptionHandler(
password, // User password
password, // Owner password
permissions,
EncryptionMethod.AES256);
doc.SetEncryptionHandler(encHandler);
doc.Save(SaveFlags.Full | SaveFlags.Encrypted, outputPath);
}
}
finally
{
Library.Terminate();
}
}
Imports Datalogics.PDFL
Public Sub ProtectPdf(inputPath As String, outputPath As String, password As String)
Library.Initialize()
Try
Using doc As New Document(inputPath)
Dim permissions As PermissionFlags = PermissionFlags.PrintDoc Or PermissionFlags.PrintFidelity
Dim encHandler As New EncryptionHandler(
password, ' User password
password, ' Owner password
permissions,
EncryptionMethod.AES256)
doc.SetEncryptionHandler(encHandler)
doc.Save(SaveFlags.Full Or SaveFlags.Encrypted, outputPath)
End Using
Finally
Library.Terminate()
End Try
End Sub
Wdrożenie IronPDF:
using IronPdf;
public void ProtectPdf(string inputPath, string outputPath, string password)
{
using var pdf = PdfDocument.FromFile(inputPath);
pdf.SecuritySettings.UserPassword = password;
pdf.SecuritySettings.OwnerPassword = password;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;
pdf.SaveAs(outputPath);
}
using IronPdf;
public void ProtectPdf(string inputPath, string outputPath, string password)
{
using var pdf = PdfDocument.FromFile(inputPath);
pdf.SecuritySettings.UserPassword = password;
pdf.SecuritySettings.OwnerPassword = password;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;
pdf.SaveAs(outputPath);
}
Imports IronPdf
Public Sub ProtectPdf(inputPath As String, outputPath As String, password As String)
Using pdf = PdfDocument.FromFile(inputPath)
pdf.SecuritySettings.UserPassword = password
pdf.SecuritySettings.OwnerPassword = password
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit
pdf.SaveAs(outputPath)
End Using
End Sub
IronPDF wykorzystuje właściwości silnie typowane zamiast bitowych flag uprawnień i obiektów obsługujących szyfrowanie.
Wyodrębnianie tekstu
Wdrożenie biblioteki Adobe PDF Library SDK:
using Datalogics.PDFL;
public string ExtractText(string pdfPath)
{
string extractedText = "";
Library.Initialize();
try
{
using (Document doc = new Document(pdfPath))
{
WordFinderConfig config = new WordFinderConfig();
config.IgnoreCharGaps = true;
for (int i = 0; i < doc.NumPages; i++)
{
using (WordFinder wordFinder = new WordFinder(doc, i, config))
{
IList<Word> words = wordFinder.GetWordList();
foreach (Word word in words)
{
extractedText += word.Text + " ";
}
extractedText += "\n";
}
}
}
}
finally
{
Library.Terminate();
}
return extractedText;
}
using Datalogics.PDFL;
public string ExtractText(string pdfPath)
{
string extractedText = "";
Library.Initialize();
try
{
using (Document doc = new Document(pdfPath))
{
WordFinderConfig config = new WordFinderConfig();
config.IgnoreCharGaps = true;
for (int i = 0; i < doc.NumPages; i++)
{
using (WordFinder wordFinder = new WordFinder(doc, i, config))
{
IList<Word> words = wordFinder.GetWordList();
foreach (Word word in words)
{
extractedText += word.Text + " ";
}
extractedText += "\n";
}
}
}
}
finally
{
Library.Terminate();
}
return extractedText;
}
Imports Datalogics.PDFL
Public Function ExtractText(ByVal pdfPath As String) As String
Dim extractedText As String = ""
Library.Initialize()
Try
Using doc As New Document(pdfPath)
Dim config As New WordFinderConfig()
config.IgnoreCharGaps = True
For i As Integer = 0 To doc.NumPages - 1
Using wordFinder As New WordFinder(doc, i, config)
Dim words As IList(Of Word) = wordFinder.GetWordList()
For Each word As Word In words
extractedText &= word.Text & " "
Next
extractedText &= vbLf
End Using
Next
End Using
Finally
Library.Terminate()
End Try
Return extractedText
End Function
Wdrożenie IronPDF:
using IronPdf;
public string ExtractText(string pdfPath)
{
using var pdf = PdfDocument.FromFile(pdfPath);
return pdf.ExtractAllText();
}
using IronPdf;
public string ExtractText(string pdfPath)
{
using var pdf = PdfDocument.FromFile(pdfPath);
return pdf.ExtractAllText();
}
Imports IronPdf
Public Function ExtractText(pdfPath As String) As String
Using pdf = PdfDocument.FromFile(pdfPath)
Return pdf.ExtractAllText()
End Using
End Function
Iteracja słowo po słowie w Adobe staje się pojedynczym wywołaniem metody dzięki IronPDF.
Nagłówki i stopki
Wdrożenie biblioteki Adobe PDF Library SDK:
using Datalogics.PDFL;
public void AddHeaderFooter(string inputPath, string outputPath)
{
Library.Initialize();
try
{
using (Document doc = new Document(inputPath))
{
Font font = new Font("Helvetica", FontCreateFlags.None);
for (int i = 0; i < doc.NumPages; i++)
{
using (Page page = doc.GetPage(i))
{
Content content = page.Content;
// Add header
Text header = new Text();
header.AddRun(new TextRun("Document Header",
font, 10, new Point(72, page.MediaBox.Top - 36)));
content.AddElement(header);
// Add footer with page number
Text footer = new Text();
footer.AddRun(new TextRun($"Page {i + 1} of {doc.NumPages}",
font, 10, new Point(72, 36)));
content.AddElement(footer);
page.UpdateContent();
}
}
doc.Save(SaveFlags.Full, outputPath);
}
}
finally
{
Library.Terminate();
}
}
using Datalogics.PDFL;
public void AddHeaderFooter(string inputPath, string outputPath)
{
Library.Initialize();
try
{
using (Document doc = new Document(inputPath))
{
Font font = new Font("Helvetica", FontCreateFlags.None);
for (int i = 0; i < doc.NumPages; i++)
{
using (Page page = doc.GetPage(i))
{
Content content = page.Content;
// Add header
Text header = new Text();
header.AddRun(new TextRun("Document Header",
font, 10, new Point(72, page.MediaBox.Top - 36)));
content.AddElement(header);
// Add footer with page number
Text footer = new Text();
footer.AddRun(new TextRun($"Page {i + 1} of {doc.NumPages}",
font, 10, new Point(72, 36)));
content.AddElement(footer);
page.UpdateContent();
}
}
doc.Save(SaveFlags.Full, outputPath);
}
}
finally
{
Library.Terminate();
}
}
Imports Datalogics.PDFL
Public Sub AddHeaderFooter(inputPath As String, outputPath As String)
Library.Initialize()
Try
Using doc As New Document(inputPath)
Dim font As New Font("Helvetica", FontCreateFlags.None)
For i As Integer = 0 To doc.NumPages - 1
Using page As Page = doc.GetPage(i)
Dim content As Content = page.Content
' Add header
Dim header As New Text()
header.AddRun(New TextRun("Document Header", font, 10, New Point(72, page.MediaBox.Top - 36)))
content.AddElement(header)
' Add footer with page number
Dim footer As New Text()
footer.AddRun(New TextRun($"Page {i + 1} of {doc.NumPages}", font, 10, New Point(72, 36)))
content.AddElement(footer)
page.UpdateContent()
End Using
Next
doc.Save(SaveFlags.Full, outputPath)
End Using
Finally
Library.Terminate()
End Try
End Sub
Wdrożenie IronPDF:
using IronPdf;
public void CreatePdfWithHeaderFooter(string html, string outputPath)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Document Header",
FontSize = 10,
FontFamily = "Helvetica"
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page} of {total-pages}",
FontSize = 10,
FontFamily = "Helvetica"
};
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(outputPath);
}
using IronPdf;
public void CreatePdfWithHeaderFooter(string html, string outputPath)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Document Header",
FontSize = 10,
FontFamily = "Helvetica"
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page} of {total-pages}",
FontSize = 10,
FontFamily = "Helvetica"
};
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(outputPath);
}
Imports IronPdf
Public Sub CreatePdfWithHeaderFooter(html As String, outputPath As String)
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
.CenterText = "Document Header",
.FontSize = 10,
.FontFamily = "Helvetica"
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
.CenterText = "Page {page} of {total-pages}",
.FontSize = 10,
.FontFamily = "Helvetica"
}
Using pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs(outputPath)
End Using
End Sub
IronPDF automatycznie obsługuje iterację stron i obsługuje tokeny zastępcze, takie jak {page} i {total-pages}. Więcej informacji na temat bardziej zaawansowanych układów znajdziesz w dokumentacji dotyczącej nagłówków i stopek.
Konwersja adresów URL do formatu PDF
Adobe PDF Library SDK nie posiada wbudowanej funkcji renderowania adresów URL.IronPDFzapewnia natywną obsługę:
using IronPdf;
public void ConvertUrlToPdf(string url, string outputPath)
{
var renderer = new ChromePdfRenderer();
using var pdf = renderer.RenderUrlAsPdf(url);
pdf.SaveAs(outputPath);
}
using IronPdf;
public void ConvertUrlToPdf(string url, string outputPath)
{
var renderer = new ChromePdfRenderer();
using var pdf = renderer.RenderUrlAsPdf(url);
pdf.SaveAs(outputPath);
}
Imports IronPdf
Public Sub ConvertUrlToPdf(url As String, outputPath As String)
Dim renderer As New ChromePdfRenderer()
Using pdf = renderer.RenderUrlAsPdf(url)
pdf.SaveAs(outputPath)
End Using
End Sub
Pełne opcje konwersji adresów URL można znaleźć w dokumentacji funkcji URL to PDF.
Integracja z ASP.NET Core.NET Core
Wzorzec statycznej inicjalizacji bibliotekiAdobe PDF Library SDKpowoduje konflikt z wstrzykiwaniem zależności.IronPDFw naturalny sposób integruje się z nowoczesnymi architekturami .NET.
Wzorzec Adobe (problematyczny dla DI):
public class AdobePdfService
{
public byte[] Generate(string content)
{
Library.Initialize();
try
{
// Złożony dokument construction...
return bytes;
}
finally
{
Library.Terminate();
}
}
}
public class AdobePdfService
{
public byte[] Generate(string content)
{
Library.Initialize();
try
{
// Złożony dokument construction...
return bytes;
}
finally
{
Library.Terminate();
}
}
}
Public Class AdobePdfService
Public Function Generate(content As String) As Byte()
Library.Initialize()
Try
' Złożony dokument construction...
Return bytes
Finally
Library.Terminate()
End Try
End Function
End Class
WzorzecIronPDF(przyjazny dla DI):
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 in Program.cs (.NET 6+):
builder.Services.AddSingleton<IPdfService, IronPdfService>();
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 in Program.cs (.NET 6+):
builder.Services.AddSingleton<IPdfService, IronPdfService>();
Imports System.Threading.Tasks
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 in Program.vb (.NET 6+):
builder.Services.AddSingleton(Of IPdfService, IronPdfService)()
Obsługa asynchroniczna
Adobe PDF Library SDK nie obsługuje operacji asynchronicznych.IronPDFzapewnia pełne możliwości async/await niezbędne dla skalowalnych aplikacji internetowych:
public async Task<IActionResult> GenerateReport()
{
var renderer = new ChromePdfRenderer();
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return File(pdf.BinaryData, "application/pdf");
}
public async Task<IActionResult> GenerateReport()
{
var renderer = new ChromePdfRenderer();
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return File(pdf.BinaryData, "application/pdf");
}
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
Public Class ReportController
Inherits Controller
Public Async Function GenerateReport() As Task(Of IActionResult)
Dim renderer As New ChromePdfRenderer()
Using pdf = Await renderer.RenderHtmlAsPdfAsync(html)
Return File(pdf.BinaryData, "application/pdf")
End Using
End Function
End Class
Optymalizacja wydajności
Porównanie zużycia pamięci
| Scenariusz | Adobe PDF Library SDK | IronPDF |
|---|---|---|
| Prosty plik PDF | ~100 MB | ~50 MB |
| Złożony dokument | ~200 MB | ~80 MB |
| Partia (100 plików PDF) | Wysoka (pamięć natywna) | ~100 MB |
Wskazówki dotyczące optymalizacji
Ponowne wykorzystanie instancji renderera:
// Good: Reuse renderer for batch operations
var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs($"output_{i}.pdf");
}
// Good: Reuse renderer for batch operations
var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs($"output_{i}.pdf");
}
' Good: Reuse renderer for batch operations
Dim renderer = New ChromePdfRenderer()
For Each html In htmlList
Using pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs($"output_{i}.pdf")
End Using
Next
Wykorzystanie Async w aplikacjach internetowych:
public async Task<IActionResult> GenerateReport()
{
var renderer = new ChromePdfRenderer();
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return File(pdf.BinaryData, "application/pdf");
}
public async Task<IActionResult> GenerateReport()
{
var renderer = new ChromePdfRenderer();
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return File(pdf.BinaryData, "application/pdf");
}
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
Public Class ReportController
Inherits Controller
Public Async Function GenerateReport() As Task(Of IActionResult)
Dim renderer As New ChromePdfRenderer()
Using pdf = Await renderer.RenderHtmlAsPdfAsync(html)
Return File(pdf.BinaryData, "application/pdf")
End Using
End Function
End Class
Rozwiązywanie typowych problemów związanych z migracją
Problem: Pozycjonowanie oparte na współrzędnych nie działa
Adobe używa współrzędnych punktowych PostScript.IronPDFwykorzystuje pozycjonowanie CSS:
// Adobe: Point-based
new TextRun("Hello", font, 12, new Point(100, 700));
// IronPDF: CSS-based
string html = "<p style='position:absolute; left:100px; top:92px;'>Hello</p>";
// Adobe: Point-based
new TextRun("Hello", font, 12, new Point(100, 700));
// IronPDF: CSS-based
string html = "<p style='position:absolute; left:100px; top:92px;'>Hello</p>";
' Adobe: Point-based
New TextRun("Hello", font, 12, New Point(100, 700))
' IronPDF: CSS-based
Dim html As String = "<p style='position:absolute; left:100px; top:92px;'>Hello</p>"
Problem: Różnice w rozmiarze stron
Adobe stosuje punkty PostScript.IronPDFwykorzystuje wyliczenia lub wymiary niestandardowe:
// Adobe: Points
Rect(0, 0, 612, 792) // Letter
// IronPDF: Enum or custom
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
// Or custom:
renderer.RenderingOptions.SetCustomPaperSizeInInches(8.5, 11);
// Adobe: Points
Rect(0, 0, 612, 792) // Letter
// IronPDF: Enum or custom
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
// Or custom:
renderer.RenderingOptions.SetCustomPaperSizeInInches(8.5, 11);
' Adobe: Points
Rect(0, 0, 612, 792) ' Letter
' IronPDF: Enum or custom
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter
' Or custom:
renderer.RenderingOptions.SetCustomPaperSizeInInches(8.5, 11)
Problem: Nie znaleziono czcionki
Adobe wymaga ręcznego osadzania czcionek.IronPDFautomatycznie obsługuje czcionki:
// IronPDF: Use web fonts if needed
string html = @"
<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
body { font-family: 'Roboto', sans-serif; }
</style>";
// IronPDF: Use web fonts if needed
string html = @"
<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
body { font-family: 'Roboto', sans-serif; }
</style>";
' IronPDF: Use web fonts if needed
Dim html As String = "
<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
body { font-family: 'Roboto', sans-serif; }
</style>"
Problem: SaveFlags niedostępne
Adobe stosuje kombinacje flag zapisywania.IronPDFwykorzystuje bezpośrednie zapisywanie:
// Adobe
doc.Save(SaveFlags.Full | SaveFlags.Incremental, path);
//IronPDF- full save is default
pdf.SaveAs(path);
// Adobe
doc.Save(SaveFlags.Full | SaveFlags.Incremental, path);
//IronPDF- full save is default
pdf.SaveAs(path);
Lista kontrolna po migracji
Po zakończeniu migracji kodu sprawdź, czy:
- Uruchom wszystkie istniejące testy jednostkowe i integracyjne
- Porównaj wizualnie pliki PDF z poprzednimi wersjami
- Przetestuj wszystkie procesy związane z plikami PDF w środowisku testowym
- Sprawdź, czy licencjonowanie działa poprawnie (
IronPdf.License.IsLicensed) - Testy wydajności w porównaniu z poprzednią implementacją
- Usuń konfigurację licencji Adobe
- Aktualizacja zależności potoku CI/CD
- Usuń wszystkie biblioteki DLL Adobe PDF Library z projektu
- Opisz nowe wzorce dla swojego zespołu programistów
Zabezpieczenie infrastruktury PDF na przyszłość
Wraz ze zbliżającym się wydaniem .NET 10 i wprowadzeniem nowych funkcji językowych w C# 14, wybór biblioteki .NET do obsługi plików PDF, która jest aktywnie rozwijana, 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.
Dodatkowe zasoby
- Dokumentacja IronPDF
- Samouczki dotyczące konwersji HTML do PDF
- Dokumentacja API
- Pakiet NuGet
- Opcje licencyjne
Przejście zAdobe PDF Library SDKnaIronPDFznacznie upraszcza kod generujący pliki PDF, jednocześnie znacznie obniżając koszty licencji. Przejście od niskopoziomowej konstrukcji stron do renderowania HTML/CSS eliminuje setki linii kodu związanego z obliczaniem współrzędnych, zarządzaniem czcionkami i obsługą cyklu życia. Zespołom tworzącym nowoczesne aplikacje .NETIronPDFzapewnia równoważne możliwości dzięki przyjaznemu dla programistów interfejsowi API zaprojektowanemu z myślą o współczesnych procesach programistycznych.

