Saltar al pie de página
COMPARACIONES DE PRODUCTOS
Una comparación de HTML a PDF en IronPDF vs iText7

Una Comparación entre IronPDF e iText7

Una herramienta decente y simple para manipular PDF puede agilizar muchas tareas y procesos involucrados en la creación y edición de documentos PDF. En el ecosistema .NET, hay dos bibliotecas populares – IronPDF y iText – que permiten la generación de PDF sin ninguna dependencia de Adobe. Ambas ofrecen una variedad de características como crear, editar, convertir, etc., pero este artículo se centrará en comparar estas bibliotecas basándose en tres criterios: las características que ofrecen, la calidad de la documentación proporcionada por ellas y las políticas de precios adoptadas por estas empresas para el uso de sus productos.

Descripción general de IronPDF y iText

IronPDF es una destacada biblioteca de PDF para .NET que permite a los programadores crear, modificar e interactuar fácilmente con documentos PDF. Se puede usar en diferentes entornos .NET, incluidos Core, 8, 7, 6 y Framework, lo que lo hace altamente flexible para varios requisitos de desarrollo. La característica clave de IronPDF es su amplio conjunto de funciones, como la conversión de HTML a PDF, la capacidad de fusionar PDF, el cifrado de PDF y la aplicación de firmas digitales, entre otras. La documentación está escrita de manera que los usuarios puedan entender sin dificultades, mientras que la biblioteca en sí tiene un fuerte soporte técnico.

iText es una de las bibliotecas de PDF más populares disponibles para Java, así como para .NET (C#). iText Core 8 ofrece una solución programable a nivel empresarial para crear y manipular archivos PDF. iText proporciona soporte para muchas funciones diferentes y se publica bajo ambas licencias de código abierto (AGPL) y licencias comerciales. Esto significa que puede cubrir una amplia gama de casos de uso durante los proyectos de transformación digital gracias a su versatilidad.

Compatibilidad Multiplataforma

IronPDF e iText son compatibles con varias plataformas; pueden procesar PDF en muchos sistemas diferentes y dentro del framework .NET. A continuación, compararemos los frameworks y plataformas compatibles para cada producto.

IronPDF:

Descripción general de las plataformas compatibles con IronPDF admite una amplia gama de plataformas y entornos, asegurando una integración e implementación sin problemas en varios sistemas:

  • Versiónes .NET:

    • .NET Core (8, 7, 6, 5, y 3.1+)
    • .NET Standard (2.0+)
    • .NET Framework (4.6.2+)
  • Entornos de aplicación: IronPDF funciona en entornos de aplicación que incluyen Windows, Linux, Mac, Docker, Azure y AWS.

  • IDEs: Funciona con IDEs como Microsoft Visual Studio, JetBrains Rider y ReSharper.

  • Sistemas Operativos y Procesadores: Soporta varios sistemas operativos y procesadores, incluidos Windows, Mac, Linux, x64, x86, ARM.

iText

  • Versiones de .NET:

    • .NET Core (2.x, 3.x)
    • .NET Framework (4.6.1+)
    • .NET 5+
  • Entornos de aplicación: iText admite una gama de entornos de aplicación, gracias a su soporte tanto para Java como para .NET (C#), incluidos Windows, Mac, Linux y Docker.

  • Sistema Operativo: Funciona en sistemas operativos Windows, macOS y Linux.

Comparación de características clave: IronPDF vs. iText

Lista de características clave de IronPDF e iText ofrecen una gama de características y herramientas para trabajar con archivos PDF. El enfoque de esta siguiente sección será examinar algunas de estas características más de cerca y ver cómo se comparan las dos bibliotecas en cuanto a llevar a cabo diferentes tareas relacionadas con PDF.

IronPDF

  • Conversión de HTML a PDF: Soporta HTML, CSS, JavaScript e imágenes.

  • Manipulación de archivos PDF: Dividir y fusionar documentos, cambiar el formato y editar documentos PDF existentes.

  • Seguridad: Cifrado y descifrado de PDF.

  • Edición: Agregar anotaciones, marcadores e índices.

  • Plantillas: Aplicar encabezados, pies de página y números de página.

  • Marcas de agua: Aplicar fácilmente marcas de agua de texto e imagen a archivos PDF; toma el control completo usando HTML/CSS.

  • Estampado de PDF: Estampe imágenes y texto en sus documentos PDF utilizando IronPDF.

Para obtener más información sobre el conjunto extenso de características que IronPDF tiene para ofrecer, visite la página de características de IronPDF.

iText

  • Creación de PDF: Soporta la creación de documentos PDF desde cero.

  • Formularios: Crear y editar formularios PDF.

  • Firmas digitales: Firmar documentos PDF.

  • Compresión: Optimizar tamaños de archivos PDF.

  • Extracción de contenido: Extraer texto e imágenes de archivos PDF.

  • Código abierto: Disponible bajo licencia AGPL.

  • Personalización: Alto nivel de personalización para casos de uso avanzado.

Comparación de características de funcionalidad de PDF entre IronPDF vs. iText

Conversión de HTML a PDF

Convertir contenido HTML en PDF usando IronPDF es una tarea que se realiza en muchas oficinas y espacios de trabajo diferentes. A continuación, se presentan ejemplos de código que comparan cómo IronPDF e iText abordan este proceso.

IronPDF

using IronPdf;

// Configure security settings
Installation.EnableWebSecurity = true;

// Instantiate Renderer
var renderer = new ChromePdfRenderer();

// Create a PDF from an HTML string using C#
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf.SaveAs("output.pdf");

// Advanced Example with HTML Assets
// Load external HTML assets: images, CSS and JavaScript.
var myAdvancedPdf = renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>", @"C:\site\assets\");
myAdvancedPdf.SaveAs("html-with-assets.pdf");
using IronPdf;

// Configure security settings
Installation.EnableWebSecurity = true;

// Instantiate Renderer
var renderer = new ChromePdfRenderer();

// Create a PDF from an HTML string using C#
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf.SaveAs("output.pdf");

// Advanced Example with HTML Assets
// Load external HTML assets: images, CSS and JavaScript.
var myAdvancedPdf = renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>", @"C:\site\assets\");
myAdvancedPdf.SaveAs("html-with-assets.pdf");
Imports IronPdf

' Configure security settings
Installation.EnableWebSecurity = True

' Instantiate Renderer
Dim renderer = New ChromePdfRenderer()

' Create a PDF from an HTML string using C#
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>")
pdf.SaveAs("output.pdf")

' Advanced Example with HTML Assets
' Load external HTML assets: images, CSS and JavaScript.
Dim myAdvancedPdf = renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>", "C:\site\assets\")
myAdvancedPdf.SaveAs("html-with-assets.pdf")
$vbLabelText   $csharpLabel

iText

using iText.Html2pdf;

static void Main(string[] args)
{
    using (FileStream htmlSource = File.Open("input.html", FileMode.Open))
    using (FileStream pdfDest = File.Open("output.pdf", FileMode.Create))
    {
        ConverterProperties converterProperties = new ConverterProperties();
        HtmlConverter.ConvertToPdf(htmlSource, pdfDest, converterProperties);
    }
}
using iText.Html2pdf;

static void Main(string[] args)
{
    using (FileStream htmlSource = File.Open("input.html", FileMode.Open))
    using (FileStream pdfDest = File.Open("output.pdf", FileMode.Create))
    {
        ConverterProperties converterProperties = new ConverterProperties();
        HtmlConverter.ConvertToPdf(htmlSource, pdfDest, converterProperties);
    }
}
Imports iText.Html2pdf

Shared Sub Main(ByVal args() As String)
	Using htmlSource As FileStream = File.Open("input.html", FileMode.Open)
	Using pdfDest As FileStream = File.Open("output.pdf", FileMode.Create)
		Dim converterProperties As New ConverterProperties()
		HtmlConverter.ConvertToPdf(htmlSource, pdfDest, converterProperties)
	End Using
	End Using
End Sub
$vbLabelText   $csharpLabel

Al convertir HTML a PDF, IronPDF proporciona una herramienta concisa y conveniente para esta tarea. Utilizando el ChromePdfRenderer para convertir contenido HTML en PDF, IronPDF se destaca en proporcionar a los usuarios documentos PDF perfectos pixel a pixel. Los usuarios pueden crear PDF directamente desde cadenas HTML o incluir recursos externos como imágenes con un camino base opcional, como se demuestra en el ejemplo avanzado. iText, por otro lado, adopta un enfoque básico utilizando su clase HtmlConverter para crear documentos PDF a partir de un archivo HTML.

Encriptación de Archivos PDF

Cifrar archivos PDF con IronPDF y la des-cifrado son vitales en muchos lugares de trabajo. A continuación, veremos cómo iText e IronPDF abordan el cifrado de PDF.

IronPDF

using IronPdf;
using System;

// Open an Encrypted File, alternatively create a new PDF from HTML
var pdf = PdfDocument.FromFile("encrypted.pdf", "password");

// Edit file metadata
pdf.MetaData.Author = "Satoshi Nakamoto";
pdf.MetaData.Keywords = "SEO, Friendly";
pdf.MetaData.ModifiedDate = DateTime.Now;

// Edit file security settings
pdf.SecuritySettings.RemovePasswordsAndEncryption();
pdf.SecuritySettings.MakePdfDocumentReadOnly("secret-key");
pdf.SecuritySettings.AllowUserAnnotations = false;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserFormData = false;
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;

// Change or set the document encryption password
pdf.Password = "my-password";
pdf.SaveAs("secured.pdf");
using IronPdf;
using System;

// Open an Encrypted File, alternatively create a new PDF from HTML
var pdf = PdfDocument.FromFile("encrypted.pdf", "password");

// Edit file metadata
pdf.MetaData.Author = "Satoshi Nakamoto";
pdf.MetaData.Keywords = "SEO, Friendly";
pdf.MetaData.ModifiedDate = DateTime.Now;

// Edit file security settings
pdf.SecuritySettings.RemovePasswordsAndEncryption();
pdf.SecuritySettings.MakePdfDocumentReadOnly("secret-key");
pdf.SecuritySettings.AllowUserAnnotations = false;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserFormData = false;
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;

// Change or set the document encryption password
pdf.Password = "my-password";
pdf.SaveAs("secured.pdf");
Imports IronPdf
Imports System

' Open an Encrypted File, alternatively create a new PDF from HTML
Private pdf = PdfDocument.FromFile("encrypted.pdf", "password")

' Edit file metadata
pdf.MetaData.Author = "Satoshi Nakamoto"
pdf.MetaData.Keywords = "SEO, Friendly"
pdf.MetaData.ModifiedDate = DateTime.Now

' Edit file security settings
pdf.SecuritySettings.RemovePasswordsAndEncryption()
pdf.SecuritySettings.MakePdfDocumentReadOnly("secret-key")
pdf.SecuritySettings.AllowUserAnnotations = False
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserFormData = False
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights

' Change or set the document encryption password
pdf.Password = "my-password"
pdf.SaveAs("secured.pdf")
$vbLabelText   $csharpLabel

iText

using System;
using System.IO;
using System.Text;
using iText.Kernel.Pdf;

public class EncryptPdf
{
    public static readonly String DEST = "results/sandbox/security/encrypt_pdf.pdf";
    public static readonly String SRC = "../../../resources/pdfs/hello.pdf";

    public static readonly String OWNER_PASSWORD = "World";
    public static readonly String USER_PASSWORD = "Hello";

    public static void Main(String[] args)
    {
        FileInfo file = new FileInfo(DEST);
        file.Directory.Create();

        new EncryptPdf().ManipulatePdf(DEST);
    }

    protected void ManipulatePdf(String dest)
    {
        PdfDocument document = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest,
            new WriterProperties().SetStandardEncryption(
                Encoding.UTF8.GetBytes(USER_PASSWORD),
                Encoding.UTF8.GetBytes(OWNER_PASSWORD),
                EncryptionConstants.ALLOW_PRINTING,
                EncryptionConstants.ENCRYPTION_AES_128 | EncryptionConstants.DO_NOT_ENCRYPT_METADATA
            )));
        document.Close();
    }
}
using System;
using System.IO;
using System.Text;
using iText.Kernel.Pdf;

public class EncryptPdf
{
    public static readonly String DEST = "results/sandbox/security/encrypt_pdf.pdf";
    public static readonly String SRC = "../../../resources/pdfs/hello.pdf";

    public static readonly String OWNER_PASSWORD = "World";
    public static readonly String USER_PASSWORD = "Hello";

    public static void Main(String[] args)
    {
        FileInfo file = new FileInfo(DEST);
        file.Directory.Create();

        new EncryptPdf().ManipulatePdf(DEST);
    }

    protected void ManipulatePdf(String dest)
    {
        PdfDocument document = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest,
            new WriterProperties().SetStandardEncryption(
                Encoding.UTF8.GetBytes(USER_PASSWORD),
                Encoding.UTF8.GetBytes(OWNER_PASSWORD),
                EncryptionConstants.ALLOW_PRINTING,
                EncryptionConstants.ENCRYPTION_AES_128 | EncryptionConstants.DO_NOT_ENCRYPT_METADATA
            )));
        document.Close();
    }
}
Imports System
Imports System.IO
Imports System.Text
Imports iText.Kernel.Pdf

Public Class EncryptPdf
	Public Shared ReadOnly DEST As String = "results/sandbox/security/encrypt_pdf.pdf"
	Public Shared ReadOnly SRC As String = "../../../resources/pdfs/hello.pdf"

	Public Shared ReadOnly OWNER_PASSWORD As String = "World"
	Public Shared ReadOnly USER_PASSWORD As String = "Hello"

	Public Shared Sub Main(ByVal args() As String)
		Dim file As New FileInfo(DEST)
		file.Directory.Create()

		Call (New EncryptPdf()).ManipulatePdf(DEST)
	End Sub

	Protected Sub ManipulatePdf(ByVal dest As String)
		Dim document As New PdfDocument(New PdfReader(SRC), New PdfWriter(dest, (New WriterProperties()).SetStandardEncryption(Encoding.UTF8.GetBytes(USER_PASSWORD), Encoding.UTF8.GetBytes(OWNER_PASSWORD), EncryptionConstants.ALLOW_PRINTING, EncryptionConstants.ENCRYPTION_AES_128 Or EncryptionConstants.DO_NOT_ENCRYPT_METADATA)))
		document.Close()
	End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF ofrece a los usuarios una forma sencilla de cifrar archivos PDF, otorgando además mucho control, como editar metadatos y ajustar configuraciones de seguridad, como hacer que los documentos sean de solo lectura o restringir acciones del usuario, como copiar y pegar. Por otro lado, iText emplea un método de nivel más bajo y más largo, donde el cifrado de PDF se aplica durante la creación del documento, especificando contraseñas de propietario y usuario junto con permisos como derechos de impresión utilizando estándares de cifrado como AES-128.

Redactar contenido de PDF

Ocasionalmente, al manejar información confidencial o privada, puede ser necesario redactar texto en PDF con IronPDF partes de un archivo PDF. Los ejemplos de código a continuación demostrarán cómo puede redactar texto usando IronPDF en comparación con iText.

IronPDF

using IronPdf;

PdfDocument pdf = PdfDocument.FromFile("novel.pdf");

// Redact 'are' phrase from all pages
pdf.RedactTextOnAllPages("are");

pdf.SaveAs("redacted.pdf");
using IronPdf;

PdfDocument pdf = PdfDocument.FromFile("novel.pdf");

// Redact 'are' phrase from all pages
pdf.RedactTextOnAllPages("are");

pdf.SaveAs("redacted.pdf");
Imports IronPdf

Private pdf As PdfDocument = PdfDocument.FromFile("novel.pdf")

' Redact 'are' phrase from all pages
pdf.RedactTextOnAllPages("are")

pdf.SaveAs("redacted.pdf")
$vbLabelText   $csharpLabel

iText

using System;
using System.IO;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;
using iText.Kernel.Colors;

string src = "input.pdf";
string dest = "output_redacted.pdf";

using (PdfReader reader = new PdfReader(src))
using (PdfWriter writer = new PdfWriter(dest))
using (PdfDocument pdfDoc = new PdfDocument(reader, writer))
{
    // Iterate through each page
    for (int pageNum = 1; pageNum <= pdfDoc.GetNumberOfPages(); pageNum++)
    {
        PdfPage page = pdfDoc.GetPage(pageNum);
        PdfCanvas canvas = new PdfCanvas(page);
        Rectangle[] rectanglesToRedact = { new Rectangle(100, 100, 200, 50) }; // Define rectangles to redact

        // Overlay black rectangles to simulate redaction
        foreach (Rectangle rect in rectanglesToRedact)
        {
            canvas.SetFillColor(ColorConstants.BLACK)
                .Rectangle(rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight())
                .Fill();
        }
    }
}
using System;
using System.IO;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;
using iText.Kernel.Colors;

string src = "input.pdf";
string dest = "output_redacted.pdf";

using (PdfReader reader = new PdfReader(src))
using (PdfWriter writer = new PdfWriter(dest))
using (PdfDocument pdfDoc = new PdfDocument(reader, writer))
{
    // Iterate through each page
    for (int pageNum = 1; pageNum <= pdfDoc.GetNumberOfPages(); pageNum++)
    {
        PdfPage page = pdfDoc.GetPage(pageNum);
        PdfCanvas canvas = new PdfCanvas(page);
        Rectangle[] rectanglesToRedact = { new Rectangle(100, 100, 200, 50) }; // Define rectangles to redact

        // Overlay black rectangles to simulate redaction
        foreach (Rectangle rect in rectanglesToRedact)
        {
            canvas.SetFillColor(ColorConstants.BLACK)
                .Rectangle(rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight())
                .Fill();
        }
    }
}
Imports System
Imports System.IO
Imports iText.Kernel.Pdf
Imports iText.Layout
Imports iText.Layout.Element
Imports iText.Layout.Properties
Imports iText.Kernel.Colors

Private src As String = "input.pdf"
Private dest As String = "output_redacted.pdf"

Using reader As New PdfReader(src)
Using writer As New PdfWriter(dest)
Using pdfDoc As New PdfDocument(reader, writer)
	' Iterate through each page
	Dim pageNum As Integer = 1
	Do While pageNum <= pdfDoc.GetNumberOfPages()
		Dim page As PdfPage = pdfDoc.GetPage(pageNum)
		Dim canvas As New PdfCanvas(page)
		Dim rectanglesToRedact() As Rectangle = { New Rectangle(100, 100, 200, 50) } ' Define rectangles to redact

		' Overlay black rectangles to simulate redaction
		For Each rect As Rectangle In rectanglesToRedact
			canvas.SetFillColor(ColorConstants.BLACK).Rectangle(rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight()).Fill()
		Next rect
		pageNum += 1
	Loop
End Using
End Using
End Using
$vbLabelText   $csharpLabel

La herramienta de redacción de IronPDF es concisa y fácil de usar, necesitando solo unas pocas líneas de código para agilizar el proceso de redacción. Esto ayuda a aumentar la eficiencia en torno a las tareas de redacción de PDF y proporciona a los usuarios una forma fácil de mantener su información sensible y privada segura. iText, por otro lado, no ofrece una herramienta de redacción incorporada en el mismo sentido que IronPDF. Sin embargo, todavía puede cubrir datos sensibles utilizando el método que se muestra arriba para sobrescribir el contenido que los usuarios desean redactar. Esto puede llevar a problemas potenciales, ya que estos rectángulos no eliminan o redactan propiamente el texto, lo que significa que otras personas podrían potencialmente copiar y pegar los datos que están siendo redactados.

Firmar documentos PDF

Poder firmar digitalmente documentos PDF con IronPDF puede ahorrar tiempo, especialmente al hacer de ello un proceso automatizado. Aquí hay algunos fragmentos de código comparando cómo IronPDF difiere de iText en términos de llevar a cabo el firmado digital de documentos.

IronPDF

using IronPdf;
using IronPdf.Signing;
using System.Security.Cryptography.X509Certificates;

// Create X509Certificate2 object with X509KeyStorageFlags set to Exportable
X509Certificate2 cert = new X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable);

// Create PdfSignature object
var sig = new PdfSignature(cert);

// Sign PDF document
PdfDocument pdf = PdfDocument.FromFile("document.pdf");
pdf.Sign(sig);
pdf.SaveAs("signed.pdf");
using IronPdf;
using IronPdf.Signing;
using System.Security.Cryptography.X509Certificates;

// Create X509Certificate2 object with X509KeyStorageFlags set to Exportable
X509Certificate2 cert = new X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable);

// Create PdfSignature object
var sig = new PdfSignature(cert);

// Sign PDF document
PdfDocument pdf = PdfDocument.FromFile("document.pdf");
pdf.Sign(sig);
pdf.SaveAs("signed.pdf");
Imports IronPdf
Imports IronPdf.Signing
Imports System.Security.Cryptography.X509Certificates

' Create X509Certificate2 object with X509KeyStorageFlags set to Exportable
Private cert As New X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable)

' Create PdfSignature object
Private sig = New PdfSignature(cert)

' Sign PDF document
Private pdf As PdfDocument = PdfDocument.FromFile("document.pdf")
pdf.Sign(sig)
pdf.SaveAs("signed.pdf")
$vbLabelText   $csharpLabel

iText

using System;
using System.IO;
using iText.Kernel.Pdf;
using iText.Signatures;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.X509;

class Program
{
    static void Main(string[] args)
    {
        string src = "input.pdf";
        string dest = "output_signed.pdf";
        string pfxFile = "your_certificate.pfx";
        string pfxPassword = "your_password";

        try
        {
            // Load your certificate
            Pkcs12Store ks = new Pkcs12Store(new FileStream(pfxFile, FileMode.Open), pfxPassword.ToCharArray());
            string alias = null;
            foreach (string al in ks.Aliases)
            {
                if (ks.IsKeyEntry(al))
                {
                    alias = al;
                    break;
                }
            }
            ICipherParameters pk = ks.GetKey(alias).Key;
            X509CertificateEntry[] chain = ks.GetCertificateChain(alias);
            X509Certificate2 cert = new X509Certificate2(chain[0].Certificate.GetEncoded());

            // Create output PDF with signed content
            using (PdfReader reader = new PdfReader(src))
            using (PdfWriter writer = new PdfWriter(dest))
            using (PdfDocument pdfDoc = new PdfDocument(reader, writer))
            {
                // Create the signer
                PdfSigner signer = new PdfSigner(pdfDoc, writer, new StampingProperties().UseAppendMode());

                // Configure signature appearance
                PdfSignatureAppearance appearance = signer.GetSignatureAppearance();
                appearance.SetReason("Digital Signature");
                appearance.SetLocation("Your Location");
                appearance.SetContact("Your Contact");

                // Create signature
                IExternalSignature pks = new PrivateKeySignature(pk, "SHA-256");
                signer.SignDetached(pks, chain, null, null, null, 0, PdfSigner.CryptoStandard.CMS);
            }

            Console.WriteLine($"PDF digitally signed successfully: {dest}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error signing PDF: {ex.Message}");
        }
    }
}
using System;
using System.IO;
using iText.Kernel.Pdf;
using iText.Signatures;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.X509;

class Program
{
    static void Main(string[] args)
    {
        string src = "input.pdf";
        string dest = "output_signed.pdf";
        string pfxFile = "your_certificate.pfx";
        string pfxPassword = "your_password";

        try
        {
            // Load your certificate
            Pkcs12Store ks = new Pkcs12Store(new FileStream(pfxFile, FileMode.Open), pfxPassword.ToCharArray());
            string alias = null;
            foreach (string al in ks.Aliases)
            {
                if (ks.IsKeyEntry(al))
                {
                    alias = al;
                    break;
                }
            }
            ICipherParameters pk = ks.GetKey(alias).Key;
            X509CertificateEntry[] chain = ks.GetCertificateChain(alias);
            X509Certificate2 cert = new X509Certificate2(chain[0].Certificate.GetEncoded());

            // Create output PDF with signed content
            using (PdfReader reader = new PdfReader(src))
            using (PdfWriter writer = new PdfWriter(dest))
            using (PdfDocument pdfDoc = new PdfDocument(reader, writer))
            {
                // Create the signer
                PdfSigner signer = new PdfSigner(pdfDoc, writer, new StampingProperties().UseAppendMode());

                // Configure signature appearance
                PdfSignatureAppearance appearance = signer.GetSignatureAppearance();
                appearance.SetReason("Digital Signature");
                appearance.SetLocation("Your Location");
                appearance.SetContact("Your Contact");

                // Create signature
                IExternalSignature pks = new PrivateKeySignature(pk, "SHA-256");
                signer.SignDetached(pks, chain, null, null, null, 0, PdfSigner.CryptoStandard.CMS);
            }

            Console.WriteLine($"PDF digitally signed successfully: {dest}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error signing PDF: {ex.Message}");
        }
    }
}
Imports System
Imports System.IO
Imports iText.Kernel.Pdf
Imports iText.Signatures
Imports Org.BouncyCastle.Crypto
Imports Org.BouncyCastle.Pkcs
Imports Org.BouncyCastle.X509

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim src As String = "input.pdf"
		Dim dest As String = "output_signed.pdf"
		Dim pfxFile As String = "your_certificate.pfx"
		Dim pfxPassword As String = "your_password"

		Try
			' Load your certificate
			Dim ks As New Pkcs12Store(New FileStream(pfxFile, FileMode.Open), pfxPassword.ToCharArray())
			Dim [alias] As String = Nothing
			For Each al As String In ks.Aliases
				If ks.IsKeyEntry(al) Then
					[alias] = al
					Exit For
				End If
			Next al
			Dim pk As ICipherParameters = ks.GetKey([alias]).Key
			Dim chain() As X509CertificateEntry = ks.GetCertificateChain([alias])
			Dim cert As New X509Certificate2(chain(0).Certificate.GetEncoded())

			' Create output PDF with signed content
			Using reader As New PdfReader(src)
			Using writer As New PdfWriter(dest)
			Using pdfDoc As New PdfDocument(reader, writer)
				' Create the signer
				Dim signer As New PdfSigner(pdfDoc, writer, (New StampingProperties()).UseAppendMode())

				' Configure signature appearance
				Dim appearance As PdfSignatureAppearance = signer.GetSignatureAppearance()
				appearance.SetReason("Digital Signature")
				appearance.SetLocation("Your Location")
				appearance.SetContact("Your Contact")

				' Create signature
				Dim pks As IExternalSignature = New PrivateKeySignature(pk, "SHA-256")
				signer.SignDetached(pks, chain, Nothing, Nothing, Nothing, 0, PdfSigner.CryptoStandard.CMS)
			End Using
			End Using
			End Using

			Console.WriteLine($"PDF digitally signed successfully: {dest}")
		Catch ex As Exception
			Console.WriteLine($"Error signing PDF: {ex.Message}")
		End Try
	End Sub
End Class
$vbLabelText   $csharpLabel

Cuando se aplican firmas a archivos PDF digitalmente, IronPDF presenta una herramienta concisa pero poderosa para completar este proceso. Su simplicidad permite que el proceso se realice rápidamente, ahorrando tiempo a cualquier desarrollador que lo implemente para sus necesidades de firmado. iText requiere un proceso más largo y complejo para aplicar firmas digitales a archivos PDF. Si bien su capacidad para utilizar diferentes opciones de interfaz y claves ofrece más control al usuario, la complejidad de cómo esta herramienta lleva a cabo esta tarea podría dificultar su uso.

Aplicando marcas de agua a documentos PDF

La capacidad de agregar y personalizar marcas de agua en PDF con IronPDF puede ayudar enormemente con la confidencialidad, la protección de derechos de autor, la marca u cualquier tarea que implique información sensible. La siguiente es una comparación de cómo IronPDF e iText aplican marcas de agua a archivos PDF.

IronPDF

using IronPdf;

// Stamps a Watermark onto a new or existing PDF
var renderer = new ChromePdfRenderer();

var pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf");
pdf.ApplyWatermark("<h2 style='color:red'>SAMPLE</h2>", 30, IronPdf.Editing.VerticalAlignment.Middle, IronPdf.Editing.HorizontalAlignment.Center);
pdf.SaveAs(@"C:\Path\To\Watermarked.pdf");
using IronPdf;

// Stamps a Watermark onto a new or existing PDF
var renderer = new ChromePdfRenderer();

var pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf");
pdf.ApplyWatermark("<h2 style='color:red'>SAMPLE</h2>", 30, IronPdf.Editing.VerticalAlignment.Middle, IronPdf.Editing.HorizontalAlignment.Center);
pdf.SaveAs(@"C:\Path\To\Watermarked.pdf");
Imports IronPdf

' Stamps a Watermark onto a new or existing PDF
Private renderer = New ChromePdfRenderer()

Private pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf")
pdf.ApplyWatermark("<h2 style='color:red'>SAMPLE</h2>", 30, IronPdf.Editing.VerticalAlignment.Middle, IronPdf.Editing.HorizontalAlignment.Center)
pdf.SaveAs("C:\Path\To\Watermarked.pdf")
$vbLabelText   $csharpLabel

iText

using iText.IO.Font;
using iText.IO.Font.Constants;
using iText.Kernel.Colors;
using iText.Kernel.Font;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas;
using iText.Kernel.Pdf.Extgstate;
using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;

public class TransparentWatermark 
{
    public static readonly String DEST = "results/sandbox/stamper/transparent_watermark.pdf";
    public static readonly String SRC = "../../../resources/pdfs/hero.pdf";

    public static void Main(String[] args) 
    {
        FileInfo file = new FileInfo(DEST);
        file.Directory.Create();

        new TransparentWatermark().ManipulatePdf(DEST);
    }

    protected void ManipulatePdf(String dest) 
    {
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest));
        PdfCanvas under = new PdfCanvas(pdfDoc.GetFirstPage().NewContentStreamBefore(), new PdfResources(), pdfDoc);
        PdfFont font = PdfFontFactory.CreateFont(FontProgramFactory.CreateFont(StandardFonts.HELVETICA));
        Paragraph paragraph = new Paragraph("This watermark is added UNDER the existing content")
                .SetFont(font)
                .SetFontSize(15);

        Canvas canvasWatermark1 = new Canvas(under, pdfDoc.GetDefaultPageSize())
                .ShowTextAligned(paragraph, 297, 550, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
        canvasWatermark1.Close();
        PdfCanvas over = new PdfCanvas(pdfDoc.GetFirstPage());
        over.SetFillColor(ColorConstants.BLACK);
        paragraph = new Paragraph("This watermark is added ON TOP OF the existing content")
                .SetFont(font)
                .SetFontSize(15);

        Canvas canvasWatermark2 = new Canvas(over, pdfDoc.GetDefaultPageSize())
                .ShowTextAligned(paragraph, 297, 500, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
        canvasWatermark2.Close();
        paragraph = new Paragraph("This TRANSPARENT watermark is added ON TOP OF the existing content")
                .SetFont(font)
                .SetFontSize(15);
        over.SaveState();

        PdfExtGState gs1 = new PdfExtGState();
        gs1.SetFillOpacity(0.5f);
        over.SetExtGState(gs1);
        Canvas canvasWatermark3 = new Canvas(over, pdfDoc.GetDefaultPageSize())
                .ShowTextAligned(paragraph, 297, 450, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
        canvasWatermark3.Close();
        over.RestoreState();

        pdfDoc.Close();
    }
}
using iText.IO.Font;
using iText.IO.Font.Constants;
using iText.Kernel.Colors;
using iText.Kernel.Font;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas;
using iText.Kernel.Pdf.Extgstate;
using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;

public class TransparentWatermark 
{
    public static readonly String DEST = "results/sandbox/stamper/transparent_watermark.pdf";
    public static readonly String SRC = "../../../resources/pdfs/hero.pdf";

    public static void Main(String[] args) 
    {
        FileInfo file = new FileInfo(DEST);
        file.Directory.Create();

        new TransparentWatermark().ManipulatePdf(DEST);
    }

    protected void ManipulatePdf(String dest) 
    {
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest));
        PdfCanvas under = new PdfCanvas(pdfDoc.GetFirstPage().NewContentStreamBefore(), new PdfResources(), pdfDoc);
        PdfFont font = PdfFontFactory.CreateFont(FontProgramFactory.CreateFont(StandardFonts.HELVETICA));
        Paragraph paragraph = new Paragraph("This watermark is added UNDER the existing content")
                .SetFont(font)
                .SetFontSize(15);

        Canvas canvasWatermark1 = new Canvas(under, pdfDoc.GetDefaultPageSize())
                .ShowTextAligned(paragraph, 297, 550, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
        canvasWatermark1.Close();
        PdfCanvas over = new PdfCanvas(pdfDoc.GetFirstPage());
        over.SetFillColor(ColorConstants.BLACK);
        paragraph = new Paragraph("This watermark is added ON TOP OF the existing content")
                .SetFont(font)
                .SetFontSize(15);

        Canvas canvasWatermark2 = new Canvas(over, pdfDoc.GetDefaultPageSize())
                .ShowTextAligned(paragraph, 297, 500, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
        canvasWatermark2.Close();
        paragraph = new Paragraph("This TRANSPARENT watermark is added ON TOP OF the existing content")
                .SetFont(font)
                .SetFontSize(15);
        over.SaveState();

        PdfExtGState gs1 = new PdfExtGState();
        gs1.SetFillOpacity(0.5f);
        over.SetExtGState(gs1);
        Canvas canvasWatermark3 = new Canvas(over, pdfDoc.GetDefaultPageSize())
                .ShowTextAligned(paragraph, 297, 450, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
        canvasWatermark3.Close();
        over.RestoreState();

        pdfDoc.Close();
    }
}
Imports iText.IO.Font
Imports iText.IO.Font.Constants
Imports iText.Kernel.Colors
Imports iText.Kernel.Font
Imports iText.Kernel.Pdf
Imports iText.Kernel.Pdf.Canvas
Imports iText.Kernel.Pdf.Extgstate
Imports iText.Layout
Imports iText.Layout.Element
Imports iText.Layout.Properties

Public Class TransparentWatermark
	Public Shared ReadOnly DEST As String = "results/sandbox/stamper/transparent_watermark.pdf"
	Public Shared ReadOnly SRC As String = "../../../resources/pdfs/hero.pdf"

	Public Shared Sub Main(ByVal args() As String)
		Dim file As New FileInfo(DEST)
		file.Directory.Create()

		Call (New TransparentWatermark()).ManipulatePdf(DEST)
	End Sub

	Protected Sub ManipulatePdf(ByVal dest As String)
		Dim pdfDoc As New PdfDocument(New PdfReader(SRC), New PdfWriter(dest))
		Dim under As New PdfCanvas(pdfDoc.GetFirstPage().NewContentStreamBefore(), New PdfResources(), pdfDoc)
		Dim font As PdfFont = PdfFontFactory.CreateFont(FontProgramFactory.CreateFont(StandardFonts.HELVETICA))
		Dim paragraph As Paragraph = (New Paragraph("This watermark is added UNDER the existing content")).SetFont(font).SetFontSize(15)

		Dim canvasWatermark1 As Canvas = (New Canvas(under, pdfDoc.GetDefaultPageSize())).ShowTextAligned(paragraph, 297, 550, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0)
		canvasWatermark1.Close()
		Dim over As New PdfCanvas(pdfDoc.GetFirstPage())
		over.SetFillColor(ColorConstants.BLACK)
		paragraph = (New Paragraph("This watermark is added ON TOP OF the existing content")).SetFont(font).SetFontSize(15)

		Dim canvasWatermark2 As Canvas = (New Canvas(over, pdfDoc.GetDefaultPageSize())).ShowTextAligned(paragraph, 297, 500, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0)
		canvasWatermark2.Close()
		paragraph = (New Paragraph("This TRANSPARENT watermark is added ON TOP OF the existing content")).SetFont(font).SetFontSize(15)
		over.SaveState()

		Dim gs1 As New PdfExtGState()
		gs1.SetFillOpacity(0.5F)
		over.SetExtGState(gs1)
		Dim canvasWatermark3 As Canvas = (New Canvas(over, pdfDoc.GetDefaultPageSize())).ShowTextAligned(paragraph, 297, 450, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0)
		canvasWatermark3.Close()
		over.RestoreState()

		pdfDoc.Close()
	End Sub
End Class
$vbLabelText   $csharpLabel

El API fácil e intuitivo de IronPDF permite a los usuarios aplicar marcas de agua personalizadas a sus archivos PDF rápidamente, otorgando control total sobre el proceso. Su uso de HTML/CSS simplifica aún más el proceso sin perder ningún control de personalización. El enfoque de iText para agregar marcas de agua a los PDF requiere más trabajo manual, lo que puede ralentizar potencialmente el proceso.

Estampado de imágenes y texto en un PDF

Hay ocasiones en las que las páginas PDF necesitan ser estampadas con texto o imágenes en un PDF, de manera similar a cómo uno podría necesitar aplicar marcas de agua a sus archivos PDF. Ahora compararemos cómo IronPDF e iText realizan el estampado de contenido en un documento PDF.

IronPDF

using IronPdf;
using IronPdf.Editing;

ChromePdfRenderer renderer = new ChromePdfRenderer();

PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Example HTML Document!</h1>");

// Create text stamper
TextStamper textStamper = new TextStamper()
{
    Text = "Text Stamper!",
    FontFamily = "Bungee Spice",
    UseGoogleFont = true,
    FontSize = 30,
    IsBold = true,
    IsItalic = true,
    VerticalAlignment = VerticalAlignment.Top,
};

// Stamp the text stamper
pdf.ApplyStamp(textStamper);
pdf.SaveAs("stampText.pdf");

// Create image stamper
ImageStamper imageStamper = new ImageStamper(new Uri("https://ironpdf.com/img/svgs/iron-pdf-logo.svg"))
{
    VerticalAlignment = VerticalAlignment.Top,
};

// Stamp the image stamper
pdf.ApplyStamp(imageStamper, 0);
pdf.SaveAs("stampImage.pdf");
using IronPdf;
using IronPdf.Editing;

ChromePdfRenderer renderer = new ChromePdfRenderer();

PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Example HTML Document!</h1>");

// Create text stamper
TextStamper textStamper = new TextStamper()
{
    Text = "Text Stamper!",
    FontFamily = "Bungee Spice",
    UseGoogleFont = true,
    FontSize = 30,
    IsBold = true,
    IsItalic = true,
    VerticalAlignment = VerticalAlignment.Top,
};

// Stamp the text stamper
pdf.ApplyStamp(textStamper);
pdf.SaveAs("stampText.pdf");

// Create image stamper
ImageStamper imageStamper = new ImageStamper(new Uri("https://ironpdf.com/img/svgs/iron-pdf-logo.svg"))
{
    VerticalAlignment = VerticalAlignment.Top,
};

// Stamp the image stamper
pdf.ApplyStamp(imageStamper, 0);
pdf.SaveAs("stampImage.pdf");
Imports IronPdf
Imports IronPdf.Editing

Private renderer As New ChromePdfRenderer()

Private pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>Example HTML Document!</h1>")

' Create text stamper
Private textStamper As New TextStamper() With {
	.Text = "Text Stamper!",
	.FontFamily = "Bungee Spice",
	.UseGoogleFont = True,
	.FontSize = 30,
	.IsBold = True,
	.IsItalic = True,
	.VerticalAlignment = VerticalAlignment.Top
}

' Stamp the text stamper
pdf.ApplyStamp(textStamper)
pdf.SaveAs("stampText.pdf")

' Create image stamper
Dim imageStamper As New ImageStamper(New Uri("https://ironpdf.com/img/svgs/iron-pdf-logo.svg")) With {.VerticalAlignment = VerticalAlignment.Top}

' Stamp the image stamper
pdf.ApplyStamp(imageStamper, 0)
pdf.SaveAs("stampImage.pdf")
$vbLabelText   $csharpLabel

iText

using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;

public void StampPDF(string inputPdfPath, string outputPdfPath, string stampText)
{
    PdfDocument pdfDoc = new PdfDocument(new PdfReader(inputPdfPath), new PdfWriter(outputPdfPath));

    Document doc = new Document(pdfDoc);

    // Add stamp (text) to each page
    int numPages = pdfDoc.GetNumberOfPages();
    for (int i = 1; i <= numPages; i++)
    {
        doc.ShowTextAligned(new Paragraph(stampText),
                            36, 36, i, iText.Layout.Properties.TextAlignment.LEFT,
                            iText.Layout.Properties.VerticalAlignment.TOP, 0);
    }

    doc.Close();
}
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;

public void StampPDF(string inputPdfPath, string outputPdfPath, string stampText)
{
    PdfDocument pdfDoc = new PdfDocument(new PdfReader(inputPdfPath), new PdfWriter(outputPdfPath));

    Document doc = new Document(pdfDoc);

    // Add stamp (text) to each page
    int numPages = pdfDoc.GetNumberOfPages();
    for (int i = 1; i <= numPages; i++)
    {
        doc.ShowTextAligned(new Paragraph(stampText),
                            36, 36, i, iText.Layout.Properties.TextAlignment.LEFT,
                            iText.Layout.Properties.VerticalAlignment.TOP, 0);
    }

    doc.Close();
}
Imports iText.Kernel.Pdf
Imports iText.Layout
Imports iText.Layout.Element

Public Sub StampPDF(ByVal inputPdfPath As String, ByVal outputPdfPath As String, ByVal stampText As String)
	Dim pdfDoc As New PdfDocument(New PdfReader(inputPdfPath), New PdfWriter(outputPdfPath))

	Dim doc As New Document(pdfDoc)

	' Add stamp (text) to each page
	Dim numPages As Integer = pdfDoc.GetNumberOfPages()
	For i As Integer = 1 To numPages
		doc.ShowTextAligned(New Paragraph(stampText), 36, 36, i, iText.Layout.Properties.TextAlignment.LEFT, iText.Layout.Properties.VerticalAlignment.TOP, 0)
	Next i

	doc.Close()
End Sub
$vbLabelText   $csharpLabel

IronPDF puede ayudarte a agregar texto o imágenes a los PDF de una manera versátil y personalizable, ofreciendo control total. Su API es fácil de entender y de trabajar, especialmente para desarrolladores familiarizados con HTML/CSS. iText utiliza sus herramientas de estampado de imagen y texto para ofrecer a los usuarios más control sobre el contenido mostrado en sus archivos PDF, aunque el proceso puede resultar más manual.

Convertir DOCX a PDF

A veces, es posible que tengas que convertir PDF de un formato a otro. En este caso, estamos viendo la conversión de DOCX a PDF con IronPDF y cómo IronPDF e iText manejan este proceso de manera diferente.

IronPDF

using IronPdf;

// Instantiate Renderer
DocxToPdfRenderer renderer = new DocxToPdfRenderer();

// Render from DOCX file
PdfDocument pdf = renderer.RenderDocxAsPdf("Modern-chronological-resume.docx");

// Save the PDF
pdf.SaveAs("pdfFromDocx.pdf");
using IronPdf;

// Instantiate Renderer
DocxToPdfRenderer renderer = new DocxToPdfRenderer();

// Render from DOCX file
PdfDocument pdf = renderer.RenderDocxAsPdf("Modern-chronological-resume.docx");

// Save the PDF
pdf.SaveAs("pdfFromDocx.pdf");
Imports IronPdf

' Instantiate Renderer
Private renderer As New DocxToPdfRenderer()

' Render from DOCX file
Private pdf As PdfDocument = renderer.RenderDocxAsPdf("Modern-chronological-resume.docx")

' Save the PDF
pdf.SaveAs("pdfFromDocx.pdf")
$vbLabelText   $csharpLabel

iText

iText, por sí solo, no puede manejar la conversión de DOCX a PDF; en su lugar, confía en bibliotecas externas como DocX o Aspose.Words.

IronPDF proporciona a los desarrolladores una herramienta sencilla y concisa para manejar tareas de conversión de DOCX a PDF, haciendo fácil convertir archivos DOCX a formato PDF sin necesidad de bibliotecas externas. iText, por otro lado, depende de bibliotecas externas para llevar a cabo esta tarea.

Resumen de la Comparación de Ejemplos de Código

Alternativas de iText C# HTML a PDF

Para ejemplos más detallados, visita Ejemplos de IronPDF de Creación de PDF a partir de HTML.

Soporte de Bootstrap y Frameworks de CSS Modernos

Una consideración crítica que a menudo surge durante el desarrollo en el mundo real es cómo maneja cada biblioteca los frameworks CSS modernos. Con Bootstrap, Tailwind CSS y Foundation formando la base de la mayoría de las aplicaciones web contemporáneas, la compatibilidad del framework puede impactar significativamente en tu flujo de trabajo de desarrollo y calidad de salida.

IronPDF: Soporte Completo de Frameworks Modernos

El motor de renderizado de Chrome de IronPDF proporciona un soporte completo y listo para producción para todos los frameworks CSS modernos:

  • Bootstrap 5: Soporte nativo de flexbox y CSS Grid para todos los diseños
  • Tailwind CSS: Soporte completo del framework utility-first
  • CSS3 Moderno: Transformaciones, animaciones, propiedades personalizadas y selectores avanzados
  • Framework validation: Successfully renders the Bootstrap homepage and Bootstrap templates

Ejemplo de código: Indicadores de progreso de Bootstrap

using IronPdf;

var renderer = new ChromePdfRenderer();

string bootstrap ProgressBars = @"
<!DOCTYPE html>
<html>
<head>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
    <div class='container my-5'>
        <h2 class='mb-4'>Project Progress Dashboard</h2>

        <div class='mb-4'>
            <div class='d-flex justify-content-between mb-1'>
                <span>Backend Development</span>
                <span class='text-success fw-bold'>85%</span>
            </div>
            <div class='progress' style='height: 25px;'>
                <div class='progress-bar progress-bar-striped bg-success' role='progressbar'
                     style='width: 85%' aria-valuenow='85' aria-valuemin='0' aria-valuemax='100'>
                </div>
            </div>
        </div>

        <div class='mb-4'>
            <div class='d-flex justify-content-between mb-1'>
                <span>Frontend UI</span>
                <span class='text-warning fw-bold'>60%</span>
            </div>
            <div class='progress' style='height: 25px;'>
                <div class='progress-bar progress-bar-animated bg-warning' role='progressbar'
                     style='width: 60%' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100'>
                </div>
            </div>
        </div>

        <div class='mb-4'>
            <div class='d-flex justify-content-between mb-1'>
                <span>Testing & QA</span>
                <span class='text-info fw-bold'>40%</span>
            </div>
            <div class='progress' style='height: 25px;'>
                <div class='progress-bar bg-info' role='progressbar'
                     style='width: 40%' aria-valuenow='40' aria-valuemin='0' aria-valuemax='100'>
                </div>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(bootstrapProgressBars);
pdf.SaveAs("project-progress.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

string bootstrap ProgressBars = @"
<!DOCTYPE html>
<html>
<head>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
    <div class='container my-5'>
        <h2 class='mb-4'>Project Progress Dashboard</h2>

        <div class='mb-4'>
            <div class='d-flex justify-content-between mb-1'>
                <span>Backend Development</span>
                <span class='text-success fw-bold'>85%</span>
            </div>
            <div class='progress' style='height: 25px;'>
                <div class='progress-bar progress-bar-striped bg-success' role='progressbar'
                     style='width: 85%' aria-valuenow='85' aria-valuemin='0' aria-valuemax='100'>
                </div>
            </div>
        </div>

        <div class='mb-4'>
            <div class='d-flex justify-content-between mb-1'>
                <span>Frontend UI</span>
                <span class='text-warning fw-bold'>60%</span>
            </div>
            <div class='progress' style='height: 25px;'>
                <div class='progress-bar progress-bar-animated bg-warning' role='progressbar'
                     style='width: 60%' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100'>
                </div>
            </div>
        </div>

        <div class='mb-4'>
            <div class='d-flex justify-content-between mb-1'>
                <span>Testing & QA</span>
                <span class='text-info fw-bold'>40%</span>
            </div>
            <div class='progress' style='height: 25px;'>
                <div class='progress-bar bg-info' role='progressbar'
                     style='width: 40%' aria-valuenow='40' aria-valuemin='0' aria-valuemax='100'>
                </div>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(bootstrapProgressBars);
pdf.SaveAs("project-progress.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

iText7: Soporte limitado de Framework

iText7 utiliza un convertidor HTML a PDF personalizado (pdfHTML) con limitaciones significativas para los frameworks CSS modernos:

  • Sin ejecución de JavaScript: No puede manejar componentes dinámicos de Bootstrap
  • Soporte limitado de flexbox: Los diseños Bootstrap 4+ a menudo no se renderizan correctamente (v7.1.15 tiene soporte parcial)
  • No se admite CSS Grid: Los diseños modernos basados en grids no funcionarán
  • Preprocesamiento manual requerido: Diseños complejos necesitan herramientas externas como Selenium o Puppeteer

Según la documentación oficial de iText, se aconseja a los desarrolladores que:

  1. Eviten diseños CSS complejos, incluido flexbox
  2. Utilicen diseños basados en tablas en lugar de sistemas de grid modernos
  3. Simplifiquen los componentes de Bootstrap al HTML básico
  4. Realicen pruebas exhaustivas ya que la compatibilidad con el framework es limitada

Impacto en el Mundo Real: Si tu aplicación utiliza Bootstrap para su interfaz de usuario y necesitas exportar PDF que coincidan con tu diseño web, iText7 requiere ya sea un rediseño significativo de HTML/CSS para la generación de PDF o integración con herramientas externas de automatización de navegador, aumentando sustancialmente la complejidad y el tiempo de desarrollo.

Para información detallada sobre la compatibilidad con frameworks CSS, consulta la Guía de CSS Boostrap y Flexbox.

Precios y licencias: IronPDF vs. iText Library

  • No se requieren llamadas API ni configuración de plantillas

Opciones de licenciamiento de IronPDF ofrecen varios niveles y características adicionales para la compra de una licencia. Los desarrolladores también pueden comprar Iron Suite, que proporciona acceso a todos los productos de Iron Software al precio de dos. Si no estás listo para comprar una licencia, IronPDF ofrece una versión de prueba gratuita que dura 30 días.

  • Licencias perpetuas: Ofrecen una gama de licencias perpetuas según el tamaño de tu equipo, las necesidades del proyecto y el número de ubicaciones. Cada tipo de licencia viene con soporte por correo electrónico.

  • Licencia Lite: Esta licencia soporta un desarrollador, una ubicación y un proyecto.

  • Licencia Plus: Soporta tres desarrolladores, tres ubicaciones y tres proyectos, y cuesta $1,199. La licencia Plus ofrece soporte por chat, teléfono y correo electrónico.

  • Licencia Profesional: Adecuada para equipos más grandes, soportando diez desarrolladores, diez ubicaciones y diez proyectos por $2,399. Ofrece los mismos canales de soporte de contacto que los niveles anteriores pero también ofrece soporte de compartir pantalla.

  • Redistribución sin regalías: La licencia de IronPDF también ofrece cobertura de redistribución sin regalías por un costo adicional de $2,399.

  • Soporte de producto ininterrumpido: Accede a actualizaciones continuas de productos, mejoras de características de seguridad y soporte de parte de su equipo de ingeniería por $1,199/año o una compra única de $2,399 para una cobertura de 5 años.

  • Iron Suite: Por $1,498, obtienes acceso a todos los productos de Iron Software, incluidos IronPDF, IronOCR, IronWord, IronXL, IronBarcode, IronQR, IronZIP, IronPrint y IronWebScraper.

Comparación de Licencias de IronPDF

Licenciamiento de iText

  • Licencia AGPL: La biblioteca iText Core es de código abierto y está disponible para los usuarios de forma gratuita. Para usar iText bajo este modelo de licenciamiento, los usuarios deben cumplir con sus términos, y cualquier modificación hecha a iText bajo esta licencia también debe ser liberada bajo el modelo de licenciamiento AGPL.

  • Licencia comercial: iText ofrece un modelo de licenciamiento comercial para desarrolladores cuyos proyectos no cumplen con los términos de AGPL, y el precio se basa en cotizaciones.

Documentación y soporte: IronPDF vs. iText

IronPDF

  • Documentación Completa: Documentación amplia y fácil de usar que abarca todas las características.

  • Soporte 24/5: Soporte activo de ingenieros disponible.

  • Tutoriales en Video: Guías paso a paso en video disponibles en YouTube.

  • Foro Comunitario: Comunidad comprometida para soporte adicional.

  • Actualizaciones regulares: Actualizaciones mensuales de productos con las últimas características y parches de seguridad.

iText

  • Documentación: Documentación detallada que cubre las características del software iText.

  • Ejemplos y tutoriales: Tutoriales y ejemplos de código para varias características.

  • GitHub: Los desarrolladores pueden presentar cualquier problema o error al repositorio GitHub de iText y comunicarse con el grupo de iText.

  • Actualizaciones: iText ofrece actualizaciones y mejoras regulares.

For more details on IronPDF documentation and support, visit IronPDF Documentation and the Iron Software YouTube Channel.

Conclusión

En el ámbito de las herramientas de manipulación de PDF para .NET, tanto IronPDF como iText ofrecen capacidades robustas adaptadas a diversas necesidades de desarrollo. IronPDF destaca por su integración sencilla en plataformas como .NET Core, Framework y Standard, junto con características de conversión de HTML a PDF y opciones de seguridad avanzadas. Por otro lado, iText, reconocido por su herencia en Java, proporciona potentes herramientas de generación y manipulación de PDF bajo licencias de código abierto y comerciales, enfatizando la versatilidad y la personalización.

Elegir entre estas herramientas depende en última instancia de los requisitos del proyecto, las preferencias de licenciamiento y el nivel de soporte técnico necesario. Ya sea optando por la simplicidad y flexibilidad de IronPDF o por el extenso conjunto de características del librería de PDF de código abierto que es iText, los desarrolladores tienen amplios recursos para agilizar los flujos de trabajo de PDF de manera efectiva en sus aplicaciones.

Puede probar la prueba gratuita de 30 días para ver sus características disponibles.

Por favor notaiText es una marca registrada de su respectivo propietario. Este sitio no está afiliado, patrocinado o respaldado por iText. Todos los nombres de producto, logotipos y marcas son propiedad de sus respectivos dueños. Las comparaciones son solo para fines informativos y reflejan información públicamente disponible en el momento de la redacción.

Preguntas Frecuentes

¿Cómo puedo 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.

¿Cuáles son las principales diferencias entre IronPDF e iText?

IronPDF es elogiado por su facilidad de uso, documentación completa y sólido soporte técnico, lo que lo convierte en una opción fácil de usar para los desarrolladores. iText, aunque robusto, a menudo requiere más esfuerzo manual y está disponible bajo licencias de código abierto (AGPL) y comerciales.

¿Qué opciones de licencia están disponibles para las bibliotecas PDF?

IronPDF ofrece varias licencias perpetuas y una opción libre de regalías, mientras que iText proporciona una licencia AGPL gratuita con una opción comercial para proyectos que no cumplen con AGPL.

¿Qué biblioteca PDF ofrece mejor soporte para los desarrolladores?

IronPDF ofrece documentación completa, soporte ingeniero 24/5 y un foro comunitario activo, asegurando que los desarrolladores tengan acceso a recursos y asistencia actualizados.

¿Es IronPDF compatible con diferentes entornos .NET?

Sí, IronPDF es compatible con .NET Core, .NET Standard y .NET Framework, y funciona en entornos como Windows, Linux, Mac, Docker, Azure y AWS.

¿Cómo maneja IronPDF el cifrado de PDF?

IronPDF ofrece una API sencilla para cifrar PDFs, permitiendo a los usuarios editar metadatos y ajustar configuraciones de seguridad fácilmente, asegurando la seguridad y el cumplimiento del documento.

¿Puede IronPDF realizar la conversión de DOCX a PDF?

Sí, IronPDF sobresale en la conversión de DOCX a PDF, ofreciendo un proceso directo y eficiente sin necesidad de bibliotecas externas, agilizando las tareas de conversión de documentos dentro de las aplicaciones.

¿Qué características hacen destacar a IronPDF para la conversión de HTML a PDF?

IronPDF utiliza un ChromePdfRenderer para la conversión de HTML a PDF, permitiendo la integración fácil de HTML, CSS y JavaScript, asegurando una representación precisa del contenido web en PDFs.

¿Cómo se comparan IronPDF e iText en términos de compatibilidad multiplataforma?

Ambas bibliotecas admiten múltiples sistemas operativos y entornos, pero IronPDF ofrece una experiencia más simplificada para tareas como la conversión de HTML a PDF y el cifrado de PDF.

¿Cuáles son las características clave que ofrece IronPDF?

IronPDF ofrece características como conversión de HTML a PDF, manipulación de archivos PDF, cifrado y descifrado, capacidades de edición, marca de agua, estampado de PDF y firma digital.

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