Saltar al pie de página
COMPARACIONES DE PRODUCTOS

Una Comparación entre IronPDF y Apitron PDF Kit

Trabajar con archivos PDF en C# puede ser un desafío para los desarrolladores. Hay muchos factores a tener en cuenta a la hora de crear contenido para estos archivos, y más aún a la hora de convertir contenido de diferentes formatos a PDF. La automatización es ahora crucial en los procesos de desarrollo de software. Estos desafíos se han abordado con el desarrollo de bibliotecas diseñadas para ayudar a leer, escribir, crear y modificar documentos PDF, así como editar sus atributos y convertirlos desde otros formatos.

Esta publicación de blog compara dos bibliotecas PDF para .NET y .NET Core:

  • La biblioteca IronPDF
  • El Apitron PDF Kit

IronPDF y Apitron PDF Kit son bibliotecas que proporcionan funciones de manipulación de PDF para .NET y .NET Core. Ambas se pueden utilizar para tareas de conversión y manipulación de campos de documentos. También permiten la creación de marcadores. El siguiente paso es decidir qué biblioteca C# PDF .NET es mejor para nuestros proyectos .NET. Este artículo de comparación te ayudará a decidir entre estas dos bibliotecas PDF.

Primero, exploremos lo que ofrecen las dos bibliotecas y luego pasemos a la comparación en sí.

La biblioteca Apitron PDF Kit y sus características

Apitron PDF Kit es un componente .NET que le permite manipular o convertir archivos PDF de diversas maneras. Podrás añadir imágenes, dibujos y textos, firmar documentos y mucho más. También puedes editar contenido existente. El componente .NET de Apitron PDF Kit se puede utilizar para crear aplicaciones móviles, de escritorio, web, Windows y en la nube en múltiples plataformas.

Usando este SDK PDF, podrás:

  • Extraer, modificar y agregar gráficos (texto, imágenes, dibujos)
  • Dividir o fusionar documentos PDF
  • Llenar o crear formularios PDF protegidos con contraseña, soporte FDF
  • Cree documentos PDF de varias capas con grupos de contenido opcionales (OCG)
  • Agregar o eliminar campos de los documentos
  • Usar texto de derecha a izquierda o bidireccional para crear contenido de página
  • Examinar recursos dentro de un documento: fuentes definidas, archivos incrustados
  • Firmar digitalmente y comprobar firmas existentes en documentos PDF

Características principales de IronPDF

Los desarrolladores, especialmente los programadores de C#, apreciarán la biblioteca IronPDF .NET. Con esta herramienta, puede construir fácilmente una aplicación de procesamiento de PDF .NET Core.

IronPDF utiliza el motor .NET Chromium para convertir páginas HTML (en código o en formato URL) en archivos PDF. No es necesario utilizar API complejas para posicionar objetos de navegación o diseñar PDF a partir de HTML. IronPDF admite documentos web estándar, incluidos HTML, ASPX, JS, CSS e imágenes.

IronPDF se puede crear usando HTML5, CSS, JS e imágenes. Un PDF puede editarse fácilmente, estamparse y añadirse con encabezados y pies de página. También facilita la lectura de texto PDF y la extracción de gráficos.

Las características destacadas de IronPDF incluyen:

  • Creación de documentos PDF usando HTML4/5, CSS y JavaScript
  • Carga de URL con credenciales de inicio de sesión de red personalizadas, agentes de usuario, proxies, cookies, encabezados HTTP y variables de formulario (permitiendo iniciar sesión detrás de formularios de inicio de sesión HTML)
  • Lectura y completado de campos de formulario PDF
  • Extracción de texto y gráficos de PDFs
  • Actualización de páginas PDF con nuevo contenido HTML
  • Creación de encabezados y pies de página basados en texto o en HTML
  • Fusión y separación de contenido de documentos PDF
  • Conversión de formularios web ASP.NET en PDFs imprimibles
  • Impresión de archivos PDF sin el software Adobe Acrobat

IronPDF está disponible en casi todos los sistemas operativos y marcos compatibles con C#, incluidos:

  • .NET Core 2.1, 3.0, 3.1, .NET 6 & 5
  • Cumplimiento de .NET Standard 2.0 para compatibilidad universal
  • Azure, AWS, Docker, Linux, Windows

El resto del artículo es el siguiente:

  1. Instalación de IronPDF
  2. Instalación del Apitron PDF Kit
  3. Crear un documento PDF
  4. Crear encabezado y pie de página en PDF
  5. Firma digital de PDF
  6. Precios y licencias

1. Instalación de IronPDF

Hay cuatro métodos para descargar e instalar la biblioteca IronPDF. Estas son:

  1. Usar el Administrador de Paquetes NuGet
  2. El Símbolo del Sistema del Desarrollador
  3. Descargar el Paquete NuGet directamente
  4. Descargar la biblioteca .DLL de IronPDF

1.1. Uso del gestor de paquetes NuGet

Para instalar IronPDF, simplemente haz clic derecho sobre tu proyecto en el Explorador de Soluciones. Esto abrirá el Administrador de Paquetes NuGet.

A Comparison of IronPDF with Apitron PDF SDK .NET - Figure 1: Acceso al gestor de paquetes NuGet mediante el Explorador de soluciones

Acceso al gestor de paquetes NuGet mediante el Explorador de soluciones

Una vez seleccionada, navega por el paquete IronPDF e instálalo, como se muestra en la captura de pantalla a continuación.

A Comparison of IronPDF with Apitron PDF SDK .NET - Figure 2: Instalación de la biblioteca IronPDF mediante el gestor de paquetes NuGet

Instalación de la biblioteca IronPDF mediante el gestor de paquetes NuGet

1.2. Uso del símbolo del sistema para desarrolladores

También puedes instalar IronPDF a través del Símbolo del Sistema del Desarrollador.

  • Abre el Símbolo del Sistema del Desarrollador --- generalmente se encuentra en la carpeta de Visual Studio
  • Escribe el siguiente comando:
Install-Package IronPdf
  • Presiona Enter
  • Esto descargará e instalará el paquete
  • Recarga tu proyecto y comienza a usarlo

1.3. Descargar el paquete NuGet directamente

IronPDF también se puede instalar visitando el sitio del Paquete NuGet de IronPDF directamente y descargando el paquete. Los pasos son:

  • Navega a Paquete NuGet de IronPDF
  • Selecciona Descargar Paquete
  • Haz doble clic en el paquete descargado
  • El paquete se instalará
  • Recarga tu proyecto de Visual Studio y comienza a usarlo

IronPDF está descargado y listo para usar. Sin embargo, antes de eso, deberíamos instalar la biblioteca Apitron PDF.

2. Instalación del kit Apitron PDF

Para aplicaciones .NET Core, podemos instalar Apitron usando el Administrador de Paquetes NuGet, o podemos descargar e instalar Apitron desde el sitio web Apitron PDF Kit NuGet directamente.

  • Abre los paquetes NuGet en Visual Studio como lo hicimos en IronPDF.
  • Busca Apitron.PDF.Kit.
  • Haz clic en instalar en tu proyecto actual.
A Comparison of IronPDF with Apitron PDF SDK .NET - Figure 3: Apitron PDF Kit Búsqueda

Apitron PDF Kit Búsqueda

También puedes usar la Consola del Administrador de Paquetes NuGet para instalar Apitron. Sigue el paso "Usar el Símbolo del Sistema del Desarrollador" como se mencionó en IronPDF y escribe el siguiente comando:

Install-Package Apitron.PDF.Kit

Presiona ENTER. Descargará e instalará Apitron.PDF.Kit.

Agrega los siguientes espacios de nombres:

using Apitron.PDF.Kit;
using Apitron.PDF.Kit.FixedLayout.Resources;
using Apitron.PDF.Kit.FixedLayout.Resources.Fonts;
using Apitron.PDF.Kit.FlowLayout.Content;
using Apitron.PDF.Kit.Styles;
using Apitron.PDF.Kit.Styles.Appearance;
using Font = Apitron.PDF.Kit.Styles.Text.Font;
using Apitron.PDF.Kit;
using Apitron.PDF.Kit.FixedLayout.Resources;
using Apitron.PDF.Kit.FixedLayout.Resources.Fonts;
using Apitron.PDF.Kit.FlowLayout.Content;
using Apitron.PDF.Kit.Styles;
using Apitron.PDF.Kit.Styles.Appearance;
using Font = Apitron.PDF.Kit.Styles.Text.Font;
$vbLabelText   $csharpLabel

Ahora, pasemos a la comparación entre IronPDF y Apitron PDF.

3. Creación de un documento PDF

3.1. Uso de IronPDF

IronPDF tiene múltiples métodos para crear PDFs. Exploremos dos importantes.

Red URL existente a PDF

IronPDF facilita la conversión de cualquier URL a PDF. El siguiente código ayuda a convertir una URL a PDF.

var Renderer = new IronPdf.ChromePdfRenderer();
// Render a PDF from an existing URL
using var Pdf = Renderer.RenderUrlAsPdf("https://ironpdf.com/");
// Save the PDF to a file
Pdf.SaveAs("url.pdf");
var Renderer = new IronPdf.ChromePdfRenderer();
// Render a PDF from an existing URL
using var Pdf = Renderer.RenderUrlAsPdf("https://ironpdf.com/");
// Save the PDF to a file
Pdf.SaveAs("url.pdf");
$vbLabelText   $csharpLabel

Cadena de entrada HTML a PDF

El código a continuación explica cómo renderizar un documento PDF a partir de una cadena HTML. Puedes usar solo HTML, o combinarlo con CSS, imágenes y JavaScript.

var Renderer = new IronPdf.ChromePdfRenderer();
// Render a PDF from a simple HTML string
using var PDF = Renderer.RenderHtmlAsPdf("<h1>Html with CSS and Images</h1>");
PDF.SaveAs("pixel-perfect.pdf");

// Load external HTML assets like images, CSS, and JavaScript
// Set the optional BasePath as the file location to load assets from
using var AdvancedPDF = Renderer.RenderHtmlAsPdf("<img src='logo.png'><h1>Sample Text</h1>", @"C:\site\assets\");
AdvancedPDF.SaveAs("html-with-assets.pdf");
var Renderer = new IronPdf.ChromePdfRenderer();
// Render a PDF from a simple HTML string
using var PDF = Renderer.RenderHtmlAsPdf("<h1>Html with CSS and Images</h1>");
PDF.SaveAs("pixel-perfect.pdf");

// Load external HTML assets like images, CSS, and JavaScript
// Set the optional BasePath as the file location to load assets from
using var AdvancedPDF = Renderer.RenderHtmlAsPdf("<img src='logo.png'><h1>Sample Text</h1>", @"C:\site\assets\");
AdvancedPDF.SaveAs("html-with-assets.pdf");
$vbLabelText   $csharpLabel

El resultado es el siguiente:

A Comparison of IronPDF with Apitron PDF SDK .NET - Figure 4: IronPDF Generar PDF a partir de URL y cadena CSS HTML

IronPDF Generar PDF a partir de URL y cadena CSS HTML

3.2. Uso de Apitron PDF Kit

Apitron PDF no proporciona una forma de convertir una URL o HTML a PDF. Permite convertir PDF a HTML. Sin embargo, también convierte archivos XML a PDF. El archivo XML utilizado es:

<?xml version="1.0" encoding="utf-8"?>
<FlowDocument xmlns="Apitron.PDF.Kit.FlowLayout.v1">
  <Resources>
    <Image resourceId="logo" fileName="../../images/logo.png" />
  </Resources>
  <Styles>
    <Style selector="flowdocument">
      <Color value="Black" />
    </Style>
    <Style selector="grid">
      <InnerBorder thickness="1" />
      <InnerBorderColor value="Black" />
    </Style>
  </Styles>
  <Elements>
    <Image>
      <Properties>
        <Class value="logo" />
        <ResourceId value="logo" />
      </Properties>
    </Image>
    <TextBlock>
      <Properties>
        <Class value="header" />
        <Text value="Sample Interview Questions for Candidates" />
      </Properties>
    </TextBlock>
    <Br />
    <TextBlock>
      <Properties>
        <Class value="headerNote" />
        <Text value="To help facilitate the interview process, the Human Resources Department has compiled a list of questions that might be used during the phone and/or on-campus interviews. Some of the questions deal with the same content, but are phrased differently while other questions may not pertain to a specific discipline; however all of the questions are unbiased and appropriate to ask. We hope you'll find this helpful." />
      </Properties>
    </TextBlock>
  </Elements>
  <Properties>
    <Margin value="30,20,30,20" />
  </Properties>
</FlowDocument>
<?xml version="1.0" encoding="utf-8"?>
<FlowDocument xmlns="Apitron.PDF.Kit.FlowLayout.v1">
  <Resources>
    <Image resourceId="logo" fileName="../../images/logo.png" />
  </Resources>
  <Styles>
    <Style selector="flowdocument">
      <Color value="Black" />
    </Style>
    <Style selector="grid">
      <InnerBorder thickness="1" />
      <InnerBorderColor value="Black" />
    </Style>
  </Styles>
  <Elements>
    <Image>
      <Properties>
        <Class value="logo" />
        <ResourceId value="logo" />
      </Properties>
    </Image>
    <TextBlock>
      <Properties>
        <Class value="header" />
        <Text value="Sample Interview Questions for Candidates" />
      </Properties>
    </TextBlock>
    <Br />
    <TextBlock>
      <Properties>
        <Class value="headerNote" />
        <Text value="To help facilitate the interview process, the Human Resources Department has compiled a list of questions that might be used during the phone and/or on-campus interviews. Some of the questions deal with the same content, but are phrased differently while other questions may not pertain to a specific discipline; however all of the questions are unbiased and appropriate to ask. We hope you'll find this helpful." />
      </Properties>
    </TextBlock>
  </Elements>
  <Properties>
    <Margin value="30,20,30,20" />
  </Properties>
</FlowDocument>
XML

El código para convertir esta plantilla XML a PDF es el siguiente:

// Use Apitron's FlowDocument to convert XML to PDF
using (Stream stream = File.OpenRead("C:\PLACE YOUR EXACT PATH HERE\template.xml"), 
               outputStream = File.Create("fromTemplate.pdf"))
{
    ResourceManager resourceManager = new ResourceManager();
    FlowDocument doc = FlowDocument.LoadFromXml(stream, resourceManager);

    doc.Write(outputStream, resourceManager);
}
// Use Apitron's FlowDocument to convert XML to PDF
using (Stream stream = File.OpenRead("C:\PLACE YOUR EXACT PATH HERE\template.xml"), 
               outputStream = File.Create("fromTemplate.pdf"))
{
    ResourceManager resourceManager = new ResourceManager();
    FlowDocument doc = FlowDocument.LoadFromXml(stream, resourceManager);

    doc.Write(outputStream, resourceManager);
}
$vbLabelText   $csharpLabel

El resultado es el siguiente:

A Comparison of IronPDF with Apitron PDF SDK .NET - Figure 5: Apitron Documento PDF

Apitron Documento PDF

Si comparamos el resultado de IronPDF y Apitron, podemos ver claramente que IronPDF crea documentos impresionantes mediante renderizado HTML y sin siquiera escalar el tamaño de la imagen. Por otro lado, Apitron ofrece un resultado similar al de IronPDF, pero solo si el archivo XML tiene estilos registrados.

4. Añadir encabezados y pies de página a documentos PDF

4.1. Uso de IronPDF

Agregar encabezados y pies de página es sencillo con IronPDF. IronPDF le permite agregar números de página y saltos de página, adjuntar una portada, margen, etc.

El código para agregar encabezados y pies de página es el siguiente:

var Renderer = new ChromePdfRenderer();

// Add a header
Renderer.RenderingOptions.FirstPageNumber = 1; // Use 2 if a cover page will be appended
Renderer.RenderingOptions.TextHeader.DrawDividerLine = true;
Renderer.RenderingOptions.TextHeader.CenterText = "This is the header text";
Renderer.RenderingOptions.TextHeader.Font = IronPdf.Font.FontTypes.Helvetica;
Renderer.RenderingOptions.TextHeader.FontSize = 12;
Renderer.RenderingOptions.MarginTop = 25; // Create 25mm space for header

// Add a footer too
Renderer.RenderingOptions.TextFooter.DrawDividerLine = true;
Renderer.RenderingOptions.TextFooter.Font = IronPdf.Font.FontTypes.Arial;
Renderer.RenderingOptions.TextFooter.FontSize = 12;
Renderer.RenderingOptions.TextFooter.LeftText = "{date} {time}";
Renderer.RenderingOptions.TextFooter.RightText = "{page} of {total-pages}";
Renderer.RenderingOptions.MarginTop = 25; // Create 25mm space for footer

using var AdvancedPDF = Renderer.RenderHtmlAsPdf("<img src='logo.png'><h1>This is header and footer generated pdf file</h1>", @"C:\site\assets\");
AdvancedPDF.SaveAs("html-with-assets.pdf");
var Renderer = new ChromePdfRenderer();

// Add a header
Renderer.RenderingOptions.FirstPageNumber = 1; // Use 2 if a cover page will be appended
Renderer.RenderingOptions.TextHeader.DrawDividerLine = true;
Renderer.RenderingOptions.TextHeader.CenterText = "This is the header text";
Renderer.RenderingOptions.TextHeader.Font = IronPdf.Font.FontTypes.Helvetica;
Renderer.RenderingOptions.TextHeader.FontSize = 12;
Renderer.RenderingOptions.MarginTop = 25; // Create 25mm space for header

// Add a footer too
Renderer.RenderingOptions.TextFooter.DrawDividerLine = true;
Renderer.RenderingOptions.TextFooter.Font = IronPdf.Font.FontTypes.Arial;
Renderer.RenderingOptions.TextFooter.FontSize = 12;
Renderer.RenderingOptions.TextFooter.LeftText = "{date} {time}";
Renderer.RenderingOptions.TextFooter.RightText = "{page} of {total-pages}";
Renderer.RenderingOptions.MarginTop = 25; // Create 25mm space for footer

using var AdvancedPDF = Renderer.RenderHtmlAsPdf("<img src='logo.png'><h1>This is header and footer generated pdf file</h1>", @"C:\site\assets\");
AdvancedPDF.SaveAs("html-with-assets.pdf");
$vbLabelText   $csharpLabel

El resultado es el siguiente:

A Comparison of IronPDF with Apitron PDF SDK .NET - Figure 6: Encabezado y pie de página de IronPDF

Encabezado y pie de página de IronPDF

4.2. Uso de Apitron PDF Kit

Apitron PDF Kit crea PDFs convirtiendo contenido en un formato de estructura XML en un PDF. En Apitron PDF Kit, se pueden agregar encabezados y pies de página utilizando las propiedades PageHeader y PageFooter . El código para hacer esto es el siguiente:

// Register document resources first
ResourceManager resourceManager = new ResourceManager();
resourceManager.RegisterResource(new Apitron.PDF.Kit.FixedLayout.Resources.XObjects.Image("logo", "../../data/logo.png"));

// Create the document
FlowDocument doc = new FlowDocument() { Margin = new Thickness(10) };

// Register styles
doc.StyleManager.RegisterStyle(".pageHeader", new Style() { Font = new Font(StandardFonts.TimesBold, 20) });
doc.StyleManager.RegisterStyle(".pageFooter", new Style() { Align = Align.Right });
doc.StyleManager.RegisterStyle("hr", new Style() { Height = 2, Margin = new Thickness(0, 5, 0, 5) });
doc.StyleManager.RegisterStyle(".content", new Style() { Align = Align.Left, Display = Display.InlineBlock });

// Fill the header section
doc.PageHeader.Class = "pageHeader";
doc.PageHeader.Add(new Image("logo") { Width = 100, Height = 50 });
doc.PageHeader.Add(new TextBlock("This document is intended for internal use only") { TextIndent = 20 });
doc.PageHeader.Add(new Hr());

// Fill the footer section
doc.PageFooter.Class = "pageFooter";
doc.PageFooter.Add(new Hr());
doc.PageFooter.Add(new TextBlock((ctx) => string.Format("Page {0} from&nbsp;", ctx.CurrentPage + 1)));
doc.PageFooter.Add(new PageCount(3) { Display = Display.Inline });

// Add pages
for (int i = 0; i < 2; ++i)
{
    doc.Add(new TextBlock("This is header and footer generation pdf file.") { Class = "content" });
    doc.Add(new PageBreak());
}

// Generate PDF
using (Stream stream = File.Create("out.pdf"))
{
    doc.Write(stream, resourceManager);
}

Process.Start("out.pdf");
// Register document resources first
ResourceManager resourceManager = new ResourceManager();
resourceManager.RegisterResource(new Apitron.PDF.Kit.FixedLayout.Resources.XObjects.Image("logo", "../../data/logo.png"));

// Create the document
FlowDocument doc = new FlowDocument() { Margin = new Thickness(10) };

// Register styles
doc.StyleManager.RegisterStyle(".pageHeader", new Style() { Font = new Font(StandardFonts.TimesBold, 20) });
doc.StyleManager.RegisterStyle(".pageFooter", new Style() { Align = Align.Right });
doc.StyleManager.RegisterStyle("hr", new Style() { Height = 2, Margin = new Thickness(0, 5, 0, 5) });
doc.StyleManager.RegisterStyle(".content", new Style() { Align = Align.Left, Display = Display.InlineBlock });

// Fill the header section
doc.PageHeader.Class = "pageHeader";
doc.PageHeader.Add(new Image("logo") { Width = 100, Height = 50 });
doc.PageHeader.Add(new TextBlock("This document is intended for internal use only") { TextIndent = 20 });
doc.PageHeader.Add(new Hr());

// Fill the footer section
doc.PageFooter.Class = "pageFooter";
doc.PageFooter.Add(new Hr());
doc.PageFooter.Add(new TextBlock((ctx) => string.Format("Page {0} from&nbsp;", ctx.CurrentPage + 1)));
doc.PageFooter.Add(new PageCount(3) { Display = Display.Inline });

// Add pages
for (int i = 0; i < 2; ++i)
{
    doc.Add(new TextBlock("This is header and footer generation pdf file.") { Class = "content" });
    doc.Add(new PageBreak());
}

// Generate PDF
using (Stream stream = File.Create("out.pdf"))
{
    doc.Write(stream, resourceManager);
}

Process.Start("out.pdf");
$vbLabelText   $csharpLabel

El resultado es el siguiente:

A Comparison of IronPDF with Apitron PDF SDK .NET - Figure 7: Encabezado y pie de página de Apitron

Encabezado y pie de página de Apitron

5. Firma digitalmente PDF

5.1. Uso de IronPDF

Una de las características más importantes del procesamiento PDF es la capacidad de firmar un documento PDF digitalmente. IronPDF proporciona todas las herramientas necesarias para hacerlo.

using IronPdf;

// Cryptographically sign an existing PDF in 1 line of code!
new IronPdf.Signing.PdfSignature("Iron.p12", "123456").SignPdfFile("any.pdf");

/***** Advanced example for more control *****/

// 1. Create a PDF
var Renderer = new IronPdf.ChromePdfRenderer();
var doc = Renderer.RenderHtmlAsPdf("<h1>Testing 2048 bit digital security</h1>");

// 2. Create a Signature.
// You may create a .pfx or .p12 PDF signing certificate using Adobe Acrobat Reader.

var signature = new IronPdf.Signing.PdfSignature("Iron.pfx", "123456");

// 3. Handwritten signature graphic
signature.LoadSignatureImageFromFile("handwriting.png");

// 4. Sign the PDF with the PdfSignature. Multiple signing certificates may be used
doc.SignPdfWithDigitalSignature(signature);

// 5. The PDF is not signed until saved to file, stream or byte array.
doc.SaveAs("signed.pdf");
using IronPdf;

// Cryptographically sign an existing PDF in 1 line of code!
new IronPdf.Signing.PdfSignature("Iron.p12", "123456").SignPdfFile("any.pdf");

/***** Advanced example for more control *****/

// 1. Create a PDF
var Renderer = new IronPdf.ChromePdfRenderer();
var doc = Renderer.RenderHtmlAsPdf("<h1>Testing 2048 bit digital security</h1>");

// 2. Create a Signature.
// You may create a .pfx or .p12 PDF signing certificate using Adobe Acrobat Reader.

var signature = new IronPdf.Signing.PdfSignature("Iron.pfx", "123456");

// 3. Handwritten signature graphic
signature.LoadSignatureImageFromFile("handwriting.png");

// 4. Sign the PDF with the PdfSignature. Multiple signing certificates may be used
doc.SignPdfWithDigitalSignature(signature);

// 5. The PDF is not signed until saved to file, stream or byte array.
doc.SaveAs("signed.pdf");
$vbLabelText   $csharpLabel

5.2 Uso de Apitron PDF Kit

Mostrar una firma en un PDF usando Apitron PDF Kit es un proceso tanto largo como técnico.

static void Main(string[] args)
{
    string fileName = "signedTwice.pdf";

    using (Stream stream = File.Create(fileName))
    {
        FlowDocument doc = new FlowDocument() { Margin = new Thickness(10) };
        doc.Add(new TextBlock("Signed using Apitron PDF Kit for .NET"));
        doc.Write(stream, new ResourceManager());
    }

    // Save
    Sign(fileName, "../../data/certs/JohnDoe.pfx", "password", "../../data/images/signatureImage.png", new Boundary(10, 750, 110, 800));
}

// Implementation of Sign Method
private static void Sign(string pathToDocument, string pathToCertificate, string password, string pathToSignatureImage, Boundary signatureViewLocation)
{
    // Open existing document and sign once
    using (Stream inputStream = new FileStream(pathToDocument, FileMode.Open, FileAccess.ReadWrite))
    {
        using (FixedDocument doc = new FixedDocument(inputStream))
        {
            string imageResourceId = Guid.NewGuid().ToString("N");
            string signatureFieldId = Guid.NewGuid().ToString("N");

            // Register signature image resource
            doc.ResourceManager.RegisterResource(new Image(imageResourceId, pathToSignatureImage));

            // Create first signature field and initialize it using a stored certificate
            SignatureField signatureField = new SignatureField(signatureFieldId);
            using (Stream signatureDataStream = File.OpenRead(pathToCertificate))
            {
                signatureField.Signature = Signature.Create(new Pkcs12Store(signatureDataStream, password));
            }

            // Add signature fields to the document
doc.AcroForm.Fields.Add(signatureField);

            // Create first signature view using the image resource
            SignatureFieldView signatureView = new SignatureFieldView(signatureField, signatureViewLocation);
            signatureView.ViewSettings.Graphic = Graphic.Image;
            signatureView.ViewSettings.GraphicResourceID = imageResourceId;
            signatureView.ViewSettings.Description = Description.None;

            // Add views to page annotations collection
doc.Pages[0].Annotations.Add(signatureView);

            // Save as incremental update
doc.Save();
        }
    }
}
static void Main(string[] args)
{
    string fileName = "signedTwice.pdf";

    using (Stream stream = File.Create(fileName))
    {
        FlowDocument doc = new FlowDocument() { Margin = new Thickness(10) };
        doc.Add(new TextBlock("Signed using Apitron PDF Kit for .NET"));
        doc.Write(stream, new ResourceManager());
    }

    // Save
    Sign(fileName, "../../data/certs/JohnDoe.pfx", "password", "../../data/images/signatureImage.png", new Boundary(10, 750, 110, 800));
}

// Implementation of Sign Method
private static void Sign(string pathToDocument, string pathToCertificate, string password, string pathToSignatureImage, Boundary signatureViewLocation)
{
    // Open existing document and sign once
    using (Stream inputStream = new FileStream(pathToDocument, FileMode.Open, FileAccess.ReadWrite))
    {
        using (FixedDocument doc = new FixedDocument(inputStream))
        {
            string imageResourceId = Guid.NewGuid().ToString("N");
            string signatureFieldId = Guid.NewGuid().ToString("N");

            // Register signature image resource
            doc.ResourceManager.RegisterResource(new Image(imageResourceId, pathToSignatureImage));

            // Create first signature field and initialize it using a stored certificate
            SignatureField signatureField = new SignatureField(signatureFieldId);
            using (Stream signatureDataStream = File.OpenRead(pathToCertificate))
            {
                signatureField.Signature = Signature.Create(new Pkcs12Store(signatureDataStream, password));
            }

            // Add signature fields to the document
doc.AcroForm.Fields.Add(signatureField);

            // Create first signature view using the image resource
            SignatureFieldView signatureView = new SignatureFieldView(signatureField, signatureViewLocation);
            signatureView.ViewSettings.Graphic = Graphic.Image;
            signatureView.ViewSettings.GraphicResourceID = imageResourceId;
            signatureView.ViewSettings.Description = Description.None;

            // Add views to page annotations collection
doc.Pages[0].Annotations.Add(signatureView);

            // Save as incremental update
doc.Save();
        }
    }
}
$vbLabelText   $csharpLabel

El resultado es bastante similar para las bibliotecas. Puedes ver claramente que IronPDF es más fácil y conveniente para manipular contenido de PDF. El PDF de salida está firmado con el certificado y la firma impresa en el mismo.

Uso de Bootstrap 5 con IronPDF para galerías de carteras

El motor de renderizado Chrome V8 de IronPDF admite completamente los componentes modernos de Bootstrap 5, lo que permite generar documentos PDF visualmente impresionantes con galerías de portafolios profesionales. Este ejemplo demuestra diseños de cuadrícula, efectos de desplazamiento, superposiciones de gradientes y distintivos de categoría, características que serían desafiantes de implementar con bibliotecas PDF tradicionales como el SDK PDF de Apitron.

using IronPdf;

var renderer = new ChromePdfRenderer();

string portfolioGallery = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .gallery-item {
            position: relative;
            overflow: hidden;
            border-radius: 10px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.1);
        }
        .gallery-item img {
            width: 100%;
            height: 250px;
            object-fit: cover;
            transition: transform 0.3s;
        }
        .gallery-item:hover img {
            transform: scale(1.1);
        }
        .gallery-overlay {
            position: absolute;
            bottom: 0;
            left: 0;
            right: 0;
            background: linear-gradient(to top, rgba(0,0,0,0.8), transparent);
            padding: 20px;
            color: white;
        }
        .category-badge {
            position: absolute;
            top: 10px;
            right: 10px;
        }
        @media print {
            .gallery-item { page-break-inside: avoid; }
        }
    </style>
</head>
<body>
    <div class='container py-5'>
        <div class='text-center mb-5'>
            <h1 class='display-4'>Design Portfolio</h1>
            <p class='lead text-muted'>Showcase of PDF Document Designs</p>
        </div>

        <div class='row mb-4'>
            <div class='col-12'>
                <div class='btn-group' role='group'>
                    <button class='btn btn-primary'>All Projects</button>
                    <button class='btn btn-outline-primary'>Invoices</button>
                    <button class='btn btn-outline-primary'>Reports</button>
                    <button class='btn btn-outline-primary'>Forms</button>
                    <button class='btn btn-outline-primary'>Certificates</button>
                </div>
            </div>
        </div>

        <div class='row g-4'>
            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-primary category-badge'>Invoice</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📄</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Professional Invoice Template</h5>
                        <small>Corporate billing with itemized details</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-success category-badge'>Report</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📊</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Analytics Dashboard Report</h5>
                        <small>Data visualization and metrics</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-warning category-badge'>Certificate</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>🏆</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Award Certificate</h5>
                        <small>Professional achievement recognition</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-info category-badge'>Form</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #fa709a 0%, #fee140 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📝</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Application Form</h5>
                        <small>Multi-page data collection</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-danger category-badge'>Invoice</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #30cfd0 0%, #330867 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>💰</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Payment Receipt</h5>
                        <small>Transaction confirmation document</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-secondary category-badge'>Report</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📈</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Financial Statement</h5>
                        <small>Quarterly performance overview</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='text-center mt-5'>
            <p class='text-muted'>All templates rendered with IronPDF's Chromium engine</p>
            <div class='d-flex justify-content-center gap-2'>
                <span class='badge bg-primary'>Bootstrap 5</span>
                <span class='badge bg-success'>Responsive</span>
                <span class='badge bg-info'>Print-Ready</span>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(portfolioGallery);
pdf.SaveAs("portfolio-gallery.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

string portfolioGallery = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .gallery-item {
            position: relative;
            overflow: hidden;
            border-radius: 10px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.1);
        }
        .gallery-item img {
            width: 100%;
            height: 250px;
            object-fit: cover;
            transition: transform 0.3s;
        }
        .gallery-item:hover img {
            transform: scale(1.1);
        }
        .gallery-overlay {
            position: absolute;
            bottom: 0;
            left: 0;
            right: 0;
            background: linear-gradient(to top, rgba(0,0,0,0.8), transparent);
            padding: 20px;
            color: white;
        }
        .category-badge {
            position: absolute;
            top: 10px;
            right: 10px;
        }
        @media print {
            .gallery-item { page-break-inside: avoid; }
        }
    </style>
</head>
<body>
    <div class='container py-5'>
        <div class='text-center mb-5'>
            <h1 class='display-4'>Design Portfolio</h1>
            <p class='lead text-muted'>Showcase of PDF Document Designs</p>
        </div>

        <div class='row mb-4'>
            <div class='col-12'>
                <div class='btn-group' role='group'>
                    <button class='btn btn-primary'>All Projects</button>
                    <button class='btn btn-outline-primary'>Invoices</button>
                    <button class='btn btn-outline-primary'>Reports</button>
                    <button class='btn btn-outline-primary'>Forms</button>
                    <button class='btn btn-outline-primary'>Certificates</button>
                </div>
            </div>
        </div>

        <div class='row g-4'>
            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-primary category-badge'>Invoice</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📄</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Professional Invoice Template</h5>
                        <small>Corporate billing with itemized details</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-success category-badge'>Report</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📊</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Analytics Dashboard Report</h5>
                        <small>Data visualization and metrics</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-warning category-badge'>Certificate</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>🏆</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Award Certificate</h5>
                        <small>Professional achievement recognition</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-info category-badge'>Form</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #fa709a 0%, #fee140 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📝</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Application Form</h5>
                        <small>Multi-page data collection</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-danger category-badge'>Invoice</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #30cfd0 0%, #330867 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>💰</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Payment Receipt</h5>
                        <small>Transaction confirmation document</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-secondary category-badge'>Report</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📈</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Financial Statement</h5>
                        <small>Quarterly performance overview</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='text-center mt-5'>
            <p class='text-muted'>All templates rendered with IronPDF's Chromium engine</p>
            <div class='d-flex justify-content-center gap-2'>
                <span class='badge bg-primary'>Bootstrap 5</span>
                <span class='badge bg-success'>Responsive</span>
                <span class='badge bg-info'>Print-Ready</span>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(portfolioGallery);
pdf.SaveAs("portfolio-gallery.pdf");
$vbLabelText   $csharpLabel

Este código genera un portafolio PDF profesional con un diseño de cuadrícula receptiva, distintivos visuales de categoría, superposiciones de gradientes y efectos de desplazamiento. El motor de renderizado de Chrome conserva todos los estilos de Bootstrap, los diseños de CSS Grid y las propiedades CSS personalizadas, capacidades que las bibliotecas PDF tradicionales luchan por replicar.

Ventajas Clave vs Apitron PDF SDK:

  • Soporte nativo de Bootstrap 5 sin conversión
  • Los diseños de CSS Grid y Flexbox se renderizan perfectamente
  • Fondos de gradiente y efectos modernos de CSS
  • Código más simple con una salida de mayor calidad

Para una guía completa sobre generación de PDF con Bootstrap, consulta Guía de HTML a PDF Bootstrap.

6. Precios y licencias

Precios y licencias de IronPDF

IronPDF es una biblioteca de C# que es gratuita para usar en desarrollo y se puede licenciar para uso comercial en cualquier momento. Las licencias de proyecto para desarrolladores individuales, agencias y organizaciones multinacionales, así como para redistribución SaaS y OEM, están todas accesibles. Todas las licencias ofrecen una garantía de devolución de dinero de 30 días, un año de soporte y actualizaciones, validez para desarrollo/producción/escenarios y una licencia perpetua (compra única).

El paquete Lite está disponible por $799 sin gastos recurrentes. Más detalles y asistencia para elegir la mejor licencia están disponibles en la página de licencias del producto IronPDF.

A Comparison of IronPDF with Apitron PDF SDK .NET - Figure 8: Licencias de IronPDF

Licencias de IronPDF

Precios y licencias del kit PDF de Apitron

Actualmente hay dos esquemas de licencias en uso: Moderno y Legacy. Si ya tienes una licencia, entonces el esquema de licencia legacy permanece activo para ti hasta que tu licencia expire. Después, debes contactar al soporte técnico para la transición. El esquema de licencias moderno se aplica a ti solo si eres un nuevo cliente.

Bajo el esquema moderno, hay tres niveles de licencias:

    • Evaluación - tres meses para usar un producto funcional. Descarga desde NuGet y comienza a desarrollar. 12. - Comunidad - Usa productos funcionales sin tarifas en proyectos no comerciales, con aprobación.
    • Comercial - cualquier caso de uso no descrito anteriormente. El precio depende del patrón de uso. 13. Se requiere aprobación.
    • Comercial - cualquier caso de uso no descrito anteriormente. 15. Apitron permite crear PDFs usando una API de diseño fijo, 100% compatible con PDF.

Conclusión

Como método impulsado por estilos similar a HTML y CSS, esta API de diseño fijo permite crear informes, facturas, catálogos y más en minutos. También admite la creación de plantillas XML.

Los precios de licencia para Apitron PDF no están disponibles en su sitio web. Tienes que contactar al soporte y obtener una cotización basada en tu uso. Por otro lado, IronPDF tiene un paquete de licencias muy claro mostrado en su sitio web. Esto hace que IronPDF se destaque sobre sus competidores y permita a los usuarios elegir sabiamente según sus necesidades. IronPDF permite trabajar con PDF más fácilmente que Apitron PDF.

IronPDF permite a sus usuarios escribir menos líneas de código para tareas PDF desafiantes. IronPDF proporciona múltiples métodos para producir PDFs desde múltiples tipos de archivos, mientras que Apitron solo puede convertir documentos XML a documentos PDF.

Se logra una salida perfecta sin agregar opciones técnicas en IronPDF en comparación con Apitron. IronPDF reduce la cantidad de código necesario para trabajos PDF complejos. Prueba la prueba gratuita de 30 días de IronPDF para probar su funcionalidad completa. Compra la suite completa de productos de Iron Software en Iron Software.com.

Por favor notaApitron PDF Kit es una marca registrada de su propietario respectivo. Prueba la prueba gratuita de 30 días de IronPDF para probar su funcionalidad completa. Adquiere el paquete completo de productos de Iron Software en Iron Software.com.

[{i:(Apitron PDF Kit es una marca registrada de su respectivo propietario. Este sitio no está afiliado, aprobado ni patrocinado por Apitron PDF Kit. Todos los nombres de producto, logotipos y marcas son propiedad de sus respectivos dueños. Las comparaciones son sólo para fines informativos y reflejan información disponible públicamente al momento de escribir.

Preguntas Frecuentes

¿Cómo puedes convertir HTML a PDF en C#?

Puedes usar el método RenderHtmlAsPdf de IronPDF para convertir cadenas de HTML en PDFs. También puedes convertir archivos HTML a PDFs usando RenderHtmlFileAsPdf.

¿Qué características ofrece IronPDF para la creación de PDF?

IronPDF admite la creación de PDF desde HTML, CSS y JavaScript, carga de URL, extracción de texto y gráficos, fusión de PDF y más. Es compatible con .NET Core, Azure, AWS, Docker, Linux y Windows.

¿Cómo puedes firmar digitalmente un PDF en C#?

Con IronPDF, puedes firmar PDFs digitalmente usando un certificado de firma PDF, el cual puede integrarse con unas pocas líneas de código.

¿Cuáles son las opciones de instalación para IronPDF?

IronPDF puede instalarse usando el Administrador de Paquetes NuGet, el Símbolo del sistema para desarrolladores, o descargando directamente el paquete NuGet o la biblioteca IronPDF .DLL.

¿Hay una versión gratuita disponible para IronPDF?

Sí, IronPDF ofrece una versión de desarrollo gratuita junto con licencias comerciales. La información detallada de precios, incluyendo una garantía de devolución de dinero de 30 días, está disponible en su sitio web.

¿Cómo maneja Apitron PDF Kit la conversión de HTML a PDF?

Apitron PDF Kit no soporta la conversión directa de HTML a PDF, pero puede convertir archivos XML a PDF.

¿Cuáles son las características destacadas de Apitron PDF Kit?

Apitron PDF Kit permite una manipulación integral de PDF, incluyendo agregar imágenes, dibujos, textos, firmar documentos y fusionar o dividir PDFs. Sin embargo, carece de conversión directa de HTML a PDF.

¿Cómo puedes agregar encabezados y pies de página a un PDF en C#?

IronPDF te permite agregar encabezados y pies de página a PDFs fácilmente usando métodos como AddTextHeader y AddTextFooter.

¿Qué opciones de licencia están disponibles para Apitron PDF Kit?

Apitron PDF Kit ofrece un período de evaluación de tres meses y una licencia comunitaria para proyectos no comerciales. Para uso comercial, necesitas contactarles directamente para cotizaciones.

¿Cuál es la biblioteca PDF más fácil de usar para el desarrollo en .NET?

IronPDF es generalmente más fácil de usar para el desarrollo en .NET, proporcionando una API más simple y requiriendo menos líneas de código para tareas complejas en comparación con Apitron PDF Kit.

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