Saltar al pie de página
GUíAS DE MIGRACIóN

Cómo migrar de Apache PDFBox a IronPDF

Migrar de Apache PDFBox a IronPDF: Guía completa de migración a C

Apache PDFBox es una respetada biblioteca Java de código abierto para la manipulación de PDF. Sin embargo, para los desarrolladores de .NET, las únicas opciones disponibles son adaptaciones no oficiales impulsadas por la comunidad que plantean importantes retos: API de estilo Java, cobertura incompleta de funciones y escaso apoyo de la comunidad .NET. Esta completa guía proporciona una ruta de migración paso a paso desde los puertos .NET de Apache PDFBox a IronPDF, una biblioteca PDF .NET nativa creada desde cero para el ecosistema .NET.

¿Por qué migrar de los puertos .NET de Apache PDFBox?

Aunque Apache PDFBox destaca en el ecosistema Java, sus puertos .NET no oficiales presentan varios retos que afectan a los equipos de desarrollo .NET.

Estado no oficial del puerto

Apache PDFBox es fundamentalmente una biblioteca Java. Todas las versiones de .NET son ports impulsados por la comunidad que carecen de soporte oficial por parte del proyecto Apache. Estas versiones suelen ir a la zaga de las versiones de Java y es posible que se pierdan funciones críticas, correcciones de errores o actualizaciones de seguridad. Para los equipos que crean aplicaciones con requisitos de longevidad que se extienden hasta 2025 y 2026, esta incertidumbre crea un riesgo técnico.

Diseño de API Java-First

Las API portadas conservan las convenciones de Java que resultan extrañas en el código .NET. Los desarrolladores se encuentran con métodos camelCase en lugar de PascalCase, objetos Java File en lugar de cadenas .NET estándar y llamadas explícitas a close() en lugar de patrones IDisposable. Esta sobrecarga cognitiva afecta a la velocidad de desarrollo y al mantenimiento del código.

Sin capacidad de renderizado HTML

Apache PDFBox está diseñado para la manipulación de PDF, no para la conversión de HTML a PDF. La creación de archivos PDF requiere la construcción manual de páginas con un posicionamiento preciso de las coordenadas, un proceso tedioso y propenso a errores que no se adapta a las necesidades modernas de generación de documentos.

Asistencia limitada de la comunidad .NET

El ecosistema .NET en torno a los puertos Apache PDFBox es escaso. Encontrar ayuda, ejemplos o mejores prácticas para cuestiones específicas de .NET resulta difícil en comparación con las bibliotecas con comunidades activas de .NET.

Potenciales dependencias de JVM

Algunos puertos de Apache PDFBox pueden requerir componentes de ejecución Java, lo que añade complejidad a la implantación y gestión del entorno en infraestructuras centradas en .NET.

Apache PDFBox frente a IronPDF: Diferencias clave

Comprender las diferencias fundamentales entre estas bibliotecas ayuda a planificar una estrategia de migración eficaz.

AspectoPuertos .NET de Apache PDFBoxIronPDF
Diseño nativoVersión no oficial de .NET centrada en Java.NET nativo, con soporte profesional
Estilo APIConvenciones de Java (camelCase, close())C# idiomático (PascalCase, using)
Representación HTMLNo compatible (construcción manual de la página)HTML/CSS/JS completo basado en Chromium
Creación de PDFPosicionamiento manual por coordenadasMaquetación basada en CSS
ComunidadCentrado en Java, escasos recursos .NETComunidad .NET activa, más de 10 millones de descargas
SoporteSólo para la comunidadAsistencia profesional disponible
Limpieza de recursosLlamadas explícitas a close()IDisposable con declaraciones using

Preparación de la migración

Prerrequisitos

Asegúrese de que su entorno cumple estos requisitos:

  • .NET Framework 4.6.2+ o .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ o JetBrains Rider
  • Acceso al gestor de paquetes NuGet
  • Clave de licencia deIronPDF(prueba gratuita disponible en ironpdf.com)

Auditar el uso de Apache PDFBox

Ejecute estos comandos en su directorio de soluciones para identificar todas las referencias a Apache PDFBox:

grep -r "apache.pdfbox\|PdfBox\|PDDocument\|PDFTextStripper" --include="*.cs" .
grep -r "PdfBox\|Apache.PdfBox" --include="*.csproj" .
grep -r "apache.pdfbox\|PdfBox\|PDDocument\|PDFTextStripper" --include="*.cs" .
grep -r "PdfBox\|Apache.PdfBox" --include="*.csproj" .
SHELL

Cambios importantes que hay que anticipar

CategoríaPuerto .NET de Apache PDFBoxIronPDFAcción de migración
Modelo de objetoPDDocument, PDPagePdfDocument, ChromePdfRendererDiferente jerarquía de clases
Creación de PDFSecuencias manuales de páginas/contenidoTraducción HTMLReescribir la lógica de creación
Estilo del métodocamelCase() (estilo Java)PascalCase() (estilo .NET)Actualizar nombres de métodos
Limpieza de recursosdocument.close()utilizaciónCambiar el patrón de eliminación
Acceso a archivosObjetos Java FileCadenas y secuencias .NET StandardUtilizar tipos de .NET
Extracción de Textoclase PDFTextStripper<código>pdf.ExtractAllText()</códigoAPI más sencilla

Proceso de migración paso a paso

Paso 1: Actualizar paquetes NuGet

Elimine los paquetes del puerto .NET de Apache PDFBox e instale IronPDF:

# Remove PDFBox .NET port packages
dotnet remove package PdfBox
dotnet remove package PDFBoxNet
dotnet remove package Apache.PdfBox

# Install IronPDF
dotnet add package IronPdf
# Remove PDFBox .NET port packages
dotnet remove package PdfBox
dotnet remove package PDFBoxNet
dotnet remove package Apache.PdfBox

# Install IronPDF
dotnet add package IronPdf
SHELL

Paso 2: Configurar la clave de licencia

Añada la clave de licencia deIronPDFal iniciar la aplicación:

// Add at application startup, before anyIronPDFoperations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup, before anyIronPDFoperations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Paso 3: Actualizar referencias de espacios de nombres

Realice una búsqueda y sustitución global en toda la solución:

VisiteSustituir por
usando org.apache.pdfbox.pdmodel;<código>usando IronPDF;</código>
usando org.apache.pdfbox.text;<código>usando IronPDF;</código>
usando org.apache.pdfbox.multipdf;<código>usando IronPDF;</código>
usando PdfBoxDotNet.Pdmodel;<código>usando IronPDF;</código>
usando Apache.Pdfbox.PdModel;<código>usando IronPDF;</código>

Referencia completa de migración de API

Operaciones de documentos

Método Apache PDFBoxMétodo IronPDFNotas
<código>PDDocument.load(ruta)</código<código>PdfDocument.FromFile(path)</códigoCargar PDF
<código>PDDocument.load(stream)</código<código>PdfDocument.FromStream(stream)</códigoCargar desde stream
nuevo PDDocument()<código>new ChromePdfRenderer()</códigoPara crear PDF
document.save(path)<código>pdf.SaveAs(ruta)</códigoGuardar PDF
document.close()declaración using o Dispose()Limpieza
<código>document.getNumberOfPages()</código<código>pdf.PageCount</códigoPropiedad del recuento de páginas
document.getPage(index)pdf.Pages[index]Página de acceso
document.removePage(index)<código>pdf.RemovePages(index)</códigoEliminar páginas

Extracción de texto

Método Apache PDFBoxMétodo IronPDFNotas
<código>new PDFTextStripper()</códigoNo es necesarioNo se requiere objeto extractor
stripper.getText(document)<código>pdf.ExtractAllText()</códigoExtracción completa de documentos
<código>stripper.setStartPage(n)</código<código>pdf.Páginas[n].Texto</códigoExtracción por página
<código>stripper.setSortByPosition(true)</códigoAutomáticoClasificación de texto incorporada

Operaciones de fusión y división

Método Apache PDFBoxMétodo IronPDFNotas
<código>new PDFMergerUtility()</códigoNo es necesarioMétodo de fusión estática
merger.addSource(file)Cargar con FromFile()Cargar documentos primero
merger.mergeDocuments()<código>PdfDocument.Merge(pdfs)</códigoFusión estática
nuevo Splitter()No es necesarioManipulación directa de páginas
<código>splitter.split(document)</código<código>pdf.CopyPages(índices)</códigoCopiar páginas específicas

Seguridad y cifrado

Método Apache PDFBoxMétodo IronPDFNotas
Política de protección estándar<código>pdf.SecuritySettings</códigoConfiguración de seguridad
<código>policy.setUserPassword()</código<código>pdf.SecuritySettings.UserPassword</códigoContraseña de usuario
<código>policy.setOwnerPassword()</código<código>pdf.SecuritySettings.OwnerPassword</códigoContraseña del propietario
<código>policy.setPermissions()</código<código>pdf.SecuritySettings.AllowUserXxx</códigoPermisos

Ejemplos de migración de código

Extracción de texto

La operación más común de Apache PDFBox demuestra la simplificación de la API que proporciona IronPDF.

Implementación del puerto .NET de Apache PDFBox:

// Apache PDFBox .NET ports are experimental and incomplete
using PdfBoxDotNet.Pdmodel;
using PdfBoxDotNet.Text;
using System;
using System.IO;

class Program
{
    static void Main()
    {
        // Note: PDFBox-dotnet has limited functionality
        using (var document = PDDocument.Load("document.pdf"))
        {
            var stripper = new PDFTextStripper();
            string text = stripper.GetText(document);
            Console.WriteLine(text);
        }
    }
}
// Apache PDFBox .NET ports are experimental and incomplete
using PdfBoxDotNet.Pdmodel;
using PdfBoxDotNet.Text;
using System;
using System.IO;

class Program
{
    static void Main()
    {
        // Note: PDFBox-dotnet has limited functionality
        using (var document = PDDocument.Load("document.pdf"))
        {
            var stripper = new PDFTextStripper();
            string text = stripper.GetText(document);
            Console.WriteLine(text);
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Implementación de IronPDF:

// 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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF elimina por completo la clase PDFTextStripper, sustituyendo la extracción en varios pasos por una única llamada a un método.

Conversión de HTML a PDF

Apache PDFBox no admite la conversión de HTML a PDF de forma nativa, lo que representa una carencia de capacidad fundamental.

Puerto .NET de Apache PDFBox (no compatible):

// Apache PDFBox does not have official .NET port
// Community ports like PDFBox-dotnet are incomplete
// and do not support HTML to PDF conversion natively.
// You would need to use additional libraries like
// iText or combine with HTML renderers separately.

using PdfBoxDotNet.Pdmodel;
using System.IO;

// Note: This is NOT supported in PDFBox
// PDFBox is primarily for PDF manipulation, not HTML rendering
// You would need external Traducción HTMLengine
// Apache PDFBox does not have official .NET port
// Community ports like PDFBox-dotnet are incomplete
// and do not support HTML to PDF conversion natively.
// You would need to use additional libraries like
// iText or combine with HTML renderers separately.

using PdfBoxDotNet.Pdmodel;
using System.IO;

// Note: This is NOT supported in PDFBox
// PDFBox is primarily for PDF manipulation, not HTML rendering
// You would need external Traducción HTMLengine
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Implementación de IronPDF:

// 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

El motor de renderizado basado en Chromium deIronPDFofrece compatibilidad total con HTML, CSS y JavaScript. Para situaciones avanzadas, consulte la documentación HTML a PDF.

Fusión de varios PDF

Implementación del puerto .NET de Apache PDFBox:

// Apache PDFBox .NET port attempt (incomplete support)
using PdfBoxDotNet.Pdmodel;
using PdfBoxDotNet.Multipdf;
using System;
using System.IO;

class Program
{
    static void Main()
    {
        // PDFBox-dotnet ports have incomplete API coverage
        var merger = new PDFMergerUtility();
        merger.AddSource("document1.pdf");
        merger.AddSource("document2.pdf");
        merger.SetDestinationFileName("merged.pdf");
        merger.MergeDocuments();
        Console.WriteLine("PDFs merged");
    }
}
// Apache PDFBox .NET port attempt (incomplete support)
using PdfBoxDotNet.Pdmodel;
using PdfBoxDotNet.Multipdf;
using System;
using System.IO;

class Program
{
    static void Main()
    {
        // PDFBox-dotnet ports have incomplete API coverage
        var merger = new PDFMergerUtility();
        merger.AddSource("document1.pdf");
        merger.AddSource("document2.pdf");
        merger.SetDestinationFileName("merged.pdf");
        merger.MergeDocuments();
        Console.WriteLine("PDFs merged");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Implementación de IronPDF:

// 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

El método estático Merge deIronPDFacepta varios documentos directamente, eliminando el patrón de clases de utilidad.

Creación de PDF desde cero

La diferencia más dramática aparece a la hora de crear PDF. Apache PDFBox requiere un posicionamiento manual por coordenadas.

Implementación del puerto .NET de Apache PDFBox:

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();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Implementación de IronPDF:

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);
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

La creación basada en HTML/CSS elimina los cálculos de coordenadas, la gestión de fuentes y la manipulación de flujos de contenido.

Añadir protección por contraseña

Implementación del puerto .NET de Apache PDFBox:

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();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Implementación de 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.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);
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF utiliza propiedades fuertemente tipadas en lugar de objetos separados de permisos y políticas.

Añadir marcas de agua

Implementación del puerto .NET de Apache PDFBox:

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();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Implementación de IronPDF:

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);
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

El marcado de agua basado en HTML deIronPDFelimina la iteración de páginas y los cálculos de matrices.

Conversión de URL a PDF

Apache PDFBox no admite la conversión de URL a PDF.IronPDFproporciona soporte nativo:

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);
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Para conocer todas las opciones de conversión de URL, consulte la documentación de URL a PDF.

Cabeceras y pies de página

Apache PDFBox requiere posicionamiento manual en cada página sin soporte integrado de encabezado/pie de página.IronPDFofrece una configuración declarativa:

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);
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Para diseños avanzados, consulte la documentación sobre encabezados y pies de página.

Integración con .NET Core

IronPDF se integra de forma natural con las modernas aplicaciones web .NET:

[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");
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Soporte Async

Los puertos de Apache PDFBox no admiten operaciones asíncronas.IronPDFofrece todas las funciones async/await:

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;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Configuración de la inyección de dependencias

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();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Optimización del rendimiento

Comparación del uso de memoria

EscenarioPuerto .NET de Apache PDFBoxIronPDFNotas
Extracción de texto~80 MB~50 MBIronPDFmás eficaz
Creación de PDF~100 MB~60 MBRenderizado HTML optimizado
Lote (100 PDF)Alto (limpieza manual)~100 MBUtilice declaraciones using

Consejos de optimización

Uso de enunciados:

// Automáticocleanup with IDisposable pattern
using var pdf = PdfDocument.FromFile(path);
// Automáticocleanup with IDisposable pattern
using var pdf = PdfDocument.FromFile(path);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Renderizador de reutilización para operaciones por lotes:

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");
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Uso de Async en aplicaciones web:

using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Solución de problemas comunes de migración

Asunto: Nombres de métodos estilo Java no encontrados

Sustituir camelCase métodos Java por PascalCase equivalentes .NET:

// 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
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Asunto: No close() Method

IronPDF utiliza el patrón IDisposable:

// PDFBox
document.close();

// IronPDF
using var pdf = PdfDocument.FromFile(path);
// Automáticodisposal at end of scope
// PDFBox
document.close();

// IronPDF
using var pdf = PdfDocument.FromFile(path);
// Automáticodisposal at end of scope
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Asunto: No hay PDFTextStripper equivalente

La extracción de texto se simplifica a un único método:

// 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;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Edición: PDFMergerUtility No encontrado

Utilice el método estático Merge:

//IronPDFuses static Merge
var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
//IronPDFuses static Merge
var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Lista de comprobación posterior a la migración

Después de completar la migración del código, verifique lo siguiente:

  • [ ] Ejecutar todas las pruebas unitarias y de integración existentes
  • [ ] Comparar visualmente resultados PDF con versiones anteriores
  • [ ] Comprobar la precisión de la extracción de texto
  • [Compruebe que la licencia funciona correctamente (IronPdf.License.IsLicensed)
  • [ ] Comparación del rendimiento con la implementación anterior
  • [ ] Actualizar las dependencias de la canalización CI/CD
  • [ ] Documente nuevos patrones para su equipo de desarrollo

Proteja su infraestructura PDF

Con .NET 10 en el horizonte y C# 14 introduciendo nuevas características del lenguaje, elegir una biblioteca PDF nativa de .NET garantiza la compatibilidad con las capacidades de tiempo de ejecución en evolución. El compromiso deIronPDFde dar soporte a las últimas versiones de .NET significa que su inversión en migración dará sus frutos a medida que los proyectos se extiendan hasta 2025 y 2026.

Recursos adicionales


La migración de los puertos .NET de Apache PDFBox aIronPDFtransforma su código PDF de patrones de estilo Java a C# idiomático. El cambio del posicionamiento manual por coordenadas al renderizado HTML/CSS, combinado con la compatibilidad nativa con async y la integración moderna con .NET, proporciona un código más limpio y fácil de mantener con un soporte profesional que respalda sus aplicaciones de producción.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más