Saltar al pie de página
COMPARACIONES DE PRODUCTOS

Una Comparación entre IronPDF y GrapeCity PDF Viewer

PDF significa Formato de Documento Portátil. Es un tipo de archivo que permite la visualización convencional de cualquier documento en muchos dispositivos diferentes. Los PDFs se utilizan a menudo para compartir documentos importantes como currículums con posibles empleadores o facturas con clientes.

A pesar de su popularidad, también existen algunas desventajas al utilizar PDFs como una forma de almacenar y compartir datos. Por ejemplo, los PDFs no pueden compartirse por correo electrónico, ya que primero deben abrirse en un lector de PDF. Incluso si pudieran, los PDFs no se verían tan claros como un documento de Word al abrirlos en un teléfono. Además, los PDFs no pueden editarse o actualizarse como los documentos de Word, a menos que tengas software de edición instalado en tu computadora que pueda reconocer los datos en el archivo y convertirlos de nuevo a una forma editable. Esto significa que los archivos PDF pueden verse iguales cuando los abres, sin importar el dispositivo que estés utilizando, sea una PC o una Mac. Esto hace que los archivos PDF sean confiables en todos los dispositivos debido al estándar familiar que implementan, que no se encuentra en otros formatos de documentos como JPEG o GIF.

En este artículo, revisaremos dos bibliotecas de PDF para .NET:

  • IronPDF
  • GrapeCity PDF

IronPDF

IronPDF es una biblioteca .NET que ofrece funciones para crear, leer y manipular documentos PDF con solo unas pocas líneas de código. El siguiente artículo te mostrará cómo crear archivos PDF con IronPDF. El contenido se basa en el supuesto de que tienes una comprensión de los conceptos básicos de Visual Studio o C#, y que posees conocimientos de HTML.

Necesitamos Visual Studio para escribir, compilar y ejecutar nuestra aplicación, C# para escribir la lógica y el código, y HTML para formatear archivos PDF, incluyendo agregar títulos, encabezados, imágenes, párrafos, etc. La biblioteca IronPDF es totalmente compatible con .NET Core, .NET 5, Framework y Standard.

Podemos crear un archivo PDF en C# con solo unas pocas líneas de código. Esta es una tarea sencilla dada un conocimiento básico de C# y HTML. Aprende más sobre IronPDF visitando su sitio oficial en características de IronPDF.

Instalando IronPDF

Desarrollar una solución requiere la instalación del paquete NuGet para IronPDF. Haz clic en "Proyecto" directamente desde la barra de menú. Aparecerá una lista desplegable. Selecciona "Administrar Paquetes NuGet" del menú desplegable y selecciónalo. Aparecerá una ventana como esta:

Grapecity Pdf Viewer Alternatives 1 related to Instalando IronPDF

Selecciona la pestaña "Navegar" y la ventana subsiguiente como esta aparecerá:

Grapecity Pdf Viewer Alternatives 2 related to Instalando IronPDF

Escribe 'IronPdf' en el cuadro de búsqueda y presiona "Enter." La ventana resultante debería aparecer:

Grapecity Pdf Viewer Alternatives 3 related to Instalando IronPDF

Selecciona IronPDF:

How To Create PDF File In C# By Ironpdfile

How To Create PDF File In C# By Ironpdfile

Selecciona el botón 'Instalar'. La ventana resultante aparecerá después de una instalación exitosa:

Grapecity Pdf Viewer Alternatives 5 related to Instalando IronPDF

Una vez que presiones el botón 'OK', estarás listo para comenzar.

Creando un PDF

Agrega el espacio de nombres IronPdf en la parte superior del archivo.

using IronPdf;
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

El trabajo real comienza desde este punto. Requerimos una ruta de archivo para almacenar el documento PDF construido. Para lograr eso, usamos SaveFileDialog, que solicita al usuario elegir un nombre y una ruta de archivo.

private void Save_Click(object sender, EventArgs e)
{
    // Code to Select the folder and save the file.
    SaveFileDialog saveFileDialog1 = new SaveFileDialog();
    saveFileDialog1.InitialDirectory = @"D:\";
    saveFileDialog1.Title = "Save Pdf File";
    saveFileDialog1.DefaultExt = "pdf";
    saveFileDialog1.Filter = "Pdf files (*.pdf)|*.pdf|All files (*.*)|*.*";
    saveFileDialog1.FilterIndex = 2;
    saveFileDialog1.RestoreDirectory = true;
    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
    {
        string filename = saveFileDialog1.FileName;
        // actual code that will create Pdf files
        var HtmlLine = new HtmlToPdf();
        HtmlLine.RenderHtmlAsPdf(PdfText.Text).SaveAs(filename);
        // MessageBox to display that file save
        MessageBox.Show("File Saved Successfully!");
    }
}
private void Save_Click(object sender, EventArgs e)
{
    // Code to Select the folder and save the file.
    SaveFileDialog saveFileDialog1 = new SaveFileDialog();
    saveFileDialog1.InitialDirectory = @"D:\";
    saveFileDialog1.Title = "Save Pdf File";
    saveFileDialog1.DefaultExt = "pdf";
    saveFileDialog1.Filter = "Pdf files (*.pdf)|*.pdf|All files (*.*)|*.*";
    saveFileDialog1.FilterIndex = 2;
    saveFileDialog1.RestoreDirectory = true;
    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
    {
        string filename = saveFileDialog1.FileName;
        // actual code that will create Pdf files
        var HtmlLine = new HtmlToPdf();
        HtmlLine.RenderHtmlAsPdf(PdfText.Text).SaveAs(filename);
        // MessageBox to display that file save
        MessageBox.Show("File Saved Successfully!");
    }
}
Private Sub Save_Click(ByVal sender As Object, ByVal e As EventArgs)
	' Code to Select the folder and save the file.
	Dim saveFileDialog1 As New SaveFileDialog()
	saveFileDialog1.InitialDirectory = "D:\"
	saveFileDialog1.Title = "Save Pdf File"
	saveFileDialog1.DefaultExt = "pdf"
	saveFileDialog1.Filter = "Pdf files (*.pdf)|*.pdf|All files (*.*)|*.*"
	saveFileDialog1.FilterIndex = 2
	saveFileDialog1.RestoreDirectory = True
	If saveFileDialog1.ShowDialog() = DialogResult.OK Then
		Dim filename As String = saveFileDialog1.FileName
		' actual code that will create Pdf files
		Dim HtmlLine = New HtmlToPdf()
		HtmlLine.RenderHtmlAsPdf(PdfText.Text).SaveAs(filename)
		' MessageBox to display that file save
		MessageBox.Show("File Saved Successfully!")
	End If
End Sub
$vbLabelText   $csharpLabel

SaveFileDialog debe abrir un cuadro de diálogo de archivo que te permitirá seleccionar la carpeta y el nombre de archivo en la ubicación donde deseas construir un documento PDF. El Directorio Inicial está configurado en la unidad D, pero puedes elegir configurarlo en cualquier otra. Como solo estamos tratando con archivos PDF, la Extensión Predeterminada se ha configurado en archivos PDF.

En la condición "if", se inserta el código real que creará el archivo PDF. Ahora podemos ver que hemos logrado generar un archivo PDF con solo dos líneas de código. PdfText es el nombre de un cuadro de texto enriquecido que contiene el texto que se escribirá en un documento PDF. El nombre de archivo es la ruta y el nombre de archivo seleccionado mediante el método SaveFileDialog.

Leyendo PDFs

Podrías estar pensando que el código para leer archivos PDF será complejo y difícil de escribir/comprender, pero no te preocupes, IronPDF lo ha hecho más fácil y sencillo. ¡Este proceso requiere solo dos líneas de código para lograrse!

Agrega el siguiente código para importar la biblioteca IronPdf en la parte superior del archivo.

using IronPdf;
using System;
using System.Windows.Forms;
using IronPdf;
using System;
using System.Windows.Forms;
Imports IronPdf
Imports System
Imports System.Windows.Forms
$vbLabelText   $csharpLabel

Escribe el siguiente código dentro de la función.

private void Read_Click(object sender, EventArgs e)
{
    PdfDocument PDF = PdfDocument.FromFile(FilePath.Text);
    FileContent.Text = PDF.ExtractAllText();
}
private void Read_Click(object sender, EventArgs e)
{
    PdfDocument PDF = PdfDocument.FromFile(FilePath.Text);
    FileContent.Text = PDF.ExtractAllText();
}
Private Sub Read_Click(ByVal sender As Object, ByVal e As EventArgs)
	Dim PDF As PdfDocument = PdfDocument.FromFile(FilePath.Text)
	FileContent.Text = PDF.ExtractAllText()
End Sub
$vbLabelText   $csharpLabel

Esto extraerá toda la información de la fuente de datos al visor de documentos. Todos los componentes de informes usarán esos datos como fuente de datos.

Características de GrapeCity PDF

GrapeCity Documents es un sistema de gestión de documentos multiplataforma que proporciona una solución universal de documentos, editor y lector para todos los formatos de documentos comunes. Sin necesidad de un programa adicional como Adobe Acrobat, la rica biblioteca proporcionada por .NET Standard 2.0 puede usarse para leer, generar, alterar y guardar archivos PDF. Tiene un conjunto de características robusto que permite a los desarrolladores crear archivos PDF que incluyen soporte avanzado de fuentes, fotos, gráficos, códigos de barras, comentarios, esquemas, sellos, marcas de agua y más.

Manipulando PDFs

En aplicaciones .NET Standard, puedes usar GrapeCityPDF para producir documentos PDF con necesidades comerciales básicas o complicadas. Además, puedes cargar, cambiar y guardar PDFs desde cualquier fuente.

Guardar PDF como Imagen

Puedes guardar un PDF como una imagen sin sacrificar la calidad de la imagen utilizando GrapeCityPDF. Además, puedes implementar esta funcionalidad con solo unas pocas líneas de código.

Visor de PDF

GrapeCity Documents PDF Viewer es un visor lado cliente basado en programación liviano para ver archivos PDF. Muchas de las funciones habituales de PDF son compatibles.

Gran Cantidad de Características

La biblioteca GrapeCityPDF tiene numerosas capacidades que te permiten crear documentos PDF complicados que contienen información como texto, gráficos, fotos, anotaciones, esquemas y más.

Instalaciones

Hay dos métodos para instalar GrapeCity.

  1. Selecciona el botón descargar archivos fuente comprimidos para descargar los ejemplos de fuentes actuales.
  2. Extrae los archivos directamente del zip descargado en un directorio en tu computadora.
  3. Navega a ese directorio.
  4. Ejecuta el archivo por lotes run.cmd. Esto construirá las fuentes de ejemplo. Inicia el servicio SupportApi y abre la URL http://localhost:3003 en tu navegador predeterminado.
  5. Para más información, consulta el readme.MD, incluido en el zip descargado.

Instalando la Edición WinForms

El siguiente tema discute el procedimiento de instalación de la Edición WinForms. Los siguientes pasos proporcionan las instrucciones para instalar la Edición WinForms:

  • Download the C1ControlPanel from GrapeCity's ComponentOne to install the latest edition of WinForms.
  • Abre el Panel de Control usando ComponentOneC1ControlPanel.exe. Deben cerrarse todas las instancias en ejecución de Visual Studio.
  • Un usuario existente puede iniciar sesión usando la dirección de correo electrónico registrada y la contraseña.
  • Si eres un nuevo usuario:
    • Regístrate en Component One y crea una cuenta completando los campos requeridos.
    • Se enviará una verificación a tu dirección de correo electrónico.
    • Activa tu dirección de correo electrónico visitando el enlace de verificación.
    • Si no quieres iniciar sesión o registrarte, puedes proceder como usuario anónimo.
  • En el azulejo de Edición WinForms, selecciona Instalar. La instalación de todas las ediciones puede lograrse seleccionando la casilla contra Todas las Ediciones. Selecciona el botón Ver Más para obtener más información sobre la Edición.
Instalación de GrapeCity PDF

  • Una vez que hagas clic en Instalar, una página mostrará el Acuerdo de Licencia pidiendo que lo revises antes de hacer clic en el botón Aceptar Acuerdo de Licencia.
  • Una vez que aceptes el Acuerdo de Licencia, aparecerá una página consecuente con los botones de Configuraciones y cambio de ruta de directorio. Selecciona la solicitud Aceptar Configuración para verificar la ruta del directorio y comenzar el proceso de instalación.
Instalación de GrapeCity PDF

  • El instalador instala los controles y muestra su progreso mientras lo hace. No podrás cancelar el proceso de instalación mientras esta pantalla se muestra.
  • Una vez instalados los controles, se mostrará la pantalla "Éxito de Instalación". La versión actualmente instalada se mostrará en la Edición respectiva.
  • El instalador instala los controles y muestra su progreso mientras lo hace. No podrás cancelar el proceso de instalación mientras esta pantalla se muestra.
Instalación de GrapeCity PDF

  • Una vez instalados los controles, se mostrará la pantalla "Éxito de Instalación". La versión actualmente instalada se mostrará en la Edición respectiva.
Instalación de GrapeCity PDF

Creando un PDF

using System;
using System.IO;
using System.Drawing;
using System.Text;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Common;
using GrapeCity.Documents.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Pdf.Structure;
using GrapeCity.Documents.Pdf.MarkedContent;
using GrapeCity.Documents.Pdf.Graphics;
using GrapeCity.Documents.Pdf.Annotations;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;
namespace GcPdfWeb.Samples.Basics
{
    // This sample shows how to create a PDF/A-3u compliant document.
    public class PdfA
    {
        public void CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            var date = new DateTime(1961, 4, 12, 6, 7, 0, DateTimeKind.Utc);

            // Mark the document as PDF/A-3u conformant:
            doc.ConformanceLevel = PdfAConformanceLevel.PdfA3u;

            var fnt = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "arial.ttf"));
            var gap = 36;

            // PDF/A-3a requires all content to be tagged so create and populate StructElement when rendering:
            StructElement sePart = new StructElement("Part");
            doc.StructTreeRoot.Children.Add(sePart);

            TextLayout tl = null;
            // Add 3 pages with sample content tagged according to PDF/A rules:
            for (int pageNo = 1; pageNo <= 3; ++pageNo)
            {
                // add page
                var page = doc.Pages.Add();
                var g = page.Graphics;
                float y = 72;
                if (doc.Pages.Count == 1)
                {
                    // Create paragraph element:
                    var seParagraph = new StructElement("P") { DefaultPage = page };
                    // Add it to Part element:
                    sePart.Children.Add(seParagraph);

                    tl = g.CreateTextLayout();
                    tl.MarginAll = 72;
                    tl.MaxWidth = page.Size.Width;

                    tl.DefaultFormat.Font = fnt;
                    tl.DefaultFormat.FontBold = true;
                    tl.DefaultFormat.FontSize = 20;
                    tl.Append("PDF/A-3A Document");

                    // PerformLayout is done automatically in a new TextLayout or after a Clear():
                    //tl.PerformLayout(true);

                    // Draw TextLayout within tagged content:
                    g.BeginMarkedContent(new TagMcid("P", 0));
                    g.DrawTextLayout(tl, PointF.Empty);
                    g.EndMarkedContent();

                    y = tl.ContentRectangle.Bottom + gap;

                    seParagraph.ContentItems.Add(new McidContentItemLink(0));
                }

                // Add some sample paragraphs tagged according to PDF/A rules:
                for (int i = 1; i <= 3; ++i)
                {
                    // Create paragraph element:
                    var seParagraph = new StructElement("P") { DefaultPage = page };
                    // Add it to Part element:
                    sePart.Children.Add(seParagraph);

                    var sb = new StringBuilder();
                    sb.Append(string.Format("Paragraph {0} on page {1}: ", i, pageNo));
                    sb.Append(Common.Util.LoremIpsum(1, 2, 4, 5, 10));
                    var para = sb.ToString();

                    tl.Clear();
                    tl.DefaultFormat.FontSize = 14;
                    tl.DefaultFormat.FontBold = false;
                    tl.MarginTop = y;
                    tl.Append(para);

                    // Draw TextLayout within tagged content:
                    g.BeginMarkedContent(new TagMcid("P", i));
                    g.DrawTextLayout(tl, PointF.Empty);
                    g.EndMarkedContent();

                    y += tl.ContentHeight + gap;

                    // Add content item to paragraph StructElement:
                    seParagraph.ContentItems.Add(new McidContentItemLink(i));

                    // PDF/A-3 allows embedding files into document, but they should be associated with some document element
                    // add embedded file associated with seParagraph:
                    var ef1 = EmbeddedFileStream.FromBytes(doc, Encoding.UTF8.GetBytes(para));
                    // ModificationDate and MimeType should be specified in case of PDF/A:
                    ef1.ModificationDate = date;
                    ef1.MimeType = "text/plain";
                    var fn = string.Format("Page{0}_Paragraph{1}.txt", pageNo, i);
                    var fs1 = FileSpecification.FromEmbeddedStream(fn, ef1);
                    // UnicodeFile.FileName should be specified for PDF/A compliance:
                    fs1.UnicodeFile.FileName = fs1.File.FileName;
                    // Relationship should be specified in case of PDF/A:
                    fs1.Relationship = AFRelationship.Unspecified;
                    doc.EmbeddedFiles.Add(fn, fs1);
                    seParagraph.AssociatedFiles.Add(fs1);
                }
            }

            // PDF/A-3 allows transparency drawing in PDF file, add some:
            var gpage = doc.Pages [0].Graphics;
            gpage.FillRectangle(new RectangleF(20, 20, 200, 200), Color.FromArgb(40, Color.Red));

            // PDF/A-3 allows using FormXObjects, add one with transparency:
            var r = new RectangleF(0, 0, 144, 72);
            var fxo = new FormXObject(doc, r);
            var gfxo = fxo.Graphics;
            gfxo.FillRectangle(r, Color.FromArgb(40, Color.Violet));
            TextFormat tf = new TextFormat()
            {
                Font = fnt,
                FontSize = 16,
                ForeColor = Color.FromArgb(100, Color.Black),
            };
            gfxo.DrawString("FormXObject", tf, r, TextAlignment.Center, ParagraphAlignment.Center);
            gfxo.DrawRectangle(r, Color.Blue, 3);
            gpage.DrawForm(fxo, new RectangleF(300, 250, r.Width, r.Height), null, ImageAlign.ScaleImage);

            // PDF/A-3 allows using embedded files, but each embedded file must be associated with a document's element:
            EmbeddedFileStream ef = EmbeddedFileStream.FromFile(doc, Path.Combine("Resources", "WordDocs", "ProcurementLetter.docx"));
            // ModificationDate and MimeType should be specified for EmbeddedFile in PDF/A:
            ef.ModificationDate = date;
            ef.MimeType = "application/msword";
            var fs = FileSpecification.FromEmbeddedFile(ef);
            fs.UnicodeFile.FileName = fs.File.FileName;
            fs.Relationship = AFRelationship.Unspecified;
            doc.EmbeddedFiles.Add("ProcurementLetter.docx", fs);
            // Associate embedded file with the document:
            doc.AssociatedFiles.Add(fs);

            // Add an attachment associated with an annotation:
            var sa = new StampAnnotation()
            {
                UserName = "Minerva",
                Font = fnt,
                Rect = new RectangleF(300, 36, 220, 72),
            };
            sa.Flags |= AnnotationFlags.Print;
            // Use a FormXObject to represent the stamp annotation:
            var stampFxo = new FormXObject(doc, new RectangleF(PointF.Empty, sa.Rect.Size));
            var gstampFxo = stampFxo.Graphics;
            gstampFxo.FillRectangle(stampFxo.Bounds, Color.FromArgb(40, Color.Green));
            gstampFxo.DrawString("Stamp Annotation\nassociated with minerva.jpg", tf, stampFxo.Bounds, TextAlignment.Center, ParagraphAlignment.Center);
            gstampFxo.DrawRectangle(stampFxo.Bounds, Color.Green, 3);
            //
            sa.AppearanceStreams.Normal.Default = stampFxo;
            doc.Pages [0].Annotations.Add(sa);
            ef = EmbeddedFileStream.FromFile(doc, Path.Combine("Resources", "Images", "minerva.jpg"));
            ef.ModificationDate = date;
            ef.MimeType = "image/jpeg";
            fs = FileSpecification.FromEmbeddedFile(ef);
            fs.UnicodeFile.FileName = fs.File.FileName;
            fs.Relationship = AFRelationship.Unspecified;
            doc.EmbeddedFiles.Add("minerva.jpg", fs);
            sa.AssociatedFiles.Add(fs);

            // Mark the document as conforming to Tagged PDF conventions (required for PDF/A):
            doc.MarkInfo.Marked = true;

            // Metadata.CreatorTool and DocumentInfo.Creator should be the same for a PDF/A document:
            doc.Metadata.CreatorTool = doc.DocumentInfo.Creator;
            // A title should be specified for PDF/A document:
            doc.Metadata.Title = "GcPdf Document";
            doc.ViewerPreferences.DisplayDocTitle = true;

            // Done:
            doc.Save(stream);
        }
    }
}
using System;
using System.IO;
using System.Drawing;
using System.Text;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Common;
using GrapeCity.Documents.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Pdf.Structure;
using GrapeCity.Documents.Pdf.MarkedContent;
using GrapeCity.Documents.Pdf.Graphics;
using GrapeCity.Documents.Pdf.Annotations;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;
namespace GcPdfWeb.Samples.Basics
{
    // This sample shows how to create a PDF/A-3u compliant document.
    public class PdfA
    {
        public void CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            var date = new DateTime(1961, 4, 12, 6, 7, 0, DateTimeKind.Utc);

            // Mark the document as PDF/A-3u conformant:
            doc.ConformanceLevel = PdfAConformanceLevel.PdfA3u;

            var fnt = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "arial.ttf"));
            var gap = 36;

            // PDF/A-3a requires all content to be tagged so create and populate StructElement when rendering:
            StructElement sePart = new StructElement("Part");
            doc.StructTreeRoot.Children.Add(sePart);

            TextLayout tl = null;
            // Add 3 pages with sample content tagged according to PDF/A rules:
            for (int pageNo = 1; pageNo <= 3; ++pageNo)
            {
                // add page
                var page = doc.Pages.Add();
                var g = page.Graphics;
                float y = 72;
                if (doc.Pages.Count == 1)
                {
                    // Create paragraph element:
                    var seParagraph = new StructElement("P") { DefaultPage = page };
                    // Add it to Part element:
                    sePart.Children.Add(seParagraph);

                    tl = g.CreateTextLayout();
                    tl.MarginAll = 72;
                    tl.MaxWidth = page.Size.Width;

                    tl.DefaultFormat.Font = fnt;
                    tl.DefaultFormat.FontBold = true;
                    tl.DefaultFormat.FontSize = 20;
                    tl.Append("PDF/A-3A Document");

                    // PerformLayout is done automatically in a new TextLayout or after a Clear():
                    //tl.PerformLayout(true);

                    // Draw TextLayout within tagged content:
                    g.BeginMarkedContent(new TagMcid("P", 0));
                    g.DrawTextLayout(tl, PointF.Empty);
                    g.EndMarkedContent();

                    y = tl.ContentRectangle.Bottom + gap;

                    seParagraph.ContentItems.Add(new McidContentItemLink(0));
                }

                // Add some sample paragraphs tagged according to PDF/A rules:
                for (int i = 1; i <= 3; ++i)
                {
                    // Create paragraph element:
                    var seParagraph = new StructElement("P") { DefaultPage = page };
                    // Add it to Part element:
                    sePart.Children.Add(seParagraph);

                    var sb = new StringBuilder();
                    sb.Append(string.Format("Paragraph {0} on page {1}: ", i, pageNo));
                    sb.Append(Common.Util.LoremIpsum(1, 2, 4, 5, 10));
                    var para = sb.ToString();

                    tl.Clear();
                    tl.DefaultFormat.FontSize = 14;
                    tl.DefaultFormat.FontBold = false;
                    tl.MarginTop = y;
                    tl.Append(para);

                    // Draw TextLayout within tagged content:
                    g.BeginMarkedContent(new TagMcid("P", i));
                    g.DrawTextLayout(tl, PointF.Empty);
                    g.EndMarkedContent();

                    y += tl.ContentHeight + gap;

                    // Add content item to paragraph StructElement:
                    seParagraph.ContentItems.Add(new McidContentItemLink(i));

                    // PDF/A-3 allows embedding files into document, but they should be associated with some document element
                    // add embedded file associated with seParagraph:
                    var ef1 = EmbeddedFileStream.FromBytes(doc, Encoding.UTF8.GetBytes(para));
                    // ModificationDate and MimeType should be specified in case of PDF/A:
                    ef1.ModificationDate = date;
                    ef1.MimeType = "text/plain";
                    var fn = string.Format("Page{0}_Paragraph{1}.txt", pageNo, i);
                    var fs1 = FileSpecification.FromEmbeddedStream(fn, ef1);
                    // UnicodeFile.FileName should be specified for PDF/A compliance:
                    fs1.UnicodeFile.FileName = fs1.File.FileName;
                    // Relationship should be specified in case of PDF/A:
                    fs1.Relationship = AFRelationship.Unspecified;
                    doc.EmbeddedFiles.Add(fn, fs1);
                    seParagraph.AssociatedFiles.Add(fs1);
                }
            }

            // PDF/A-3 allows transparency drawing in PDF file, add some:
            var gpage = doc.Pages [0].Graphics;
            gpage.FillRectangle(new RectangleF(20, 20, 200, 200), Color.FromArgb(40, Color.Red));

            // PDF/A-3 allows using FormXObjects, add one with transparency:
            var r = new RectangleF(0, 0, 144, 72);
            var fxo = new FormXObject(doc, r);
            var gfxo = fxo.Graphics;
            gfxo.FillRectangle(r, Color.FromArgb(40, Color.Violet));
            TextFormat tf = new TextFormat()
            {
                Font = fnt,
                FontSize = 16,
                ForeColor = Color.FromArgb(100, Color.Black),
            };
            gfxo.DrawString("FormXObject", tf, r, TextAlignment.Center, ParagraphAlignment.Center);
            gfxo.DrawRectangle(r, Color.Blue, 3);
            gpage.DrawForm(fxo, new RectangleF(300, 250, r.Width, r.Height), null, ImageAlign.ScaleImage);

            // PDF/A-3 allows using embedded files, but each embedded file must be associated with a document's element:
            EmbeddedFileStream ef = EmbeddedFileStream.FromFile(doc, Path.Combine("Resources", "WordDocs", "ProcurementLetter.docx"));
            // ModificationDate and MimeType should be specified for EmbeddedFile in PDF/A:
            ef.ModificationDate = date;
            ef.MimeType = "application/msword";
            var fs = FileSpecification.FromEmbeddedFile(ef);
            fs.UnicodeFile.FileName = fs.File.FileName;
            fs.Relationship = AFRelationship.Unspecified;
            doc.EmbeddedFiles.Add("ProcurementLetter.docx", fs);
            // Associate embedded file with the document:
            doc.AssociatedFiles.Add(fs);

            // Add an attachment associated with an annotation:
            var sa = new StampAnnotation()
            {
                UserName = "Minerva",
                Font = fnt,
                Rect = new RectangleF(300, 36, 220, 72),
            };
            sa.Flags |= AnnotationFlags.Print;
            // Use a FormXObject to represent the stamp annotation:
            var stampFxo = new FormXObject(doc, new RectangleF(PointF.Empty, sa.Rect.Size));
            var gstampFxo = stampFxo.Graphics;
            gstampFxo.FillRectangle(stampFxo.Bounds, Color.FromArgb(40, Color.Green));
            gstampFxo.DrawString("Stamp Annotation\nassociated with minerva.jpg", tf, stampFxo.Bounds, TextAlignment.Center, ParagraphAlignment.Center);
            gstampFxo.DrawRectangle(stampFxo.Bounds, Color.Green, 3);
            //
            sa.AppearanceStreams.Normal.Default = stampFxo;
            doc.Pages [0].Annotations.Add(sa);
            ef = EmbeddedFileStream.FromFile(doc, Path.Combine("Resources", "Images", "minerva.jpg"));
            ef.ModificationDate = date;
            ef.MimeType = "image/jpeg";
            fs = FileSpecification.FromEmbeddedFile(ef);
            fs.UnicodeFile.FileName = fs.File.FileName;
            fs.Relationship = AFRelationship.Unspecified;
            doc.EmbeddedFiles.Add("minerva.jpg", fs);
            sa.AssociatedFiles.Add(fs);

            // Mark the document as conforming to Tagged PDF conventions (required for PDF/A):
            doc.MarkInfo.Marked = true;

            // Metadata.CreatorTool and DocumentInfo.Creator should be the same for a PDF/A document:
            doc.Metadata.CreatorTool = doc.DocumentInfo.Creator;
            // A title should be specified for PDF/A document:
            doc.Metadata.Title = "GcPdf Document";
            doc.ViewerPreferences.DisplayDocTitle = true;

            // Done:
            doc.Save(stream);
        }
    }
}
Imports Microsoft.VisualBasic
Imports System
Imports System.IO
Imports System.Drawing
Imports System.Text
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Common
Imports GrapeCity.Documents.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Pdf.Structure
Imports GrapeCity.Documents.Pdf.MarkedContent
Imports GrapeCity.Documents.Pdf.Graphics
Imports GrapeCity.Documents.Pdf.Annotations
Imports GCTEXT = GrapeCity.Documents.Text
Imports GCDRAW = GrapeCity.Documents.Drawing
Namespace GcPdfWeb.Samples.Basics
	' This sample shows how to create a PDF/A-3u compliant document.
	Public Class PdfA
		Public Sub CreatePDF(ByVal stream As Stream)
			Dim doc = New GcPdfDocument()
			Dim [date] = New DateTime(1961, 4, 12, 6, 7, 0, DateTimeKind.Utc)

			' Mark the document as PDF/A-3u conformant:
			doc.ConformanceLevel = PdfAConformanceLevel.PdfA3u

			Dim fnt = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "arial.ttf"))
			Dim gap = 36

			' PDF/A-3a requires all content to be tagged so create and populate StructElement when rendering:
			Dim sePart As New StructElement("Part")
			doc.StructTreeRoot.Children.Add(sePart)

			Dim tl As TextLayout = Nothing
			' Add 3 pages with sample content tagged according to PDF/A rules:
			For pageNo As Integer = 1 To 3
				' add page
				Dim page = doc.Pages.Add()
				Dim g = page.Graphics
				Dim y As Single = 72
				If doc.Pages.Count = 1 Then
					' Create paragraph element:
					Dim seParagraph = New StructElement("P") With {.DefaultPage = page}
					' Add it to Part element:
					sePart.Children.Add(seParagraph)

					tl = g.CreateTextLayout()
					tl.MarginAll = 72
					tl.MaxWidth = page.Size.Width

					tl.DefaultFormat.Font = fnt
					tl.DefaultFormat.FontBold = True
					tl.DefaultFormat.FontSize = 20
					tl.Append("PDF/A-3A Document")

					' PerformLayout is done automatically in a new TextLayout or after a Clear():
					'tl.PerformLayout(true);

					' Draw TextLayout within tagged content:
					g.BeginMarkedContent(New TagMcid("P", 0))
					g.DrawTextLayout(tl, PointF.Empty)
					g.EndMarkedContent()

					y = tl.ContentRectangle.Bottom + gap

					seParagraph.ContentItems.Add(New McidContentItemLink(0))
				End If

				' Add some sample paragraphs tagged according to PDF/A rules:
				For i As Integer = 1 To 3
					' Create paragraph element:
					Dim seParagraph = New StructElement("P") With {.DefaultPage = page}
					' Add it to Part element:
					sePart.Children.Add(seParagraph)

					Dim sb = New StringBuilder()
					sb.Append(String.Format("Paragraph {0} on page {1}: ", i, pageNo))
					sb.Append(Common.Util.LoremIpsum(1, 2, 4, 5, 10))
					Dim para = sb.ToString()

					tl.Clear()
					tl.DefaultFormat.FontSize = 14
					tl.DefaultFormat.FontBold = False
					tl.MarginTop = y
					tl.Append(para)

					' Draw TextLayout within tagged content:
					g.BeginMarkedContent(New TagMcid("P", i))
					g.DrawTextLayout(tl, PointF.Empty)
					g.EndMarkedContent()

					y += tl.ContentHeight + gap

					' Add content item to paragraph StructElement:
					seParagraph.ContentItems.Add(New McidContentItemLink(i))

					' PDF/A-3 allows embedding files into document, but they should be associated with some document element
					' add embedded file associated with seParagraph:
					Dim ef1 = EmbeddedFileStream.FromBytes(doc, Encoding.UTF8.GetBytes(para))
					' ModificationDate and MimeType should be specified in case of PDF/A:
					ef1.ModificationDate = [date]
					ef1.MimeType = "text/plain"
					Dim fn = String.Format("Page{0}_Paragraph{1}.txt", pageNo, i)
					Dim fs1 = FileSpecification.FromEmbeddedStream(fn, ef1)
					' UnicodeFile.FileName should be specified for PDF/A compliance:
					fs1.UnicodeFile.FileName = fs1.File.FileName
					' Relationship should be specified in case of PDF/A:
					fs1.Relationship = AFRelationship.Unspecified
					doc.EmbeddedFiles.Add(fn, fs1)
					seParagraph.AssociatedFiles.Add(fs1)
				Next i
			Next pageNo

			' PDF/A-3 allows transparency drawing in PDF file, add some:
			Dim gpage = doc.Pages (0).Graphics
			gpage.FillRectangle(New RectangleF(20, 20, 200, 200), Color.FromArgb(40, Color.Red))

			' PDF/A-3 allows using FormXObjects, add one with transparency:
			Dim r = New RectangleF(0, 0, 144, 72)
			Dim fxo = New FormXObject(doc, r)
			Dim gfxo = fxo.Graphics
			gfxo.FillRectangle(r, Color.FromArgb(40, Color.Violet))
			Dim tf As New TextFormat() With {
				.Font = fnt,
				.FontSize = 16,
				.ForeColor = Color.FromArgb(100, Color.Black)
			}
			gfxo.DrawString("FormXObject", tf, r, TextAlignment.Center, ParagraphAlignment.Center)
			gfxo.DrawRectangle(r, Color.Blue, 3)
			gpage.DrawForm(fxo, New RectangleF(300, 250, r.Width, r.Height), Nothing, ImageAlign.ScaleImage)

			' PDF/A-3 allows using embedded files, but each embedded file must be associated with a document's element:
			Dim ef As EmbeddedFileStream = EmbeddedFileStream.FromFile(doc, Path.Combine("Resources", "WordDocs", "ProcurementLetter.docx"))
			' ModificationDate and MimeType should be specified for EmbeddedFile in PDF/A:
			ef.ModificationDate = [date]
			ef.MimeType = "application/msword"
			Dim fs = FileSpecification.FromEmbeddedFile(ef)
			fs.UnicodeFile.FileName = fs.File.FileName
			fs.Relationship = AFRelationship.Unspecified
			doc.EmbeddedFiles.Add("ProcurementLetter.docx", fs)
			' Associate embedded file with the document:
			doc.AssociatedFiles.Add(fs)

			' Add an attachment associated with an annotation:
			Dim sa = New StampAnnotation() With {
				.UserName = "Minerva",
				.Font = fnt,
				.Rect = New RectangleF(300, 36, 220, 72)
			}
			sa.Flags = sa.Flags Or AnnotationFlags.Print
			' Use a FormXObject to represent the stamp annotation:
			Dim stampFxo = New FormXObject(doc, New RectangleF(PointF.Empty, sa.Rect.Size))
			Dim gstampFxo = stampFxo.Graphics
			gstampFxo.FillRectangle(stampFxo.Bounds, Color.FromArgb(40, Color.Green))
			gstampFxo.DrawString("Stamp Annotation" & vbLf & "associated with minerva.jpg", tf, stampFxo.Bounds, TextAlignment.Center, ParagraphAlignment.Center)
			gstampFxo.DrawRectangle(stampFxo.Bounds, Color.Green, 3)
			'
			sa.AppearanceStreams.Normal.Default = stampFxo
			doc.Pages (0).Annotations.Add(sa)
			ef = EmbeddedFileStream.FromFile(doc, Path.Combine("Resources", "Images", "minerva.jpg"))
			ef.ModificationDate = [date]
			ef.MimeType = "image/jpeg"
			fs = FileSpecification.FromEmbeddedFile(ef)
			fs.UnicodeFile.FileName = fs.File.FileName
			fs.Relationship = AFRelationship.Unspecified
			doc.EmbeddedFiles.Add("minerva.jpg", fs)
			sa.AssociatedFiles.Add(fs)

			' Mark the document as conforming to Tagged PDF conventions (required for PDF/A):
			doc.MarkInfo.Marked = True

			' Metadata.CreatorTool and DocumentInfo.Creator should be the same for a PDF/A document:
			doc.Metadata.CreatorTool = doc.DocumentInfo.Creator
			' A title should be specified for PDF/A document:
			doc.Metadata.Title = "GcPdf Document"
			doc.ViewerPreferences.DisplayDocTitle = True

			' Done:
			doc.Save(stream)
		End Sub
	End Class
End Namespace
$vbLabelText   $csharpLabel

GrapeCityPDF no es una biblioteca avanzada para PDFs, tiene un número limitado de características en comparación con IronPDF.

Modelos de Licencia y Precios de IronPDF

Garantía de Devolución de Dinero de 30 Días: Una vez que la licencia se compra, recibirás una garantía de devolución de dinero de 30 días. Si la licencia no se adapta bien a tus necesidades, IronPDF garantizará la devolución de tu dinero dentro de los 30 días.

Integración Fácil: La integración de IronPDF junto a un proyecto en funcionamiento y tu entorno es un proceso sin costuras completado usando una sola línea de código. Esto puede lograrse al integrarse utilizando el método del paquete NuGet o descargándose directamente en línea e integrándose en tu entorno.

Licencias Perpetuas: Cada licencia se compra solo una vez sin requisitos de renovación.

Soporte Gratuito y Actualizaciones de Producto: Cada licencia vendrá con soporte de encasa directamente del equipo detrás del producto y también un año de actualizaciones gratuitas del producto. Es posible comprar extensiones en cualquier momento. Las extensiones pueden verse antes de comprar.

Licencias Inmediatas: Tan pronto como se recibe el pago, se envían las claves de licencia registradas.

Todas las licencias son perpetuas y aplican a desarrollo, y producción.

Demostración de Flujo de Trabajo Bootstrap

Los flujos de trabajo modernos de generación de PDF se benefician de representaciones visuales del proceso. Este ejemplo de Bootstrap 5 demuestra la capacidad de IronPDF para renderizar líneas de tiempo de flujo de trabajo con tarjetas, insignias e indicadores de paso.

using IronPdf;

var renderer = new ChromePdfRenderer();

string workflowTimeline = @"
<!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>
        .timeline-item { position: relative; padding-left: 40px; margin-bottom: 30px; }
        .timeline-item::before { content: ''; position: absolute; left: 0; top: 0; width: 20px; height: 20px;
            background: #0d6efd; border-radius: 50%; border: 3px solid white; box-shadow: 0 0 0 2px #0d6efd; }
        .timeline-item::after { content: ''; position: absolute; left: 9px; top: 20px; width: 2px; height: calc(100% + 10px);
            background: #dee2e6; }
        .timeline-item:last-child::after { display: none; }
        @media print { .timeline-item { page-break-inside: avoid; } }
    </style>
</head>
<body class='bg-light'>
    <div class='container py-4'>
        <div class='text-center mb-5'>
            <h1 class='display-6 fw-bold'>PDF Generation Workflow</h1>
            <p class='lead text-muted'>From HTML to Professional PDF Documents</p>
        </div>

        <div class='timeline-item'>
            <div class='card shadow-sm'>
                <div class='card-body'>
                    <div class='d-flex justify-content-between align-items-center mb-2'>
                        <h4 class='card-title mb-0'>Step 1: Initialize Renderer</h4>
                        <span class='badge bg-primary'>Setup</span>
                    </div>
                    <p class='card-text'>Create ChromePdfRenderer instance with Chrome V8 engine for accurate HTML rendering.</p>
                    <div class='bg-light p-2 rounded'>
                        <code>var renderer = new ChromePdfRenderer();</code>
                    </div>
                    <div class='mt-2'>
                        <small class='text-muted'>✓ Chrome V8 Engine • ✓ Full CSS3 Support • ✓ JavaScript Ready</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='timeline-item'>
            <div class='card shadow-sm'>
                <div class='card-body'>
                    <div class='d-flex justify-content-between align-items-center mb-2'>
                        <h4 class='card-title mb-0'>Step 2: Prepare HTML Content</h4>
                        <span class='badge bg-info'>Content</span>
                    </div>
                    <p class='card-text'>Design your document using modern HTML5, CSS3 (Flexbox/Grid), and optional JavaScript.</p>
                    <div class='row g-2'>
                        <div class='col-4'><span class='badge bg-success w-100'>HTML5</span></div>
                        <div class='col-4'><span class='badge bg-success w-100'>CSS3</span></div>
                        <div class='col-4'><span class='badge bg-success w-100'>JavaScript</span></div>
                    </div>
                </div>
            </div>
        </div>

        <div class='timeline-item'>
            <div class='card shadow-sm'>
                <div class='card-body'>
                    <div class='d-flex justify-content-between align-items-center mb-2'>
                        <h4 class='card-title mb-0'>Step 3: Render to PDF</h4>
                        <span class='badge bg-warning text-dark'>Processing</span>
                    </div>
                    <p class='card-text'>Convert HTML to PDF with pixel-perfect accuracy and sub-second performance.</p>
                    <div class='bg-light p-2 rounded'>
                        <code>var pdf = renderer.RenderHtmlAsPdf(htmlContent);</code>
                    </div>
                    <div class='progress mt-2' style='height: 8px;'>
                        <div class='progress-bar bg-warning' style='width: 100%'></div>
                    </div>
                    <small class='text-muted d-block mt-1'>Average render time: 0.9 seconds</small>
                </div>
            </div>
        </div>

        <div class='timeline-item'>
            <div class='card shadow-sm'>
                <div class='card-body'>
                    <div class='d-flex justify-content-between align-items-center mb-2'>
                        <h4 class='card-title mb-0'>Step 4: Save or Stream</h4>
                        <span class='badge bg-success'>Output</span>
                    </div>
                    <p class='card-text'>Export to file, stream, or byte array for flexible deployment options.</p>
                    <div class='bg-light p-2 rounded'>
                        <code>pdf.SaveAs("document.pdf");</code>
                    </div>
                    <div class='mt-2'>
                        <span class='badge bg-outline-secondary me-1'>File</span>
                        <span class='badge bg-outline-secondary me-1'>Stream</span>
                        <span class='badge bg-outline-secondary'>Byte Array</span>
                    </div>
                </div>
            </div>
        </div>

        <div class='alert alert-info'>
            <strong>Comparison Note:</strong> GrapeCity PDF Viewer focuses on document viewing and annotation, not HTML-to-PDF generation. IronPDF specializes in creating PDFs from modern web content with full Bootstrap and framework support.
        </div>

        <div class='card shadow-sm border-primary'>
            <div class='card-header bg-primary text-white'>
                <h5 class='mb-0'>Key Advantages</h5>
            </div>
            <div class='card-body'>
                <div class='row'>
                    <div class='col-md-6'>
                        <h6 class='text-primary'>IronPDF Strengths</h6>
                        <ul class='small'>
                            <li>Complete HTML-to-PDF workflow</li>
                            <li>Bootstrap 5 framework support</li>
                            <li>Async/await for scalability</li>
                            <li>Cross-platform deployment</li>
                        </ul>
                    </div>
                    <div class='col-md-6'>
                        <h6 class='text-muted'>GrapeCity Focus</h6>
                        <ul class='small'>
                            <li>PDF viewing and annotation</li>
                            <li>UI component for display</li>
                            <li>Limited generation features</li>
                            <li>Viewer-centric approach</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(workflowTimeline);
pdf.SaveAs("workflow-timeline.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

string workflowTimeline = @"
<!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>
        .timeline-item { position: relative; padding-left: 40px; margin-bottom: 30px; }
        .timeline-item::before { content: ''; position: absolute; left: 0; top: 0; width: 20px; height: 20px;
            background: #0d6efd; border-radius: 50%; border: 3px solid white; box-shadow: 0 0 0 2px #0d6efd; }
        .timeline-item::after { content: ''; position: absolute; left: 9px; top: 20px; width: 2px; height: calc(100% + 10px);
            background: #dee2e6; }
        .timeline-item:last-child::after { display: none; }
        @media print { .timeline-item { page-break-inside: avoid; } }
    </style>
</head>
<body class='bg-light'>
    <div class='container py-4'>
        <div class='text-center mb-5'>
            <h1 class='display-6 fw-bold'>PDF Generation Workflow</h1>
            <p class='lead text-muted'>From HTML to Professional PDF Documents</p>
        </div>

        <div class='timeline-item'>
            <div class='card shadow-sm'>
                <div class='card-body'>
                    <div class='d-flex justify-content-between align-items-center mb-2'>
                        <h4 class='card-title mb-0'>Step 1: Initialize Renderer</h4>
                        <span class='badge bg-primary'>Setup</span>
                    </div>
                    <p class='card-text'>Create ChromePdfRenderer instance with Chrome V8 engine for accurate HTML rendering.</p>
                    <div class='bg-light p-2 rounded'>
                        <code>var renderer = new ChromePdfRenderer();</code>
                    </div>
                    <div class='mt-2'>
                        <small class='text-muted'>✓ Chrome V8 Engine • ✓ Full CSS3 Support • ✓ JavaScript Ready</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='timeline-item'>
            <div class='card shadow-sm'>
                <div class='card-body'>
                    <div class='d-flex justify-content-between align-items-center mb-2'>
                        <h4 class='card-title mb-0'>Step 2: Prepare HTML Content</h4>
                        <span class='badge bg-info'>Content</span>
                    </div>
                    <p class='card-text'>Design your document using modern HTML5, CSS3 (Flexbox/Grid), and optional JavaScript.</p>
                    <div class='row g-2'>
                        <div class='col-4'><span class='badge bg-success w-100'>HTML5</span></div>
                        <div class='col-4'><span class='badge bg-success w-100'>CSS3</span></div>
                        <div class='col-4'><span class='badge bg-success w-100'>JavaScript</span></div>
                    </div>
                </div>
            </div>
        </div>

        <div class='timeline-item'>
            <div class='card shadow-sm'>
                <div class='card-body'>
                    <div class='d-flex justify-content-between align-items-center mb-2'>
                        <h4 class='card-title mb-0'>Step 3: Render to PDF</h4>
                        <span class='badge bg-warning text-dark'>Processing</span>
                    </div>
                    <p class='card-text'>Convert HTML to PDF with pixel-perfect accuracy and sub-second performance.</p>
                    <div class='bg-light p-2 rounded'>
                        <code>var pdf = renderer.RenderHtmlAsPdf(htmlContent);</code>
                    </div>
                    <div class='progress mt-2' style='height: 8px;'>
                        <div class='progress-bar bg-warning' style='width: 100%'></div>
                    </div>
                    <small class='text-muted d-block mt-1'>Average render time: 0.9 seconds</small>
                </div>
            </div>
        </div>

        <div class='timeline-item'>
            <div class='card shadow-sm'>
                <div class='card-body'>
                    <div class='d-flex justify-content-between align-items-center mb-2'>
                        <h4 class='card-title mb-0'>Step 4: Save or Stream</h4>
                        <span class='badge bg-success'>Output</span>
                    </div>
                    <p class='card-text'>Export to file, stream, or byte array for flexible deployment options.</p>
                    <div class='bg-light p-2 rounded'>
                        <code>pdf.SaveAs("document.pdf");</code>
                    </div>
                    <div class='mt-2'>
                        <span class='badge bg-outline-secondary me-1'>File</span>
                        <span class='badge bg-outline-secondary me-1'>Stream</span>
                        <span class='badge bg-outline-secondary'>Byte Array</span>
                    </div>
                </div>
            </div>
        </div>

        <div class='alert alert-info'>
            <strong>Comparison Note:</strong> GrapeCity PDF Viewer focuses on document viewing and annotation, not HTML-to-PDF generation. IronPDF specializes in creating PDFs from modern web content with full Bootstrap and framework support.
        </div>

        <div class='card shadow-sm border-primary'>
            <div class='card-header bg-primary text-white'>
                <h5 class='mb-0'>Key Advantages</h5>
            </div>
            <div class='card-body'>
                <div class='row'>
                    <div class='col-md-6'>
                        <h6 class='text-primary'>IronPDF Strengths</h6>
                        <ul class='small'>
                            <li>Complete HTML-to-PDF workflow</li>
                            <li>Bootstrap 5 framework support</li>
                            <li>Async/await for scalability</li>
                            <li>Cross-platform deployment</li>
                        </ul>
                    </div>
                    <div class='col-md-6'>
                        <h6 class='text-muted'>GrapeCity Focus</h6>
                        <ul class='small'>
                            <li>PDF viewing and annotation</li>
                            <li>UI component for display</li>
                            <li>Limited generation features</li>
                            <li>Viewer-centric approach</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(workflowTimeline);
pdf.SaveAs("workflow-timeline.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Salida: Un PDF de línea de tiempo de flujo de trabajo profesional con tarjetas de Bootstrap 5, insignias, barras de progreso y estilo de línea de tiempo personalizado. IronPDF renderiza con precisión todas las posiciones, diseños de flexbox, y clases de utilidad, demostrando soporte CSS3 integral para diseños visuales complejos.

Para compatibilidad detallada del marco Bootstrap, consulta la Guía de CSS Bootstrap & Flexbox.

El Paquete Lite

  • 1 Desarrollador
  • 1 Localización
  • 1 Proyecto
  • Licencia Perpetua

Este paquete permite a un único desarrollador de software en una organización utilizar Iron Software en una ubicación. Iron Software puede ser utilizado en una única aplicación de intranet, aplicación web, o programa de software de escritorio. Está prohibido compartir licencias fuera de una organización o una relación de agencia/cliente, ya que son intransferibles. Este tipo de licencia, como todos los demás tipos de licencia, excluye expresamente todos los derechos no expresamente otorgados bajo el Acuerdo sin redistribución OEM y utilizando el Iron Software como SaaS sin comprar cobertura adicional.

Precios: comienza desde $799 por año.

Licencia Profesional

  • 10 Desarrolladores
  • 10 Localizaciones
  • 10 Proyectos
  • Licencia Perpetua

Esta licencia permite a un número predeterminado de desarrolladores de software en una organización utilizar Iron Software en numerosas ubicaciones, con un máximo de diez. Iron Software puede usarse en tantos sitios web, aplicaciones de intranet o aplicaciones de software de escritorio como desees. Las licencias son intransferibles, por lo tanto, está prohibido compartirlas fuera de una organización o una relación de agencia/cliente. Este tipo de licencia, como todos los demás tipos de licencia, excluye expresamente todos los derechos no otorgados bajo el Acuerdo, incluida la redistribución OEM y utilizando el Iron Software como SaaS sin comprar cobertura adicional. Esta licencia puede integrarse con un único proyecto hasta un máximo de 10.

Precios: Comienza desde $1,199 por año.

Licencia Ilimitada

  • Desarrolladores Ilimitados
  • Localizaciones Ilimitadas
  • Proyectos Ilimitados
  • Licencia Perpetua

Esto te permite tener un número ilimitado de desarrolladores de software en una única organización para utilizar Iron Software en un número ilimitado de ubicaciones. Iron Software puede utilizarse en tantas aplicaciones de intranet, aplicaciones de software de escritorio, o sitios web como desees. Las licencias son intransferibles, y no pueden compartirse fuera de una organización o una relación de agencia/cliente. Este tipo de licencia, como todos los demás tipos de licencia, excluye expresamente todos los derechos no otorgados bajo el Acuerdo, incluida la redistribución OEM y utilizando el Iron Software como SaaS sin comprar cobertura adicional.

Precios: Comienza desde $2999 por año.

Redistribución Libre de Regalías: Esto te permite distribuir el Iron Software como parte de varios productos comerciales empaquetados diferentes (sin tener que pagar regalías) según el número de proyectos cubiertos por la licencia base. Esto permitirá el despliegue de Iron Software dentro de servicios de software SaaS, que se basa en el número de proyectos cubiertos por la licencia base.

Precios: Comienza desde $1599 por año.

Instalación de GrapeCity PDF

Modelos de Licencia y Precios de GrapeCity PDF

Documentos para PDF

  • Incluye 1 Licencia de Desarrollador
  • 1 Localización de Distribución

Este paquete incluye una licencia de desarrollador y solo una localización de distribución sin soporte y mantenimiento.

Precios: Comienza desde $1,199 por año.

Documentos para PDF Unlimited

  • Incluye 1 Licencia de Desarrollador
  • Localizaciones de Distribución Ilimitadas

Este paquete incluye una licencia de desarrollador con localizaciones de distribución ilimitadas. No viene con soporte y mantenimiento. GrapeCity no admite SaaS y OEM.

Precios: Comienza desde $2799 por año.

Documentos para PDF Team Unlimited

  • Incluye 5 Licencias de Desarrollador
  • Localizaciones de Distribución Ilimitadas

Este paquete incluye cinco licencias de desarrollador con localizaciones de distribución ilimitadas sin soporte y mantenimiento. GrapeCity no admite SaaS y OEM.

Precios: Comienza desde $5799 por año.

Comparación de Paquetes PDF de GrapeCity

El paquete IronPDF Lite Un-Desarrollador viene con soporte de 1 año y cuesta alrededor de $799. Mientras que GrapeCity Documents for PDF, incluye un paquete Un-Desarrollador y cuesta $1,199 sin ningún soporte. El Paquete Profesional de IronPDF, incluye el paquete de 10 desarrolladores y viene con un año de soporte, cuesta $1,199. Por otro lado, GrapeCity no tiene un paquete de 10 desarrolladores, solo un paquete de 5 desarrolladores que cuesta $5799.

Los paquetes IronPDF Lite y Profesional tienen servicio SaaS o OEM, y también una opción de soporte de 5 años. El paquete lite un-desarrollador proporciona cinco años de soporte, servicios SaaS y OEM que cuestan $2897 USD. Mientras que GrapeCity no tiene servicio SaaS, OEM, o una opción de soporte de 5 años. El paquete profesional para 10 desarrolladores de Iron viene con soporte de 5 años, servicios Saas y OEM y cuesta $3397 USD. Mientras que GrapeCity no tiene ningún paquete de 10 desarrolladores.

Conclusión

GrapeCity Documents for PDF permite a los desarrolladores exportar/importar, crear AcroForms (Formularios PDF), y ejecutar PDFs en numerosas aplicaciones de escritorio. Con GrapeCity Documents for PDF(GcPdf), estás en el camino de proporcionar soluciones PDF completas a tus clientes.

Recomendamos altamente IronPDF ya que el producto ofrece una mayor precisión. Competidores por igual que realizan funciones similares, pueden encontrar problemas inexactos como la falla al convertir algunas imágenes resultando en caracteres desconocidos. Por otro lado, IronPDF proporciona resultados precisos.

Los paquetes IronPDF ofrecen licencias y soporte competitivo sin costos continuos. IronPDF comienza en $799 con paquetes que incluyen una mayor gama de características. GrapeCity PDF empieza desde $1649 por año. ¡IronPDF también soporta múltiples plataformas a un solo precio!

Si aún no eres cliente de IronPDF, puedes acceder a la prueba gratuita para probar todas las características disponibles. Si compras la suite completa Iron Suite, puedes obtener los cinco productos por el precio de dos. For further details regarding IronPDF licensing, please visit Iron Software's Iron Suite product page to review the complete package information.

Por favor notaGrapeCity Documents for PDF es una marca registrada de su propietario respectivo. Este sitio no está afiliado, respaldado, o patrocinado por GrapeCity Documents for PDF. 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 .NET?

Puede usar el método RenderHtmlAsPdf de IronPDF para convertir cadenas HTML en PDF. Además, puede convertir archivos HTML en PDF utilizando el método RenderHtmlFileAsPdf.

¿Cuáles son los pasos de instalación de una biblioteca de PDF usando NuGet?

Para instalar IronPDF usando NuGet, abra Visual Studio, navegue a 'Administrar paquetes NuGet', busque 'IronPdf' y haga clic en 'Instalar' para agregarlo a su proyecto.

¿Cuáles son algunas alternativas al GrapeCity PDF Viewer para .NET?

IronPDF es una alternativa adecuada al GrapeCity PDF Viewer, proporcionando una experiencia fácil de usar con soporte extenso para .NET Core, .NET 5, Framework y Standard.

¿Cómo creo y leo archivos PDF usando una biblioteca .NET?

Usando IronPDF, puede crear PDFs incluyendo el espacio de nombres IronPdf y usando la clase HtmlToPdf para renderizar HTML como PDF. Para leer PDFs, puede usar la clase PdfDocument para acceder y manipular el contenido.

¿Cuáles son las opciones de licencia disponibles para una biblioteca de PDF?

IronPDF ofrece una variedad de opciones de licencia, incluyendo un Paquete Lite para desarrolladores individuales, una Licencia Profesional para hasta 10 desarrolladores, y una Licencia Ilimitada para equipos, todas con licencias perpetuas y opciones de soporte.

¿Por qué debería elegir IronPDF sobre otras soluciones de PDF?

IronPDF es recomendado por su precisión, funciones completas, licencias competitivas y extensas opciones de soporte. Ofrece soporte para múltiples plataformas a un precio competitivo.

¿Puedo probar una biblioteca PDF antes de comprarla?

Sí, IronPDF ofrece una prueba gratuita que le permite explorar todas las funciones disponibles antes de tomar una decisión de compra. Además, el paquete Iron Suite proporciona acceso a todos los productos de Iron Software a un precio con descuento.

¿Cuáles son algunas desventajas de usar archivos PDF?

Los PDFs pueden ser difíciles de compartir por correo electrónico debido a su tamaño, pueden no mostrarse claramente en dispositivos móviles en comparación con documentos de Word, y requieren software específico para editar o actualizar.

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