IRONSOFTWAREHOME
VIDEOS

Cómo agregar encabezados y pies de página en PDF usando IronPDF

Curtis Chau
Curtis Chau
Updated: 19 de julio de 2026

Apryse PDF (anteriormente PDFTron) es un SDK de PDF empresarial de primera calidad conocido por sus completas funciones de procesamiento de documentos. Sin embargo, su modelo de precios premium (más de 1.500 dólares anuales por desarrollador), los complejos requisitos de integración y la herencia de C++ crean barreras para los equipos de desarrollo que buscan una funcionalidad PDF sencilla. Esta completa guía proporciona una ruta de migración paso a paso de Apryse PDFa IronPDF, una biblioteca PDF nativa de .NET con modernas convenciones de C#, una integración más sencilla y una licencia perpetua única.

¿Por qué migrar de Apryse PDF?

Aunque Apryse PDFofrece una funcionalidad sólida, hay varios factores que llevan a los equipos de desarrollo a buscar alternativas para sus necesidades de generación de PDF.

Precios premium y modelo de suscripción

Apryse PDF se dirige a clientes empresariales con un precio que puede resultar prohibitivo para proyectos pequeños o medianos:

AspectoApryse PDF(PDFTron)IronPDF
Precio Inicialmás de 1.500 $/desarrollador/año (según informes)749 $ por única vez (Lite)
Modelo de licenciaSuscripción anualLicencia perpetua
Licencia de visualizaciónCoste adicional aparteN/A (utilice visores estándar)
Licencia de servidorSe requiere un precio de empresaIncluido en los niveles de licencia
Coste total de 3 añosmás de 4.500 dólares por desarrollador749 $ una sola vez

Complejidad de la integración

La herencia C++ de Apryse PDFintroduce una complejidad que afecta a la velocidad de desarrollo:

CaracterísticaApryse PDFIronPDF
ConfiguraciónRutas de módulos, binarios externosPaquete NuGet único
InicializaciónPDFNet.Initialize() con licenciaAsignación sencilla de propiedades
Representación HTMLSe requiere un módulo html2pdf externoMotor Chromium integrado
Estilo APIC++ herencia, complejoConvenciones modernas de C#
DependenciasMúltiples DLL, específicas de cada plataformaPaquete autónomo

Cuándo considerar la migración

Migre a IronPDFsi:

  • Principalmente necesita conversión de HTML/URL a PDF
  • Desea una API más sencilla con menos repeticiones
  • El precio premium no está justificado para su caso de uso
  • No necesita los controles del visor PDFViewCtrl
  • Prefiere un licenciamiento de una sola vez sobre suscripciones

Quédese con Apryse PDFsi:

  • Necesitas sus controles de visor nativos (PDFViewCtrl)
  • Utiliza ampliamente XOD o formatos propietarios
  • Se requieren funciones empresariales específicas (redacción avanzada, etc.)
  • Su organización ya dispone de licencias empresariales

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 VS Code con extensión de C#
  • Acceso al gestor de paquetes NuGet
  • Clave de licencia de IronPDF(prueba gratuita disponible en ironpdf.com)

Uso de Apryse PDF

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

# Find all pdftron using statements
grep -r "using pdftron" --include="*.cs" .

# Find PDFNet initialization
grep -r "PDFNet.Initialize\|PDFNet.SetResourcesPath" --include="*.cs" .

# Find PDFDoc usage
grep -r "new PDFDoc\|PDFDoc\." --include="*.cs" .

# Find HTML2PDF usage
grep -r "HTML2PDF\|InsertFromURL\|InsertFromHtmlString" --include="*.cs" .

# Find ElementReader/Writer usage
grep -r "ElementReader\|ElementWriter\|ElementBuilder" --include="*.cs" .
SHELL

Cambios importantes que hay que anticipar

Apryse PDFPatrónCambio requerido
PDFNet.Initialize()Reemplazar con IronPdf.License.LicenseKey
HTML2PDF móduloChromePdfRenderer incorporado
ElementWriterIronPDF gestiona el contenido internamente
SDFDoc.SaveOptionsMétodo simple SaveAs()
PDFViewCtrlUso de visores de PDF externos
Formato XODConvertir a PDF o imágenes
Configuración de la ruta del móduloNo es necesario

Proceso de migración paso a paso

Paso 1: Actualizar paquetes NuGet

Elimine los paquetes Apryse/PDFTron e instale IronPDF:

# Remove Apryse/PDFTron packages
dotnet remove package PDFTron.NET.x64
dotnet remove package PDFTron.NET.x86
dotnet remove package pdftron

# Install IronPDF
dotnet add package IronPdf
SHELL

O a través de Package Manager Console:

Uninstall-Package PDFTron.NET.x64
Install-Package IronPdf
PowerShell

Paso 2: Actualizar referencias de espacios de nombres

Sustituya los espacios de nombres de Apryse por IronPDF:

// Remove these
using pdftron;
using pdftron.PDF;
using pdftron.PDF.Convert;
using pdftron.SDF;
using pdftron.Filters;

// Add these
using IronPdf;
using IronPdf.Rendering;

Paso 3: Eliminar la plantilla de inicialización

Apryse PDF requiere una inicialización compleja.IronPDF elimina esto por completo.

Implementación de Apryse PDF:

// Complex initialization
PDFNet.Initialize("YOUR_LICENSE_KEY");
PDFNet.SetResourcesPath("path/to/resources");
// Plus module path for HTML2PDF...

Implementación de IronPDF:

// Simple license assignment (optional for development)
IronPdf.License.LicenseKey = "YOUR_LICENSE_KEY";

No se necesita la llamada PDFNet.Terminate() con IronPDF: los recursos se administran automáticamente.

Referencia completa de migración de API

Mapeo de clases principales

Clase PDF de ApryseEquivalente de IronPDF
PDFDocPdfDocument
HTML2PDFChromePdfRenderer
TextExtractorPdfDocument.ExtractAllText()
StamperPdfDocument.ApplyWatermark()
PDFDrawPdfDocument.ToBitmap()
SecurityHandlerPdfDocument.SecuritySettings
PDFNetIronPdf.License

Operaciones de documentos

Método Apryse PDFMétodo IronPDF
new PDFDoc()new PdfDocument()
new PDFDoc(path)PdfDocument.FromFile(path)
new PDFDoc(buffer)PdfDocument.FromBinaryData(bytes)
doc.Save(path, options)pdf.SaveAs(path)
doc.Save(buffer)pdf.BinaryData
doc.Close()pdf.Dispose()
doc.GetPageCount()pdf.PageCount
doc.AppendPages(doc2, start, end)PdfDocument.Merge(pdfs)

Conversión de HTML a PDF

Método Apryse PDFMétodo IronPDF
HTML2PDF.Convert(doc)renderer.RenderHtmlAsPdf(html)
converter.InsertFromURL(url)renderer.RenderUrlAsPdf(url)
converter.InsertFromHtmlString(html)renderer.RenderHtmlAsPdf(html)
converter.SetModulePath(path)No es necesario
converter.SetPaperSize(width, height)RenderingOptions.PaperSize
converter.SetLandscape(true)RenderingOptions.PaperOrientation

Ejemplos de migración de código

Cadena HTML a PDF

La operación más común demuestra la drástica reducción de código repetitivo.

Implementación de Apryse PDF:

using pdftron;
using pdftron.PDF;

class Program
{
    static void Main()
    {
        PDFNet.Initialize("YOUR_LICENSE_KEY");
        PDFNet.SetResourcesPath("path/to/resources");

        string html = "<html><body><h1>Hello World</h1><p>Content here</p></body></html>";

        using (PDFDoc doc = new PDFDoc())
        {
            HTML2PDF converter = new HTML2PDF();
            converter.SetModulePath("path/to/html2pdf");
            converter.InsertFromHtmlString(html);

            HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
            settings.SetPrintBackground(true);
            settings.SetLoadImages(true);

            if (converter.Convert(doc))
            {
                doc.Save("output.pdf", SDFDoc.SaveOptions.e_linearized);
                Console.WriteLine("PDF created successfully");
            }
            else
            {
                Console.WriteLine($"Conversion failed: {converter.GetLog()}");
            }
        }

        PDFNet.Terminate();
    }
}

Implementación de IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        
        string html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        
        pdf.SaveAs("output.pdf");
    }
}

IronPDF elimina la inicialización, las rutas de los módulos y el código de limpieza, reduciendo más de 35 líneas a 5 líneas.

Conversión de URL a PDF

Implementación de Apryse PDF:

using pdftron;
using pdftron.PDF;

PDFNet.Initialize("YOUR_LICENSE_KEY");

using (PDFDoc doc = new PDFDoc())
{
    HTML2PDF converter = new HTML2PDF();
    converter.SetModulePath("path/to/html2pdf");

    HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
    settings.SetLoadImages(true);
    settings.SetAllowJavaScript(true);
    settings.SetPrintBackground(true);

    converter.InsertFromURL("https://example.com", settings);

    if (converter.Convert(doc))
    {
        doc.Save("webpage.pdf", SDFDoc.SaveOptions.e_linearized);
    }
}

PDFNet.Terminate();

Implementación de IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        
        string url = "https://www.example.com";
        var pdf = renderer.RenderUrlAsPdf(url);
        
        pdf.SaveAs("webpage.pdf");
    }
}

Fusión de varios PDF

Implementación de Apryse PDF:

using pdftron;
using pdftron.PDF;

PDFNet.Initialize("YOUR_LICENSE_KEY");

using (PDFDoc mainDoc = new PDFDoc())
{
    string[] files = { "doc1.pdf", "doc2.pdf", "doc3.pdf" };

    foreach (string file in files)
    {
        using (PDFDoc doc = new PDFDoc(file))
        {
            mainDoc.AppendPages(doc, 1, doc.GetPageCount());
        }
    }

    mainDoc.Save("merged.pdf", SDFDoc.SaveOptions.e_linearized);
}

PDFNet.Terminate();

Implementación de IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");
        
        var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
        
        merged.SaveAs("merged.pdf");
    }
}

El método estático Merge de IronPDF acepta múltiples documentos directamente, eliminando el patrón de iteración de páginas.

Extracción de texto

Implementación de Apryse PDF:

using pdftron;
using pdftron.PDF;

PDFNet.Initialize("YOUR_LICENSE_KEY");

using (PDFDoc doc = new PDFDoc("document.pdf"))
{
    TextExtractor extractor = new TextExtractor();

    for (int i = 1; i <= doc.GetPageCount(); i++)
    {
        Page page = doc.GetPage(i);
        extractor.Begin(page);

        string pageText = extractor.GetAsText();
        Console.WriteLine($"Page {i}:");
        Console.WriteLine(pageText);
    }
}

PDFNet.Terminate();

Implementación de IronPDF:

using IronPdf;

var pdf = PdfDocument.FromFile("document.pdf");

// Extract all text at once
string allText = pdf.ExtractAllText();
Console.WriteLine(allText);

// Extract from specific page
string page1Text = pdf.ExtractTextFromPage(0); // 0-indexed
Console.WriteLine($"Page 1: {page1Text}");

Añadir marcas de agua

Implementación de Apryse PDF:

using pdftron;
using pdftron.PDF;

PDFNet.Initialize("YOUR_LICENSE_KEY");

using (PDFDoc doc = new PDFDoc("document.pdf"))
{
    Stamper stamper = new Stamper(Stamper.SizeType.e_relative_scale, 0.5, 0.5);
    stamper.SetAlignment(Stamper.HorizontalAlignment.e_horizontal_center,
                         Stamper.VerticalAlignment.e_vertical_center);
    stamper.SetOpacity(0.3);
    stamper.SetRotation(45);
    stamper.SetFontColor(new ColorPt(1, 0, 0));
    stamper.SetTextAlignment(Stamper.TextAlignment.e_align_center);

    stamper.StampText(doc, "CONFIDENTIAL",
        new PageSet(1, doc.GetPageCount()));

    doc.Save("watermarked.pdf", SDFDoc.SaveOptions.e_linearized);
}

PDFNet.Terminate();

Implementación de IronPDF:

using IronPdf;
using IronPdf.Editing;

var pdf = PdfDocument.FromFile("document.pdf");

// HTML-based watermark with full styling control
string watermarkHtml = @"
<div style='
    color: red;
    opacity: 0.3;
    font-size: 72px;
    font-weight: bold;
    text-align: center;
'>CONFIDENTIAL</div>";

pdf.ApplyWatermark(watermarkHtml,
    rotation: 45,
    verticalAlignment: VerticalAlignment.Middle,
    horizontalAlignment: HorizontalAlignment.Center);

pdf.SaveAs("watermarked.pdf");

IronPDF utiliza marcas de agua basadas en HTML/CSS , lo que proporciona un control de estilo total a través de tecnologías web familiares.

Protección con contraseña

Implementación de Apryse PDF:

using pdftron;
using pdftron.PDF;
using pdftron.SDF;

PDFNet.Initialize("YOUR_LICENSE_KEY");

using (PDFDoc doc = new PDFDoc("document.pdf"))
{
    SecurityHandler handler = new SecurityHandler();
    handler.ChangeUserPassword("user123");
    handler.ChangeMasterPassword("owner456");

    handler.SetPermission(SecurityHandler.Permission.e_print, false);
    handler.SetPermission(SecurityHandler.Permission.e_extract_content, false);

    doc.SetSecurityHandler(handler);
    doc.Save("protected.pdf", SDFDoc.SaveOptions.e_linearized);
}

PDFNet.Terminate();

Implementación de IronPDF:

using IronPdf;

var pdf = PdfDocument.FromFile("document.pdf");

// Set passwords
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.OwnerPassword = "owner456";

// Set permissions
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;

pdf.SaveAs("protected.pdf");

Cabeceras y pies de página

Implementación de IronPDF:

using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center; font-size:12px;'>Company Header</div>",
    DrawDividerLine = true,
    MaxHeight = 30
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center; font-size:10px;'>Page {page} of {total-pages}</div>",
    DrawDividerLine = true,
    MaxHeight = 25
};

var pdf = renderer.RenderHtmlAsPdf("<h1>Content</h1>");
pdf.SaveAs("with_headers.pdf");

IronPDF admite tokens de marcador de posición como {page} y {total-pages} para la numeración de páginas dinámica. Para más opciones, consulte la documentación sobre encabezados y pies de página.

Integración con .NET Core

Los requisitos de inicialización de Apryse PDFcomplican la integración de aplicaciones web.IronPDF simplifica esta tarea.

Patrón IronPDF:

[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
    [HttpGet("generate")]
    public IActionResult GeneratePdf()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");

        return File(pdf.BinaryData, "application/pdf", "report.pdf");
    }

    [HttpGet("generate-async")]
    public async Task<IActionResult> GeneratePdfAsync()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");

        return File(pdf.Stream, "application/pdf", "report.pdf");
    }
}

Configuración de la inyección de dependencias

// Program.cs
public void ConfigureServices(IServiceCollection services)
{
    // Set license once
    IronPdf.License.LicenseKey = Configuration["IronPdf:LicenseKey"];

    // Register renderer as scoped service
    services.AddScoped<ChromePdfRenderer>();

    // Or create a wrapper service
    services.AddScoped<IPdfService, IronPdfService>();
}

// IronPdfService.cs
public class IronPdfService : IPdfService
{
    private readonly ChromePdfRenderer _renderer;

    public IronPdfService()
    {
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        _renderer.RenderingOptions.PrintHtmlBackgrounds = true;
    }

    public PdfDocument GenerateFromHtml(string html) =>
        _renderer.RenderHtmlAsPdf(html);

    public Task<PdfDocument> GenerateFromHtmlAsync(string html) =>
        _renderer.RenderHtmlAsPdfAsync(html);
}

Comparación de prestaciones

MétricaApryse PDFIronPDF
Inicio en fríoRápido (código nativo)~2s (Chromium init)
Realizaciones posterioresRápidoRápido
HTML complejoVariable (módulo html2pdf)Excelente (Chromium)
Soporte CSSLimitadoCSS3 completo
JavaScriptLimitadoSe admite

Consejos para optimizar el rendimiento

// 1. Reuse renderer instance
private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer();

// 2. Disable unnecessary features for speed
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = false; // If not needed
renderer.RenderingOptions.WaitFor.RenderDelay(0);   // No delay
renderer.RenderingOptions.Timeout = 30000;          // 30s max

// 3. Proper disposal
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
    pdf.SaveAs("output.pdf");
}

Solución de problemas comunes de migración

Asunto: Errores de ruta de módulo

Elimine toda configuración de rutas de módulos: el motor Chromium de IronPDF está incorporado:

// Remove this
converter.SetModulePath("path/to/html2pdf");

// Just use the renderer
var renderer = new ChromePdfRenderer();

Problema: PDFNet.Initialize() No encontrado

Sustituir por la configuración de licencia de IronPDF:

// Remove this
PDFNet.Initialize("KEY");
PDFNet.SetResourcesPath("path");

// Use this (optional for development)
IronPdf.License.LicenseKey = "YOUR-KEY";

Edición: Sustitución de PDFViewCtrl

IronPDF no incluye controles de visualización. Opciones:

  • Utilizar PDF.js para visores web
  • Utilizar visores de PDF del sistema
  • Tenga en cuenta los componentes de visualización de terceros

Lista de comprobación posterior a la migración

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

  • Verificación de que la calidad del PDF se ajusta a las expectativas
  • Probar todos los casos extremos (documentos grandes, CSS complejo)
  • Comparar métricas de rendimiento
  • Actualizar las configuraciones de Docker si corresponde
  • Eliminar la licencia de Apryse y las configuraciones relacionadas
  • Documentar cualquier configuración específica de IronPDF
  • Capacitar al equipo sobre nuevos patrones de API
  • Actualizar las canalizaciones de CI/CD si es necesario

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 con convenciones modernas garantiza la compatibilidad con las capacidades de tiempo de ejecución en evolución. El compromiso de IronPDFde admitir las últimas versiones de .NET significa que su inversión en migración le reportará beneficios a medida que los proyectos se extiendan hasta 2025 y 2026, sin renovaciones anuales de la suscripción.

Recursos adicionales


La migración de Apryse PDFa IronPDF transforma su código PDF de complejos patrones C++ a C# idiomático. La eliminación de la repetición de la inicialización, la configuración de la ruta del módulo y las licencias basadas en suscripciones ofrece un aumento inmediato de la productividad al tiempo que reduce los costes a largo plazo.

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 estructurados y visualmente atractivos.

...
Leer más

Artículos Relacionados

Key in blue circle

Obtenga su clave de prueba gratuita de 30 días al instante.

Your trial license will be sent to your email address

Sin limitaciones. 100 % desbloqueado. Sin tarjeta de crédito.

bullet_checkedNo se requiere tarjeta de crédito ni creación de cuentaSin limitaciones. 100 % desbloqueado. Sin tarjeta de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Reserve su Demostración en Vivo gratuita
Booking Badge

Confiado por millones de ingenieros en todo el mundo

Logos de clientes de Iron Software
Obtén tu Consulta Sin Compromiso
Completa el formulario a continuación o envía un correo a sales@ironsoftware.com
Tus detalles siempre serán mantenidos confidenciales.
Confiado por millones de ingenieros en todo el mundo
Logos de clientes de Iron Software
Obtenga su Clave de Prueba de 30 días gratis al instante.
No se requiere tarjeta de crédito ni creación de cuenta