Wie man Text und Bitmap auf PDFs zeichnet
Apache PDFBox ist eine angesehene Open-Source-Java-Bibliothek zur Bearbeitung von PDFs. Für .NET Entwickler sind die verfügbaren Optionen jedoch inoffizielle, von der Community entwickelte Portierungen, die erhebliche Herausforderungen mit sich bringen – APIs im Java-Stil, unvollständige Funktionsabdeckung und eingeschränkter Support durch die .NET Community. Dieser Leitfaden bietet einen detaillierten Migrationspfad von Apache PDFBox .NET-Anschlüssezu IronPDF, einer nativen .NET PDF-Bibliothek, die speziell für das .NET Ökosystem entwickelt wurde.
Warum sollte man eine Migration von Apache PDFBox .NET-Anschlüssein Betracht ziehen?
Während Apache PDFBox im Java-Ökosystem hervorragend funktioniert, stellen die inoffiziellen .NET Portierungen einige Herausforderungen dar, die .NET -Entwicklungsteams betreffen.
Inoffizieller Status des Ports
Apache PDFBox ist primär eine Java-Bibliothek (aktuelle Linie 3.0.7, Legacy 2.0.36, Apache-Lizenz 2.0). Alle .NET-Optionen sind gemeinschaftsgetriebene Ports, und die meisten sind aufgegeben: Pdfbox 1.1.1 (zuletzt veröffentlicht 2013, basierend auf PDFBox 1.8.2), Pdfbox-IKVM 1.8.9 (zuletzt veröffentlicht im März 2017) und PdfBox_DotNet_Version 2.0.15 (zuletzt veröffentlicht im Juli 2019). Die einzige aktiv gepflegte Option ist MASES.NetPDF (3.0.x Linie, verfolgt PDFBox 3.0.x), die ein JCOBridge-Wrapper ist, der zur Laufzeit eine JVM neben der CLR erfordert. Diese Ports hinken oft hinter Java-Versionen hinterher und könnten kritische Funktionen, Fehlerbehebungen oder Sicherheitsupdates verpassen — ein Risiko, das für langlebige .NET-Projekte abgewogen werden sollte.
Java-First API Entwurf
Die portierten APIs behalten die Java-Konventionen bei, die sich im .NET-Code fremd anfühlen. Entwickler stoßen auf camelCase Methoden anstelle von PascalCase, Java-File Objekte anstelle von Standard-.NET-Strings und explizite close() Aufrufe anstelle von IDisposable Mustern. Dieser kognitive Mehraufwand beeinträchtigt die Entwicklungsgeschwindigkeit und die Wartbarkeit des Codes.
Keine HTML-Rendering-Fähigkeit
Apache PDFBox ist für die Bearbeitung von PDF-Dateien konzipiert, nicht für die Umwandlung von HTML in PDF. Die Erstellung von PDFs erfordert eine manuelle Seitenkonstruktion mit präziser Koordinatenpositionierung - ein langwieriger und fehleranfälliger Prozess, der nicht für die Anforderungen der modernen Dokumentenerstellung geeignet ist.
Eingeschränkte Unterstützung der .NET-Community
Das .NET-Ökosystem um die Apache PDFBox-Ports ist spärlich. Die Suche nach Hilfe, Beispielen oder Best Practices for .NET-spezifische Themen gestaltet sich im Vergleich zu Bibliotheken mit aktiven .NET-Communities schwierig.
JVM-Abhängigkeiten
Die auf IKVM basierenden Ports (Pdfbox-IKVM, Pdfbox) bündeln eine .NET-Reimplementierung der JVM, während MASES.NetPDF über JCOBridge in eine echte JVM ruft. In jedem Fall trägt die Bereitstellung das Java-Laufzeitgepäck, das idiomatische .NET-Bibliotheken vermeiden.
Apache PDFBox vs. IronPDF: Hauptunterschiede
Das Verständnis der grundlegenden Unterschiede zwischen diesen Bibliotheken hilft bei der Planung einer effektiven Migrationsstrategie.
| Aspekt | Apache PDFBox .NET-Anschlüsse | IronPDF |
|---|---|---|
| Natives Design | Java-zentrierte, inoffizielle .NET-Portierung | Native .NET-Bibliothek |
| API-Stil | Java-Konventionen (camelCase, close()) |
Idiomatic C# (PascalCase, using) |
| HTML-Rendering | Nicht unterstützt (manueller Seitenaufbau) | Vollständig Chromium-basiertes HTML/CSS/JS |
| PDF-Erstellung | Manuelle Koordinatenpositionierung | CSS-basiertes Layout |
| Gemeinschaft | Java-zentriert, wenig .NET-Ressourcen | Aktive .NET-Gemeinschaft |
| Unterstützung | Nur für die Gemeinschaft | Kommerzieller Support verfügbar |
| Ressourcen-Bereinigung | Explizite close() Aufrufe |
IDisposable mit using Anweisungen |
Vorbereitung auf die Migration
Voraussetzungen
Stellen Sie sicher, dass Ihre Umgebung diese Anforderungen erfüllt:
- .NET Framework 4.6.2+ oder .NET Core 3.1 / .NET 5-9
- Visual Studio 2019+ oder JetBrains Rider
- NuGet Package Manager Zugang
- IronPDF-Lizenzschlüssel (kostenlose Testversion erhältlich unter ironpdf.com)
Audit der Apache PDFBox-Nutzung
Führen Sie diese Befehle in Ihrem Lösungsverzeichnis aus, um alle Apache PDFBox-Referenzen zu identifizieren:
grep -r "org.apache.pdfbox\|Org.Apache.Pdfbox\|PDDocument\|PDFTextStripper" --include="*.cs" .
grep -rE "Pdfbox|Pdfbox-IKVM|PdfBox_DotNet_Version|MASES\.NetPDF" --include="*.csproj" .
grep -r "org.apache.pdfbox\|Org.Apache.Pdfbox\|PDDocument\|PDFTextStripper" --include="*.cs" .
grep -rE "Pdfbox|Pdfbox-IKVM|PdfBox_DotNet_Version|MASES\.NetPDF" --include="*.csproj" .
Bahnbrechende Änderungen, die zu erwarten sind
| Kategorie | Apache PDFBox .NET-Anschluss | IronPDF | Migration Aktion |
|---|---|---|---|
| Objektmodell | PDDocument, PDPage |
PdfDocument, ChromePdfRenderer |
Unterschiedliche Klassenhierarchie |
| PDF-Erstellung | Manuelle Seiten-/Inhaltsströme | HTML-Rendering | Neuschreiben der Erstellungslogik |
| Methode Stil | camelCase() (Java-Stil) |
PascalCase() (.NET-Stil) |
Methodennamen aktualisieren |
| Bereinigung von Ressourcen | document.close() |
using Anweisungen |
Entsorgungsmuster ändern |
| Dateizugriff | Java-File Objekte |
.NET Standard Strings/Streams | .NET-Typen verwenden |
| Textextraktion | PDFTextStripper Klasse |
pdf.ExtractAllText() |
Einfachere API |
Schritt-für-Schritt-Migrationsprozess
Schritt 1: NuGet-Pakete aktualisieren
Entfernen Sie die Apache PDFBox .NET-Port-Pakete und installieren Sie IronPDF:
# Remove whichever PDFBox .NET port your project uses
dotnet remove package Pdfbox # built against PDFBox 1.8.2 (2013)
dotnet remove package Pdfbox-IKVM # IKVM wrapper, last update 2017
dotnet remove package PdfBox_DotNet_Version # last update 2019
dotnet remove package MASES.NetPDF # JCOBridge wrapper, requires JVM
# Install IronPDF
dotnet add package IronPdf
# Remove whichever PDFBox .NET port your project uses
dotnet remove package Pdfbox # built against PDFBox 1.8.2 (2013)
dotnet remove package Pdfbox-IKVM # IKVM wrapper, last update 2017
dotnet remove package PdfBox_DotNet_Version # last update 2019
dotnet remove package MASES.NetPDF # JCOBridge wrapper, requires JVM
# Install IronPDF
dotnet add package IronPdf
Schritt 2: Konfigurieren des Lizenzschlüssels
Fügen Sie den IronPDF-Lizenzschlüssel beim Starten der Anwendung hinzu:
// Add at application startup, before any IronPDF operations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup, before any IronPDF operations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup, before any IronPDF operations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Schritt 3: Aktualisieren der Namensraum-Referenzen
Führen Sie ein globales Suchen und Ersetzen in Ihrer Lösung durch:
Alle PDFBox-.NET-Ports spiegeln die Java-Paket-Hierarchie wider. Die auf IKVM basierenden Ports behalten das kleingeschriebene Java-Format (org.apache.pdfbox.*) bei; MASES.NetPDF schreibt es für C# im Titel-Case (Org.Apache.Pdfbox.*).
| Finden Sie | Ersetzen durch |
|---|---|
using org.apache.pdfbox.pdmodel; (IKVM-Ports) |
using IronPdf; |
using org.apache.pdfbox.text; (IKVM-Ports) |
using IronPdf; |
using org.apache.pdfbox.multipdf; (IKVM-Ports) |
using IronPdf; |
using Org.Apache.Pdfbox.Pdmodel; (MASES.NetPDF) |
using IronPdf; |
using Org.Apache.Pdfbox.Text; (MASES.NetPDF) |
using IronPdf; |
Komplette API-Migrationsreferenz
Dokumentenoperationen
| Apache PDFBox-Methode | IronPDF-Methode |
|---|---|
PDDocument.load(path) |
PdfDocument.FromFile(path) |
PDDocument.load(stream) |
PdfDocument.FromStream(stream) |
new PDDocument() |
new ChromePdfRenderer() |
document.save(path) |
pdf.SaveAs(path) |
document.close() |
using Anweisung oder Dispose() |
document.getNumberOfPages() |
pdf.PageCount |
document.getPage(index) |
pdf.Pages[index] |
document.removePage(index) |
pdf.RemovePages(index) |
Textextraktion
| Apache PDFBox-Methode | IronPDF-Methode |
|---|---|
new PDFTextStripper() |
Nicht erforderlich |
stripper.getText(document) |
pdf.ExtractAllText() |
stripper.setStartPage(n) |
pdf.Pages[n].Text |
stripper.setSortByPosition(true) |
Automatisch |
Merge- und Split-Operationen
| Apache PDFBox-Methode | IronPDF-Methode |
|---|---|
new PDFMergerUtility() |
Nicht erforderlich |
merger.addSource(file) |
Laden mit FromFile() |
merger.mergeDocuments() |
PdfDocument.Merge(pdfs) |
new Splitter() |
Nicht erforderlich |
splitter.split(document) |
pdf.CopyPages(indices) |
Sicherheit und Verschlüsselung
| Apache PDFBox-Methode | IronPDF-Methode |
|---|---|
StandardProtectionPolicy |
pdf.SecuritySettings |
policy.setUserPassword() |
pdf.SecuritySettings.UserPassword |
policy.setOwnerPassword() |
pdf.SecuritySettings.OwnerPassword |
policy.setPermissions() |
pdf.SecuritySettings.AllowUserXxx |
Beispiele für die Code-Migration
Textextraktion
Die häufigste Apache PDFBox-Operation demonstriert die API-Vereinfachung, die IronPDF bietet.
Apache PDFBox .NET Port Implementierung:
// Apache PDFBox is a Java library — there is no official .NET port.
// Example uses Pdfbox-IKVM (last published 2017) on NuGet; namespaces
// mirror the Java packages exactly because IKVM exposes the Java API.
using org.apache.pdfbox.pdmodel;
using org.apache.pdfbox.text;
using java.io;
using System;
class Program
{
static void Main()
{
PDDocument document = PDDocument.load(new File("document.pdf"));
try
{
PDFTextStripper stripper = new PDFTextStripper();
string text = stripper.getText(document);
Console.WriteLine(text);
}
finally
{
document.close();
}
}
}
// Apache PDFBox is a Java library — there is no official .NET port.
// Example uses Pdfbox-IKVM (last published 2017) on NuGet; namespaces
// mirror the Java packages exactly because IKVM exposes the Java API.
using org.apache.pdfbox.pdmodel;
using org.apache.pdfbox.text;
using java.io;
using System;
class Program
{
static void Main()
{
PDDocument document = PDDocument.load(new File("document.pdf"));
try
{
PDFTextStripper stripper = new PDFTextStripper();
string text = stripper.getText(document);
Console.WriteLine(text);
}
finally
{
document.close();
}
}
}
Imports org.apache.pdfbox.pdmodel
Imports org.apache.pdfbox.text
Imports java.io
Imports System
Module Program
Sub Main()
Dim document As PDDocument = PDDocument.load(New File("document.pdf"))
Try
Dim stripper As New PDFTextStripper()
Dim text As String = stripper.getText(document)
Console.WriteLine(text)
Finally
document.close()
End Try
End Sub
End Module
IronPDF-Implementierung:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();
Console.WriteLine(text);
// Or extract text from specific pages
string pageText = pdf.ExtractTextFromPage(0);
Console.WriteLine(pageText);
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();
Console.WriteLine(text);
// Or extract text from specific pages
string pageText = pdf.ExtractTextFromPage(0);
Console.WriteLine(pageText);
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("document.pdf")
Dim text As String = pdf.ExtractAllText()
Console.WriteLine(text)
' Or extract text from specific pages
Dim pageText As String = pdf.ExtractTextFromPage(0)
Console.WriteLine(pageText)
End Sub
End Class
IronPDF eliminiert die PDFTextStripper Klasse vollständig, indem es die mehrstufige Extraktion durch einen einzigen Methodenaufruf ersetzt.
HTML-zu-PDF-Konvertierung
Apache PDFBox unterstützt die HTML-zu-PDF-Konvertierung nicht nativ - dies stellt eine grundlegende Lücke dar.
IronPDF-Implementierung:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is HTML to PDF</p>");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is HTML to PDF</p>");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is HTML to PDF</p>")
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully")
End Sub
End Class
Die Chromium-basierte Rendering-Engine von IronPDF bietet vollständige HTML-, CSS- und JavaScript-Unterstützung. Für fortgeschrittene Szenarien siehe die HTML zu PDF Dokumentation.
Mehrere PDFs zusammenführen
Apache PDFBox .NET Port Implementierung:
// Apache PDFBox via a .NET port (e.g. Pdfbox-IKVM on nuget.org).
// The Java class org.apache.pdfbox.multipdf.PDFMergerUtility is exposed
// directly through IKVM, so method names stay Java-style (camelCase).
using org.apache.pdfbox.multipdf;
using org.apache.pdfbox.io;
using System;
class Program
{
static void Main()
{
PDFMergerUtility merger = new PDFMergerUtility();
merger.addSource("document1.pdf");
merger.addSource("document2.pdf");
merger.setDestinationFileName("merged.pdf");
// MemoryUsageSetting governs heap vs temp-file buffering
merger.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
Console.WriteLine("PDFs merged");
}
}
// Apache PDFBox via a .NET port (e.g. Pdfbox-IKVM on nuget.org).
// The Java class org.apache.pdfbox.multipdf.PDFMergerUtility is exposed
// directly through IKVM, so method names stay Java-style (camelCase).
using org.apache.pdfbox.multipdf;
using org.apache.pdfbox.io;
using System;
class Program
{
static void Main()
{
PDFMergerUtility merger = new PDFMergerUtility();
merger.addSource("document1.pdf");
merger.addSource("document2.pdf");
merger.setDestinationFileName("merged.pdf");
// MemoryUsageSetting governs heap vs temp-file buffering
merger.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
Console.WriteLine("PDFs merged");
}
}
Imports org.apache.pdfbox.multipdf
Imports org.apache.pdfbox.io
Imports System
Module Program
Sub Main()
Dim merger As New PDFMergerUtility()
merger.addSource("document1.pdf")
merger.addSource("document2.pdf")
merger.setDestinationFileName("merged.pdf")
' MemoryUsageSetting governs heap vs temp-file buffering
merger.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly())
Console.WriteLine("PDFs merged")
End Sub
End Module
IronPDF-Implementierung:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var pdf3 = PdfDocument.FromFile("document3.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
merged.SaveAs("merged.pdf");
Console.WriteLine("PDFs merged successfully");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var pdf3 = PdfDocument.FromFile("document3.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
merged.SaveAs("merged.pdf");
Console.WriteLine("PDFs merged successfully");
}
}
Imports IronPdf
Imports System
Imports System.Collections.Generic
Module Program
Sub Main()
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim pdf3 = PdfDocument.FromFile("document3.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2, pdf3)
merged.SaveAs("merged.pdf")
Console.WriteLine("PDFs merged successfully")
End Sub
End Module
Die statische Merge-Methode von IronPDF akzeptiert mehrere Dokumente direkt, wodurch das Utility-Klassen-Muster entfällt.
PDFs von Grund auf neu erstellen
Der größte Unterschied tritt bei der Erstellung von PDFs auf. Apache PDFBox erfordert eine manuelle Koordinatenpositionierung.
Apache PDFBox .NET Port Implementierung:
using org.apache.pdfbox.pdmodel;
using org.apache.pdfbox.pdmodel.font;
using org.apache.pdfbox.pdmodel.edit;
public void CreatePdf(string outputPath)
{
PDDocument document = new PDDocument();
try
{
PDPage page = new PDPage();
document.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
PDFont font = PDType1Font.HELVETICA_BOLD;
contentStream.beginText();
contentStream.setFont(font, 24);
contentStream.moveTextPositionByAmount(72, 700);
contentStream.drawString("Hello World");
contentStream.endText();
contentStream.beginText();
contentStream.setFont(PDType1Font.HELVETICA, 12);
contentStream.moveTextPositionByAmount(72, 650);
contentStream.drawString("This is a paragraph of text.");
contentStream.endText();
contentStream.close();
document.save(outputPath);
}
finally
{
document.close();
}
}
using org.apache.pdfbox.pdmodel;
using org.apache.pdfbox.pdmodel.font;
using org.apache.pdfbox.pdmodel.edit;
public void CreatePdf(string outputPath)
{
PDDocument document = new PDDocument();
try
{
PDPage page = new PDPage();
document.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
PDFont font = PDType1Font.HELVETICA_BOLD;
contentStream.beginText();
contentStream.setFont(font, 24);
contentStream.moveTextPositionByAmount(72, 700);
contentStream.drawString("Hello World");
contentStream.endText();
contentStream.beginText();
contentStream.setFont(PDType1Font.HELVETICA, 12);
contentStream.moveTextPositionByAmount(72, 650);
contentStream.drawString("This is a paragraph of text.");
contentStream.endText();
contentStream.close();
document.save(outputPath);
}
finally
{
document.close();
}
}
Imports org.apache.pdfbox.pdmodel
Imports org.apache.pdfbox.pdmodel.font
Imports org.apache.pdfbox.pdmodel.edit
Public Sub CreatePdf(outputPath As String)
Dim document As New PDDocument()
Try
Dim page As New PDPage()
document.addPage(page)
Dim contentStream As New PDPageContentStream(document, page)
Dim font As PDFont = PDType1Font.HELVETICA_BOLD
contentStream.beginText()
contentStream.setFont(font, 24)
contentStream.moveTextPositionByAmount(72, 700)
contentStream.drawString("Hello World")
contentStream.endText()
contentStream.beginText()
contentStream.setFont(PDType1Font.HELVETICA, 12)
contentStream.moveTextPositionByAmount(72, 650)
contentStream.drawString("This is a paragraph of text.")
contentStream.endText()
contentStream.close()
document.save(outputPath)
Finally
document.close()
End Try
End Sub
IronPDF-Implementierung:
using IronPdf;
public void CreatePdf(string outputPath)
{
var renderer = new ChromePdfRenderer();
string html = @"
<html>
<head>
<style>
body { font-family: Helvetica, Arial, sans-serif; margin: 1in; }
h1 { font-size: 24pt; font-weight: bold; }
p { font-size: 12pt; }
</style>
</head>
<body>
<h1>Hello World</h1>
<p>This is a paragraph of text.</p>
</body>
</html>";
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(outputPath);
}
using IronPdf;
public void CreatePdf(string outputPath)
{
var renderer = new ChromePdfRenderer();
string html = @"
<html>
<head>
<style>
body { font-family: Helvetica, Arial, sans-serif; margin: 1in; }
h1 { font-size: 24pt; font-weight: bold; }
p { font-size: 12pt; }
</style>
</head>
<body>
<h1>Hello World</h1>
<p>This is a paragraph of text.</p>
</body>
</html>";
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(outputPath);
}
Imports IronPdf
Public Sub CreatePdf(outputPath As String)
Dim renderer As New ChromePdfRenderer()
Dim html As String = "
<html>
<head>
<style>
body { font-family: Helvetica, Arial, sans-serif; margin: 1in; }
h1 { font-size: 24pt; font-weight: bold; }
p { font-size: 12pt; }
</style>
</head>
<body>
<h1>Hello World</h1>
<p>This is a paragraph of text.</p>
</body>
</html>"
Using pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs(outputPath)
End Using
End Sub
Bei der HTML/CSS-basierten Erstellung entfallen Koordinatenberechnungen, Schriftartenverwaltung und die Bearbeitung von Inhaltsströmen.
Passwortschutz hinzufügen
Apache PDFBox .NET Port Implementierung:
using org.apache.pdfbox.pdmodel;
using org.apache.pdfbox.pdmodel.encryption;
public void ProtectPdf(string inputPath, string outputPath, string password)
{
PDDocument document = PDDocument.load(new File(inputPath));
try
{
AccessPermission ap = new AccessPermission();
ap.setCanPrint(true);
ap.setCanExtractContent(false);
StandardProtectionPolicy spp = new StandardProtectionPolicy(password, password, ap);
spp.setEncryptionKeyLength(128);
document.protect(spp);
document.save(outputPath);
}
finally
{
document.close();
}
}
using org.apache.pdfbox.pdmodel;
using org.apache.pdfbox.pdmodel.encryption;
public void ProtectPdf(string inputPath, string outputPath, string password)
{
PDDocument document = PDDocument.load(new File(inputPath));
try
{
AccessPermission ap = new AccessPermission();
ap.setCanPrint(true);
ap.setCanExtractContent(false);
StandardProtectionPolicy spp = new StandardProtectionPolicy(password, password, ap);
spp.setEncryptionKeyLength(128);
document.protect(spp);
document.save(outputPath);
}
finally
{
document.close();
}
}
Imports org.apache.pdfbox.pdmodel
Imports org.apache.pdfbox.pdmodel.encryption
Public Sub ProtectPdf(inputPath As String, outputPath As String, password As String)
Dim document As PDDocument = PDDocument.load(New File(inputPath))
Try
Dim ap As New AccessPermission()
ap.setCanPrint(True)
ap.setCanExtractContent(False)
Dim spp As New StandardProtectionPolicy(password, password, ap)
spp.setEncryptionKeyLength(128)
document.protect(spp)
document.save(outputPath)
Finally
document.close()
End Try
End Sub
IronPDF-Implementierung:
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.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.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.SaveAs(outputPath)
End Using
End Sub
IronPDF verwendet stark typisierte Eigenschaften anstelle von separaten Berechtigungs- und Richtlinienobjekten.
Wasserzeichen hinzufügen
Apache PDFBox .NET Port Implementierung:
using org.apache.pdfbox.pdmodel;
using org.apache.pdfbox.pdmodel.edit;
using org.apache.pdfbox.pdmodel.font;
public void AddWatermark(string inputPath, string outputPath, string watermarkText)
{
PDDocument document = PDDocument.load(new File(inputPath));
try
{
PDFont font = PDType1Font.HELVETICA_BOLD;
for (int i = 0; i < document.getNumberOfPages(); i++)
{
PDPage page = document.getPage(i);
PDPageContentStream cs = new PDPageContentStream(
document, page, PDPageContentStream.AppendMode.APPEND, true, true);
cs.beginText();
cs.setFont(font, 72);
cs.setNonStrokingColor(200, 200, 200);
cs.setTextMatrix(Matrix.getRotateInstance(Math.toRadians(45), 200, 400));
cs.showText(watermarkText);
cs.endText();
cs.close();
}
document.save(outputPath);
}
finally
{
document.close();
}
}
using org.apache.pdfbox.pdmodel;
using org.apache.pdfbox.pdmodel.edit;
using org.apache.pdfbox.pdmodel.font;
public void AddWatermark(string inputPath, string outputPath, string watermarkText)
{
PDDocument document = PDDocument.load(new File(inputPath));
try
{
PDFont font = PDType1Font.HELVETICA_BOLD;
for (int i = 0; i < document.getNumberOfPages(); i++)
{
PDPage page = document.getPage(i);
PDPageContentStream cs = new PDPageContentStream(
document, page, PDPageContentStream.AppendMode.APPEND, true, true);
cs.beginText();
cs.setFont(font, 72);
cs.setNonStrokingColor(200, 200, 200);
cs.setTextMatrix(Matrix.getRotateInstance(Math.toRadians(45), 200, 400));
cs.showText(watermarkText);
cs.endText();
cs.close();
}
document.save(outputPath);
}
finally
{
document.close();
}
}
Imports org.apache.pdfbox.pdmodel
Imports org.apache.pdfbox.pdmodel.edit
Imports org.apache.pdfbox.pdmodel.font
Public Sub AddWatermark(inputPath As String, outputPath As String, watermarkText As String)
Dim document As PDDocument = PDDocument.load(New File(inputPath))
Try
Dim font As PDFont = PDType1Font.HELVETICA_BOLD
For i As Integer = 0 To document.getNumberOfPages() - 1
Dim page As PDPage = document.getPage(i)
Dim cs As New PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, True, True)
cs.beginText()
cs.setFont(font, 72)
cs.setNonStrokingColor(200, 200, 200)
cs.setTextMatrix(Matrix.getRotateInstance(Math.toRadians(45), 200, 400))
cs.showText(watermarkText)
cs.endText()
cs.close()
Next
document.save(outputPath)
Finally
document.close()
End Try
End Sub
IronPDF-Implementierung:
using IronPdf;
public void AddWatermark(string inputPath, string outputPath, string watermarkText)
{
using var pdf = PdfDocument.FromFile(inputPath);
pdf.ApplyWatermark(
$"<h1 style='color:lightgray;font-size:72px;'>{watermarkText}</h1>",
rotation: 45,
opacity: 50);
pdf.SaveAs(outputPath);
}
using IronPdf;
public void AddWatermark(string inputPath, string outputPath, string watermarkText)
{
using var pdf = PdfDocument.FromFile(inputPath);
pdf.ApplyWatermark(
$"<h1 style='color:lightgray;font-size:72px;'>{watermarkText}</h1>",
rotation: 45,
opacity: 50);
pdf.SaveAs(outputPath);
}
Imports IronPdf
Public Sub AddWatermark(inputPath As String, outputPath As String, watermarkText As String)
Using pdf = PdfDocument.FromFile(inputPath)
pdf.ApplyWatermark(
$"<h1 style='color:lightgray;font-size:72px;'>{watermarkText}</h1>",
rotation:=45,
opacity:=50)
pdf.SaveAs(outputPath)
End Using
End Sub
IronPDFs HTML-basierte Wasserzeichenfunktion eliminiert Seiteniterationen und Matrixberechnungen.
URL zu PDF-Konvertierung
Apache PDFBox unterstützt keine URL-zu-PDF-Konvertierung.IronPDF bietet native Unterstützung:
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
Die vollständigen Optionen für die URL-Konvertierung finden Sie in der URL in PDF-Dokumentation.
Kopf- und Fußzeilen
Die Apache PDFBox erfordert eine manuelle Positionierung auf jeder Seite und bietet keine integrierte Unterstützung für Kopf- und Fußzeilen.IronPDF bietet eine deklarative Konfiguration:
using IronPdf;
public void CreatePdfWithHeaderFooter(string html, string outputPath)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Document Title",
FontSize = 12
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page} of {total-pages}",
FontSize = 10
};
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 Title",
FontSize = 12
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page} of {total-pages}",
FontSize = 10
};
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 Title",
.FontSize = 12
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
.CenterText = "Page {page} of {total-pages}",
.FontSize = 10
}
Using pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs(outputPath)
End Using
End Sub
Für fortgeschrittene Layouts siehe die Kopf- und Fußzeilen-Dokumentation.
ASP.NET Core -Integration
IronPDF lässt sich problemlos in moderne .NET-Webanwendungen integrieren:
[HttpPost]
public IActionResult GeneratePdf([FromBody] ReportRequest request)
{
var renderer = new ChromePdfRenderer();
using var pdf = renderer.RenderHtmlAsPdf(request.Html);
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
[HttpPost]
public IActionResult GeneratePdf([FromBody] ReportRequest request)
{
var renderer = new ChromePdfRenderer();
using var pdf = renderer.RenderHtmlAsPdf(request.Html);
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
<HttpPost>
Public Function GeneratePdf(<FromBody> request As ReportRequest) As IActionResult
Dim renderer As New ChromePdfRenderer()
Using pdf = renderer.RenderHtmlAsPdf(request.Html)
Return File(pdf.BinaryData, "application/pdf", "report.pdf")
End Using
End Function
Async-Unterstützung
Die Apache-PDFBox-Ports unterstützen keine asynchronen Operationen.IronPDF bietet vollständige async/await-Funktionen:
using IronPdf;
public async Task<byte[]> GeneratePdfAsync(string html)
{
var renderer = new ChromePdfRenderer();
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
using IronPdf;
public async Task<byte[]> GeneratePdfAsync(string html)
{
var renderer = new ChromePdfRenderer();
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
Imports IronPdf
Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte())
Dim renderer As New ChromePdfRenderer()
Using pdf = Await renderer.RenderHtmlAsPdfAsync(html)
Return pdf.BinaryData
End Using
End Function
Dependency Injection Konfiguration
public interface IPdfService
{
Task<byte[]> GeneratePdfAsync(string html);
string ExtractText(string pdfPath);
}
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;
}
public string ExtractText(string pdfPath)
{
using var pdf = PdfDocument.FromFile(pdfPath);
return pdf.ExtractAllText();
}
}
public interface IPdfService
{
Task<byte[]> GeneratePdfAsync(string html);
string ExtractText(string pdfPath);
}
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;
}
public string ExtractText(string pdfPath)
{
using var pdf = PdfDocument.FromFile(pdfPath);
return pdf.ExtractAllText();
}
}
Imports System.Threading.Tasks
Public Interface IPdfService
Function GeneratePdfAsync(html As String) As Task(Of Byte())
Function ExtractText(pdfPath As String) As String
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
Public Function ExtractText(pdfPath As String) As String Implements IPdfService.ExtractText
Using pdf = PdfDocument.FromFile(pdfPath)
Return pdf.ExtractAllText()
End Using
End Function
End Class
Performance-Optimierung
Vergleich der Speichernutzung
| Szenario | Apache PDFBox .NET-Anschluss | IronPDF |
|---|---|---|
| Textextraktion | ~80 MB | ~50 MB |
| PDF-Erstellung | ~100 MB | ~60 MB |
| Stapel (100 PDFs) | Hoch (manuelle Bereinigung) | ~100 MB |
Optimierungstipps
Verwenden Sie using Anweisungen:
// Automatischcleanup with IDisposable pattern
using var pdf = PdfDocument.FromFile(path);
// Automatischcleanup with IDisposable pattern
using var pdf = PdfDocument.FromFile(path);
Imports PdfDocument
' Automatic cleanup with IDisposable pattern
Using pdf = PdfDocument.FromFile(path)
End Using
Reuse Renderer für Batch-Operationen:
var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs($"output_{i}.pdf");
}
var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs($"output_{i}.pdf");
}
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
For Each html In htmlList
Using pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs($"output_{i}.pdf")
End Using
Next
Verwendung von Async in Webanwendungen:
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
Fehlerbehebung bei allgemeinen Migrationsproblemen
Problem: Methodennamen im Java-Stil nicht gefunden
Ersetzen Sie camelCase Java-Methoden durch PascalCase .NET-Äquivalente:
// PDFBox: stripper.getText(document)
// IronPDF: pdf.ExtractAllText()
// PDFBox: document.getNumberOfPages()
// IronPDF: pdf.PageCount
// PDFBox: stripper.getText(document)
// IronPDF: pdf.ExtractAllText()
// PDFBox: document.getNumberOfPages()
// IronPDF: pdf.PageCount
' PDFBox: stripper.getText(document)
' IronPDF: pdf.ExtractAllText()
' PDFBox: document.getNumberOfPages()
' IronPDF: pdf.PageCount
Problem: Keine close() Methode
IronPDF verwendet das IDisposable Muster:
// PDFBox
document.close();
// IronPDF
using var pdf = PdfDocument.FromFile(path);
// Automatischdisposal at end of scope
// PDFBox
document.close();
// IronPDF
using var pdf = PdfDocument.FromFile(path);
// Automatischdisposal at end of scope
' PDFBox
document.Close()
' IronPDF
Using pdf = PdfDocument.FromFile(path)
' Automatic disposal at end of scope
End Using
Problem: Kein PDFTextStripper Äquivalent
Die Textextraktion wird durch eine einzige Methode vereinfacht:
// IronPDF: Just call ExtractAllText()
string text = pdf.ExtractAllText();
// Per-page extraction:
string pageText = pdf.Pages[0].Text;
// IronPDF: Just call ExtractAllText()
string text = pdf.ExtractAllText();
// Per-page extraction:
string pageText = pdf.Pages[0].Text;
' IronPDF: Just call ExtractAllText()
Dim text As String = pdf.ExtractAllText()
' Per-page extraction:
Dim pageText As String = pdf.Pages(0).Text
Problem: PDFMergerUtility Nicht gefunden
Verwenden Sie die statische Merge-Methode:
//IronPDF uses static Merge
var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
//IronPDF uses static Merge
var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
'IronPDF uses static Merge
Dim merged = PdfDocument.Merge(pdf1, pdf2, pdf3)
Post-Migrations-Checkliste
Überprüfen Sie nach Abschluss der Codemigration Folgendes:
- Alle vorhandenen Unit- und Integrationstests ausführen
- Vergleichen Sie die PDF-Ausgaben visuell mit früheren Versionen
- Testgenauigkeit der Textextraktion
- Überprüfen Sie, ob die Lizenzierung korrekt funktioniert (
IronPdf.License.IsLicensed) - Leistungsvergleich mit der vorherigen Implementierung
- CI/CD-Pipeline-Abhängigkeiten aktualisieren
- Dokumentieren Sie neue Muster für Ihr Entwicklungsteam
Zusätzliche Ressourcen
Durch die Migration von Apache PDFBox .NET-Ports zu IronPDF wird Ihre PDF-Codebasis von Java-artigen Mustern in idiomatisches C# umgewandelt. Der Wechsel von der manuellen Koordinatenpositionierung zum HTML/CSS-Rendering, kombiniert mit nativer asynchroner Unterstützung und moderner .NET-Integration, liefert sauberen, besser wartbaren Code mit professioneller Unterstützung für Ihre Produktionsanwendungen.

