Passer au contenu du pied de page
COMPARAISONS DE PRODUITS

Une comparaison entre IronPDF et GrapeCity PDF Viewer

PDF signifie Portable Document Format. C'est un type de fichier qui permet l'affichage conventionnel de tout document sur de nombreux appareils différents. Les PDF sont souvent utilisés pour partager des documents importants tels que des CV avec des employeurs potentiels ou des factures avec des clients.

Malgré sa popularité, il y a aussi quelques inconvénients à utiliser les PDF comme moyen de stockage et de partage de données. Par exemple, les PDF ne peuvent pas être partagés par e-mail car ils doivent d'abord être ouverts dans un lecteur PDF. Même s'ils pouvaient l'être, les PDF n'auraient pas aussi clair qu'un document Word lorsqu'ils sont ouverts sur un téléphone. De plus, les PDF ne peuvent pas être modifiés ou mis à jour comme les documents Word à moins que vous n'ayez un logiciel d'édition installé sur votre ordinateur capable de reconnaître les données dans le fichier et de les convertir de nouveau en forme éditable. Cela signifie que les fichiers PDF peuvent avoir la même apparence lorsque vous les ouvrez, quel que soit l'appareil que vous utilisez - que ce soit un PC ou un Mac. Cela rend les fichiers PDF fiables sur tous les appareils en raison de la norme familière qu'ils mettent en œuvre, qui n'est pas trouvée dans d'autres formats de documents tels que JPEG ou GIF.

Dans cet article, nous examinerons deux bibliothèques PDF .NET :

  • IronPDF
  • GrapeCity PDF

IronPDF

IronPDF est une bibliothèque .NET qui fournit des fonctions de construction pour créer, lire et manipuler des documents PDF avec seulement quelques lignes de code. Le présent article vous montrera comment créer des fichiers PDF avec IronPDF. Le contenu se base sur l'hypothèse que vous avez une compréhension des bases de Visual Studio ou C#, et que vous possédez une connaissance pratique du HTML.

Nous avons besoin de Visual Studio pour écrire, compiler et exécuter notre application, de C# pour écrire la logique et le code, et de HTML pour formater les fichiers PDF, y compris ajouter des titres, des en-têtes, des images, des paragraphes, etc. La bibliothèque IronPDF prend en charge la totalité de .NET Core, .NET 5, Framework et Standard.

Nous pouvons créer un fichier PDF en C# avec seulement quelques lignes de code. C'est une tâche simple avec une connaissance de base de C# et de HTML. En savoir plus sur IronPDF en visitant leur site officiel sur les fonctionnalités d'IronPDF.

Installation d'IronPDF

Développer une solution nécessite l'installation du paquet NuGet pour IronPDF. Cliquez sur "Projet" directement à partir de la barre de menu. Une liste déroulante apparaîtra. Sélectionnez "Gérer les paquets NuGet" dans le menu déroulant et sélectionnez-le. Une fenêtre comme celle-ci s'affichera :

class="content-img-align-center"> Grapecity Pdf Viewer Alternatives 1 related to Installation d'IronPDF

class="content__image-caption">

Sélectionnez l'onglet "Parcourir", et la fenêtre suivante comme celle-ci apparaîtra :

class="content-img-align-center"> Grapecity Pdf Viewer Alternatives 2 related to Installation d'IronPDF

class="content__image-caption">

Tapez 'IronPdf' dans la zone de recherche et appuyez sur "Entrée". La fenêtre résultante devrait apparaître :

class="content-img-align-center"> Grapecity Pdf Viewer Alternatives 3 related to Installation d'IronPDF

class="content__image-caption">

Sélectionnez IronPDF :

class="content-img-align-center"> Comment créer un fichier PDF en C# avec Ironpdfile

class="content__image-caption">Comment créer un fichier PDF en C# avec Ironpdfile

Sélectionnez le bouton 'Installer'. La fenêtre résultante émergera après une installation réussie :

class="content-img-align-center"> Grapecity Pdf Viewer Alternatives 5 related to Installation d'IronPDF

class="content__image-caption">

Une fois que vous appuyez sur le bouton 'OK', vous êtes prêt à partir.

Création d'un PDF

Ajoutez l'espace de noms IronPdf en haut du fichier.

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

Le véritable travail commence à partir de ce point. Nous avons besoin d'un chemin de fichier afin de stocker le document PDF construit. Pour ce faire, nous utilisons SaveFileDialog, qui invite l'utilisateur à choisir un nom de fichier et un chemin de fichier.

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 devrait ouvrir une boîte de dialogue de fichier qui vous permettra de sélectionner le dossier et le nom de fichier à l'endroit où vous souhaitez construire un document PDF. Le répertoire initial est défini sur le lecteur D, mais vous pouvez choisir de le définir sur n'importe quel. Comme nous ne traitons que des fichiers PDF, l'extension par défaut a été définie sur fichiers PDF.

Dans la condition "if", le code réel qui créera le fichier PDF est inséré. Nous pouvons maintenant voir que nous avons réussi à générer un fichier PDF avec seulement deux lignes de code. PdfText est le nom d'une boîte de texte enrichi qui contient le texte qui sera écrit dans un document PDF. Le nom de fichier est le chemin et le nom de fichier qui a été sélectionné via la méthode SaveFileDialog.

Lecture des PDFs

Vous pourriez penser que le code pour lire les fichiers PDF sera complexe et difficile à écrire/comprendre, mais ne vous inquiétez pas, IronPDF l'a rendu plus facile et plus simple. Ce processus ne nécessite que deux lignes de code pour y parvenir !

Ajoutez le code suivant pour importer la bibliothèque IronPdf en haut du fichier.

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

Écrivez le code suivant à l'intérieur de la fonction.

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

Cela extraira toutes les informations de la source de données vers le visualiseur de documents. Tous les composants de reporting utiliseront cette donnée comme source de donnée.

Fonctionnalités de GrapeCity PDF

GrapeCity Documents est un système de gestion de documents inter-plateformes pour fournir une solution de document, éditeur et lecteur universel pour tous les formats de documents courants. Sans avoir besoin d'un programme supplémentaire comme Adobe Acrobat, la bibliothèque riche fournie par .NET Standard 2.0 peut être utilisée pour lire, générer, modifier et enregistrer des fichiers PDF. Il possède un ensemble de fonctionnalités robustes qui permet aux développeurs de créer des fichiers PDF incluant une prise en charge avancée des polices, des photos, des graphiques, des codes-barres, des commentaires, des contours, des tampons, des filigranes, et plus encore.

Manipuler les PDFs

Dans les applications .NET Standard, vous pouvez utiliser GrapeCityPDF pour produire des documents PDF avec des besoins commerciaux simples ou compliqués. De plus, vous pouvez charger, changer et enregistrer des PDFs de n'importe quelle source.

Enregistrer le PDF en tant qu'image

Vous pouvez enregistrer un PDF comme une image sans sacrifier la qualité de l'image en utilisant GrapeCityPDF. De plus, vous pouvez utiliser seulement quelques lignes de code pour implémenter cette fonctionnalité.

Visionneuse de PDF

GrapeCity Documents PDF Viewer est un visualisateur côté client basé sur la programmation léger pour afficher des fichiers PDF. Beaucoup des capacités habituelles des PDFs sont prises en charge.

Grand nombre de fonctionnalités

La bibliothèque GrapeCityPDF a de nombreuses capacités qui vous permettent de créer des documents PDF compliqués contenant des informations telles que du texte, des graphiques, des photos, des annotations, des contours, et plus encore.

Installations

Il existe deux méthodes pour installer GrapeCity.

  1. Sélectionnez le bouton télécharger les fichiers source compressés pour télécharger les sources d'échantillon actuelles.
  2. Extrayez les fichiers directement du zip téléchargé dans un répertoire sur votre ordinateur.
  3. Naviguez vers ce répertoire.
  4. Exécutez le fichier batch run.cmd. Cela reconstruira les sources d'échantillon. Démarrez le service SupportApi et ouvrez l'URL http://localhost:3003 dans votre navigateur par défaut.
  5. Pour plus d'informations, consultez le readme.MD, inclus dans le zip téléchargé.

Installation de l'édition WinForms

Le sujet ci-dessous discute de la procédure d'installation de l'édition WinForms. Les étapes suivantes fournissent les instructions pour installer l'édition WinForms :

  • Download the C1ControlPanel from GrapeCity's ComponentOne to install the latest edition of WinForms.
  • Ouvrez le Panneau de contrôle en utilisant ComponentOneC1ControlPanel.exe. Toutes les instances en cours de Visual Studio doivent être fermées.
  • Un utilisateur existant peut se connecter en utilisant l'adresse e-mail enregistrée et le mot de passe.
  • Si vous êtes un nouvel utilisateur :
    • Inscrivez-vous auprès de Component One et créez un compte en remplissant les champs requis.
    • Une vérification sera envoyée à votre adresse e-mail.
    • Activez votre adresse e-mail en visitant le lien de vérification.
    • Si vous ne souhaitez pas vous connecter ou vous inscrire, vous pouvez procéder en tant qu'utilisateur anonyme.
  • Dans la tuile de l'édition WinForms, sélectionnez Installer. L'installation de toutes les éditions peut être réalisée en sélectionnant la case à cocher contre Toutes les éditions. Sélectionnez le bouton Voir plus pour en savoir plus sur l'édition.
class="content-img-align-center"> Installation de GrapeCity PDF

class="content__image-caption">

  • Une fois que vous cliquez sur Installer, une page affichera l'accord de licence vous demandant de le revoir avant de cliquer sur le bouton Accepter l'accord de licence.
  • Une fois que vous acceptez l'accord de licence, une page conséquente apparaîtra avec les boutons de changement de paramètres et de chemin du répertoire. Sélectionnez l'invite Accepter les paramètres pour vérifier le chemin du répertoire et commencer le processus d'installation.
class="content-img-align-center"> Installation de GrapeCity PDF

class="content__image-caption">

  • L'installateur installe les contrôles et affiche sa progression en le faisant. Vous ne pourrez pas annuler le processus d'installation tant que cet écran est affiché.
  • Une fois que les contrôles sont installés, l'écran « Succès de l'installation » s'affichera. La version actuellement installée sera affichée dans l'édition respective.
  • L'installateur installe les contrôles et affiche sa progression en le faisant. Vous ne pourrez pas annuler le processus d'installation tant que cet écran est affiché.
class="content-img-align-center"> Installation de GrapeCity PDF

class="content__image-caption">

  • Une fois que les contrôles sont installés, l'écran « Succès de l'installation » s'affichera. La version actuellement installée sera affichée dans l'édition respective.
class="content-img-align-center"> Installation de GrapeCity PDF

class="content__image-caption">

Création d'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 n'est pas une bibliothèque avancée pour les PDFs - elle a un nombre limité de fonctionnalités par rapport à IronPDF.

Modèles de licence IronPDF et tarification

La garantie de remboursement de 30 jours : Une fois la licence achetée, vous bénéficierez d'une garantie de remboursement de 30 jours. Si la licence n'est pas bien adaptée à vos besoins, IronPDF vous garantit le remboursement dans les 30 jours.

Intégration facile: L'intégration d'IronPDF avec un projet en cours et votre environnement est un processus sans faille complété en utilisant une seule ligne de code. Cela peut être réalisé lors de l'intégration en utilisant la méthode du paquet NuGet ou téléchargé directement en ligne et intégré à votre environnement.

Licensing perpétuel : Chaque licence est achetée une seule fois sans renouvellement requis.

Support gratuit et mises à jour de produit: Chaque licence sera accompagnée d'un support de la maison directement de l'équipe derrière le produit et aussi d'une année de mises à jour gratuites du produit. Il est possible d'acheter des extensions à tout moment. Les extensions peuvent être consultées avant l'achat.

Licenses instantanées: Dès que le paiement est reçu, des clés de licence enregistrées sont envoyées.

Toutes les licences sont perpétuelles et s'appliquent à la mise en scène, au développement et à la production.

Démo de flux de travail Bootstrap

Les flux de travail de génération de PDF modernes bénéficient de représentations de processus visuelles. Cet exemple de Bootstrap 5 démontre la capacité d'IronPDF à rendre des chronologies de flux de travail avec des cartes, des badges et des indicateurs de phase.

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

Sortie : Une chronologie de flux de travail PDF professionnelle avec des cartes, des badges, des barres de progression et un style de chronologie personnalisé de Bootstrap 5. IronPDF rend avec précision tous les positionnements, mises en page flexbox et classes utilitaires, démontrant une prise en charge CSS3 complète pour des conceptions visuelles complexes.

Pour connaître la compatibilité du framework Bootstrap, voir le Guide Bootstrap & Flexbox CSS.

Le package Lite

  • 1 développeur
  • 1 lieu
  • 1 projet
  • Licence perpétuelle

Ce package permet à un seul développeur logiciel dans une organisation d'utiliser Iron Software dans un seul lieu. Iron Software peut être utilisé dans une seule application intranet, application web ou programme logiciel de bureau. Il est interdit de partager les licences en dehors d'une organisation ou d'une relation agence/client car elles sont non transférables. Ce type de licence, comme tous les autres types de licences, exclut expressément tous les droits non expressément accordés en vertu de l'accord, sauf redistribution OEM et utilisation de l'Iron Software en tant que SaaS sans achat de couverture supplémentaire.

Tarification: à partir de $799 par an.

Licence professionnelle

  • 10 développeurs
  • 10 lieux
  • 10 projets
  • Licence perpétuelle

Cette licence permet à un nombre prédéterminé de développeurs de logiciels dans une organisation d'utiliser Iron Software dans de nombreux lieux, jusqu'à un maximum de dix. Iron Software peut être utilisé dans autant de sites web, applications intranet ou applications logicielles de bureau que vous le souhaitez. Les licences sont non transférables, il est donc interdit de les partager en dehors d'une organisation ou d'une relation agence/client. Ce type de licence, comme tous les autres types de licences, exclut expressément tous les droits non expressément accordés en vertu de l'accord, y compris la redistribution OEM et l'utilisation de l'Iron Software en tant que SaaS sans achat de couverture supplémentaire. Cette licence peut être intégrée à un projet unique jusqu'à un maximum de 10.

Tarification : À partir de $1,199 par an.

Licence illimitée

  • Développeurs illimités
  • Lieux illimités
  • Projets illimités
  • Licence perpétuelle

Cela vous permet de disposer d'un nombre illimité de développeurs de logiciels dans une seule organisation pour utiliser Iron Software dans un nombre illimité de lieux. Iron Software peut être utilisé dans autant d'applications intranet, applications logicielles de bureau ou sites web que vous le souhaitez. Les licences sont non transférables et ne peuvent pas être partagées en dehors d'une organisation ou d'une relation agence/client. Ce type de licence, comme tous les autres types de licences, exclut expressément tous les droits non accordés en vertu de l'accord, y compris la redistribution OEM et l'utilisation de l'Iron Software comme SaaS sans achat de couverture supplémentaire.

Tarification: À partir de 2999 $ par an.

Redistribution sans redevances : Cela vous permet de distribuer l'Iron Software en tant que partie de plusieurs produits commerciaux emballés différemment (sans avoir à payer de redevances) en fonction du nombre de projets couverts par la licence de base. Cela permettra le déploiement d'Iron Software au sein des services de logiciels SaaS, qui est basé sur le nombre de projets couverts par la licence de base.

Tarification: À partir de 1599 $ par an.

class="content-img-align-center"> Installation de GrapeCity PDF

class="content__image-caption">

Modèles de licence GrapeCity PDF et tarification

Documents pour PDF

  • Inclut 1 licence développeur
  • 1 lieu de distribution

Ce package inclut une licence développeur et un seul lieu de distribution sans support et maintenance.

Tarification : à partir de $1,199 par an.

Documents pour PDF Unlimited

  • Inclut 1 licence développeur
  • Lieux de distribution illimités

Ce package inclut une licence développeur avec des lieux de distribution illimités. Il n'est pas livré avec le support et la maintenance. GrapeCity ne prend pas en charge le SaaS et l'OEM.

Tarification: à partir de 2799 $ par an.

Documents pour PDF Team Unlimited

  • Inclut 5 licences développeur
  • Lieux de distribution illimités

Ce package inclut cinq licences développeur avec des lieux de distribution illimités sans support et maintenance. GrapeCity ne prend pas en charge le SaaS et l'OEM.

Tarification : à partir de 5799 $ par an.

class="content-img-align-center"> Comparaison des packages GrapeCity PDF

class="content__image-caption">

Le forfait IronPDF Lite Un développeur est livré avec un support d'un an et coûte environ $799. Alors que GrapeCity Documents pour PDF, inclut un forfait Un développeur et coûte $1,199 sans aucun support. Le forfait Professionnel d'IronPDF, inclut le forfait 10 développeurs et est livré avec un an de support, coûte $1,199. D'autre part, GrapeCity n'a pas de forfait 10 développeurs - avec seulement un forfait 5 développeurs qui coûte 5799 $.

Les forfaits IronPDF Lite et Professionnel ont un service SaaS ou OEM, et également une option de support de 5 ans. Le forfait un développeur Lite offre cinq ans de support, SaaS et services OEM, qui coûtent 2897 USD. Alors que GrapeCity n'a pas de service SaaS, OEM ou d'option de support de 5 ans. Le forfait professionnel 10 développeurs d'IronPDF est livré avec un support de 5 ans, Saas et services OEM et coûte 3397 USD. Tandis que GrapeCity n'a pas de forfait 10 développeurs.

Conclusion

GrapeCity Documents pour PDF permet aux développeurs d'exporter/importer, de créer des AcroForms (Formulaires PDF) et d'exécuter des PDFs sur de nombreuses applications de bureau. AvecGrapeCity Documents for PDF (GcPdf), vous êtes en bonne voie pour fournir des solutions PDF complètes à vos clients.

Nous recommandons fortement IronPDF car le produit offre une plus grande précision. Les concurrents qui effectuent des fonctions similaires peuvent rencontrer des problèmes d'inexactitude, tels que l'échec de la conversion de certaines images entraînant des caractères inconnus. En revanche, IronPDF fournit des résultats précis.

Les packages IronPDF offrent une licence et un support concurrentiels sans frais continus. IronPDF commence à $799 avec des packages incluant une plus grande gamme de fonctionnalités. GrapeCity PDF commence à 1649 $ par an. IronPDF prend également en charge plusieurs plateformes à un seul prix !

Si vous n'êtes pas encore un client d'IronPDF, vous pouvez accéder à l'essai gratuit pour découvrir toutes les fonctionnalités disponibles. Si vous achetez l'Iron Suite complète, vous pouvez obtenir les cinq produits pour le prix de deux. For further details regarding IronPDF licensing, please visit Iron Software's Iron Suite product page to review the complete package information.

Veuillez noterGrapeCity Documents pour PDF est une marque déposée de son propriétaire respectif. Ce site n'est pas affilié à, approuvé par ou parrainé par GrapeCity Documents pour PDF. Tous les noms de produits, logos et marques sont la propriété de leurs propriétaires respectifs. Les comparaisons sont à des fins d'information uniquement et reflètent les informations disponibles publiquement au moment de la rédaction.

Questions Fréquemment Posées

Comment puis-je convertir du HTML en PDF en .NET ?

Vous pouvez utiliser la méthode RenderHtmlAsPdf d'IronPDF pour convertir des chaînes HTML en PDFs. De plus, vous pouvez convertir des fichiers HTML en PDFs en utilisant la méthode RenderHtmlFileAsPdf.

Quelles sont les étapes d'installation pour une bibliothèque PDF utilisant NuGet ?

Pour installer IronPDF en utilisant NuGet, ouvrez Visual Studio, naviguez vers 'Gérer les packages NuGet', recherchez 'IronPdf', et cliquez sur 'Installer' pour l'ajouter à votre projet.

Quelles sont les alternatives au visualiseur PDF GrapeCity pour .NET ?

IronPDF est une alternative appropriée au visualiseur PDF GrapeCity, offrant une expérience conviviale avec un support étendu pour .NET Core, .NET 5, Framework, et Standard.

Comment puis-je créer et lire des fichiers PDF en utilisant une bibliothèque .NET ?

En utilisant IronPDF, vous pouvez créer des PDFs en incluant l'espace de noms IronPdf et en utilisant la classe HtmlToPdf pour rendre du HTML en PDF. Pour lire des PDFs, vous pouvez utiliser la classe PdfDocument pour accéder et manipuler le contenu.

Quelles sont les options de licence disponibles pour une bibliothèque PDF ?

IronPDF propose une gamme d'options de licence, y compris un package Lite pour développeurs uniques, une licence professionnelle pour jusqu'à 10 développeurs, et une licence illimitée pour les équipes, toutes avec des options de licence perpétuelle et de support.

Pourquoi devrais-je choisir IronPDF par rapport à d'autres solutions PDF ?

IronPDF est recommandé pour sa précision, ses fonctionnalités complètes, sa licence compétitive, et ses vastes options de support. Il offre un support pour plusieurs plateformes à un prix compétitif.

Puis-je essayer une bibliothèque PDF avant de l'acheter ?

Oui, IronPDF propose un essai gratuit qui vous permet d'explorer toutes les fonctionnalités disponibles avant de prendre une décision d'achat. De plus, le package Iron Suite offre un accès à tous les produits Iron Software à un tarif réduit.

Quels sont les inconvénients de l'utilisation des fichiers PDF ?

Les PDFs peuvent être difficiles à partager par email en raison de leur taille, peuvent ne pas s'afficher clairement sur les appareils mobiles par rapport aux documents Word, et nécessitent un logiciel spécifique pour être édités ou mis à jour.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite