푸터 콘텐츠로 바로가기
제품 비교

IronPDF vs GrapeCity PDF: A .NET PDF Library Comparison

IronPDF specializes in HTML-to-PDF generation with Chrome V8 rendering engine for .NET applications, while GrapeCity PDF focuses on PDF viewing and annotation features, making IronPDF the superior choice for developers needing complete PDF creation capabilities with modern web content support.

PDF stands for Portable Document Format. It is a file type that allows conventional viewing of documents on many different devices. PDFs are often used to share important documents such as resumes with potential employers or invoices with clients.

Despite its popularity, PDFs have some limitations. For instance, you cannot share PDFs via email without recipients needing a PDF reader. PDFs may not display clearly on mobile devices like Word documents would. Additionally, PDFs require editing software to modify or update content, unlike Word documents. However, PDF files maintain consistent appearance across all devices—whether PC or Mac. This reliability makes PDFs a standard format not found in other document types like JPEG or GIF.

In this article, we will review two .NET PDF libraries:

  • IronPDF
  • GrapeCity PDF

What Is IronPDF and How Does It Compare to GrapeCity?

IronPDF is a .NET library providing functions for creating, reading, and manipulating PDF documents with minimal code. This article demonstrates how to create PDF files with IronPDF. You need basic understanding of Visual Studio or C# and working knowledge of HTML.

You require Visual Studio for writing, compiling, and running applications, C# for logic and code, and HTML for formatting PDF files including titles, headings, images, and paragraphs. IronPDF fully supports .NET Core, .NET 5, Framework, and Standard. For ASP.NET applications, IronPDF provides smooth integration for converting web pages to PDFs.

You can create PDF files in C# with minimal code given basic C# and HTML knowledge. Learn more by visiting the official IronPDF features page. For programmatic PDF creation, IronPDF offers extensive capabilities beyond basic HTML conversion.

How Do I Install IronPDF in My .NET Project?

Developing solutions requires installing the IronPDF NuGet Package. Click "Project" from the Menu Bar. Select "Manage NuGet Packages" from the dropdown menu. For detailed instructions, see the installation overview. This window will display:

NuGet Package Manager window in Visual Studio showing no search results for IronPdf package

The NuGet Package Manager interface displaying an empty search result when searching for IronPdf, indicating the package may not be available or there may be connectivity issues

Select "Browse" to see this window:

NuGet Package Manager interface in Visual Studio showing popular .NET packages including Entity Framework Core, Newtonsoft.Json, and Microsoft.Extensions.`DependencyInjection` with their version numbers and download counts.

The NuGet Package Manager provides easy access to essential .NET libraries, with Entity Framework Core and Newtonsoft.Json being among the most popular packages for database operations and JSON handling respectively.

Type 'IronPdf' in the search box and press "Enter." For advanced installation options, including platform-specific configurations, check the documentation. You should see:

NuGet Package Manager showing search results for IronPDF packages, including the main IronPDF library with 1.87M downloads and related rendering assets packages.

The NuGet Package Manager interface displays various IronPDF packages available for installation, with download counts and version numbers visible for each package.

Select IronPDF:

NuGet Package Manager showing IronPDF installation options alongside competing PDF libraries including PDFCore and other IronPDF rendering packages

The NuGet Package Manager interface displays IronPDF (version 2021.3.1) as the selected package for installation, with alternative PDF libraries listed for comparison including PDFCore and various IronPDF rendering assets.

Click 'Install'. After successful installation, you will see:

Visual Studio dialog showing IronPDF package installation with dependencies including IronPdf.2021.3.1 and related packages.

IronPDF installation process in Visual Studio, showing the NuGet package manager installing IronPDF version 2021.3.1 along with its dependencies

Press 'OK' to complete installation. IronPDF supports Windows platforms including Windows 10, 11, and Server versions. The library also supports Linux and macOS for cross-platform development.

How Do I Create PDFs with IronPDF?

Add the IronPdf namespace at the file top. For VB.NET developers, similar functionality is available:

using IronPdf;
using IronPdf;
$vbLabelText   $csharpLabel

You need a file path to store the constructed PDF. Use SaveFileDialog to prompt users for file name and path. For advanced scenarios, export PDFs to memory streams without disk saving:

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!");
    }
}
$vbLabelText   $csharpLabel

SaveFileDialog opens a dialog for selecting folder and filename. Initial Directory defaults to D drive but you can change it. DefaultExtension is set to PDF. For complete conversion options, explore the HTML to PDF tutorial.

The "if" condition contains code creating the PDF. You generate PDFs with just two lines of code. PdfText is the Rich Text box name containing PDF content. Filename is the selected file path from SaveFileDialog. For web applications, IronPDF supports URL to PDF conversion and ASPX to PDF conversion.

How Do I Read PDFs with IronPDF?

Reading PDF files requires only two lines of code with IronPDF. For advanced extraction, see the extract text and images guide.

Add these imports:

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

Write this code inside your function. IronPDF provides PDF parsing capabilities and PDF DOM access:

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();
}
$vbLabelText   $csharpLabel

This extracts all information from documents to viewers. Reporting components use this data as sources. IronPDF supports reading PDFs from memory streams and converting PDFs to HTML for web display.

What Features Does GrapeCity PDF Offer?

GrapeCity Documents provides cross-platform document management for common formats. The .NET Standard 2.0 library reads, generates, modifies, and saves PDFs without Adobe Acrobat. It offers font support, images, graphics, barcodes, comments, outlines, stamps, and watermarks.

What PDF Manipulation Capabilities Are Available?

GrapeCityPDF creates PDFs for basic or complex business needs in .NET Standard apps. You can load, change, and save PDFs from any source. IronPDF offers complete PDF editing including merging/splitting PDFs, adding/removing pages, and rotating pages.

Can I Convert PDFs to Images?

GrapeCityPDF saves PDFs as images without quality loss using minimal code. IronPDF provides the rasterize PDF to images feature supporting PNG, JPEG, and TIFF formats.

Does GrapeCity Include a PDF Viewer Component?

GrapeCity Documents PDF Viewer is a lightweight client-side viewer supporting standard PDF features. For .NET MAUI developers, IronPDF offers PDF viewing in MAUI applications with navigation and search functionality.

What Types of Features Are Supported?

GrapeCityPDF creates complex PDFs with text, graphics, photos, annotations, and outlines. IronPDF extends these with digital signatures, form creation/filling, watermarking, and metadata management.

How Do I Install GrapeCity PDF?

Two installation methods exist. For containerized deployment, IronPDF offers Docker support and remote container operation for flexible generation:

  1. Download the zipped source files.
  2. Extract files to a directory.
  3. Go to to that directory.
  4. Execute run.cmd to build samples, start SupportApi service, and open http://localhost:3003.
  5. See readme.MD for details.

How Do I Install the WinForms Edition?

Follow these steps for WinForms Edition installation:

  • Download C1ControlPanel from GrapeCity's ComponentOne.
  • Open ControlPanel with ComponentOneC1ControlPanel.exe (close Visual Studio).
  • Log in with registered email/password.
  • For new users:
    • Register and create account.
    • Verify email address.
    • Activate via verification link.
    • Proceed as anonymous user if preferred.
  • Select Install in WinForms Edition tile. Install all editions via All Editions checkbox.
`ComponentOne` product edition comparison showing six different editions including `WinForms`, WPF, MVC, MVC Core, Wijmo, and UWP editions with their descriptions and install options

`GrapeCity`'s `ComponentOne` offers multiple edition options tailored to different development platforms and frameworks, each with the option to install sample projects

  • Click Install to view License Agreement. Accept after review.
  • Accept License Agreement to see Settings page. Verify directory path and begin installation.
`ComponentOne` installation settings screen showing installation directory, samples directory, and options to join customer experience program and send system information

`ComponentOne` installation configuration screen with privacy and data collection options

  • Installer displays progress during control installation. Cannot cancel during this process.
  • "Installation Success" screen appears when complete. Shows currently installed version.
`WinForms` Edition installation dialog showing download progress and install button for 65+ UI controls

The `WinForms` Edition installer interface displays a simple download progress bar and installation option for a suite of 65+ smart and effective UI controls designed for rapid Windows Forms development.

`ComponentOne` installation success screen showing version 20183.1.338 with View Log and Back buttons

The `ComponentOne` installation interface displays a successful installation message for version 20183.1.338, featuring navigation tabs for Products, Activities, License, and Support

How Do I Create PDFs with GrapeCity?

The following code demonstrates basic GrapeCity PDF creation. For advanced features like HTML-to-PDF with JavaScript, responsive CSS, or custom headers/footers, IronPDF provides complete solutions:

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);
        }
    }
}
$vbLabelText   $csharpLabel

GrapeCityPDF offers limited features compared to IronPDF. IronPDF supports PDF/A compliance, PDF/UA accessibility, custom paper sizes, and advanced rendering options.

What Are IronPDF's License Models and Pricing?

The 30-Day Money-Back Guarantee: Once the license is purchased, you will receive a 30-day money-back guarantee. If the license is not well suited to your needs, IronPDF will guarantee your money back within 30 days.

Easy Integration: The integration of IronPDF alongside a working project and your environment is a seamless process completed using a single line of code. This can be achieved when integrating using the NuGet Package method or downloaded directly online and integrated into your environment.

Perpetual Licensing: Every license is purchased only once with no renewal requirements.

Free Support and Product Updates: Each license will come with round of house support directly from the team behind the product and also a year of free product updates. It is feasible to buy extensions at any point. Extensions can be viewed prior to purchase.

Immediate Licenses: As soon as payment is received, registered license keys are sent out.

All licenses are perpetual for staging, development, and production.

How Does IronPDF Support Modern Web Frameworks Like Bootstrap?

Modern PDF generation benefits from visual process representations. This Bootstrap 5 example demonstrates IronPDF's capability to render workflow timelines with cards, badges, and step indicators. For complete framework support, see the Bootstrap & Flexbox troubleshooting guide:

using IronPdf;

var renderer = new ChromePdfRenderer();

string workflowTimeline = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <link href='___PROTECTED_URL_66___ 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>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>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>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>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>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>Key Advantages</h5>
            </div>
            <div class='card-body'>
                <div class='row'>
                    <div class='col-md-6'>
                        <h6>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>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='___PROTECTED_URL_66___ 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>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>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>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>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>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>Key Advantages</h5>
            </div>
            <div class='card-body'>
                <div class='row'>
                    <div class='col-md-6'>
                        <h6>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>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");
$vbLabelText   $csharpLabel

Output: A professional workflow timeline PDF with Bootstrap 5 cards, badges, progress bars, and custom timeline styling. IronPDF accurately renders all positioning, flexbox layouts, and utility classes, demonstrating comprehensive CSS3 support for complex visual designs.

For detailed Bootstrap compatibility, see the Bootstrap & Flexbox CSS Guide. IronPDF supports web fonts and icons for rich typography.

What Is the Lite Package Pricing?

  • 1 Developer
  • 1 Location
  • 1 Project
  • Perpetual License

This package allows one developer to use Iron Software in one location for a single application. Licenses are non-transferable outside organizations or agency/client relationships. Excludes OEM redistribution and SaaS use without additional coverage.

Pricing: starts from $799 per year.

What Does the Professional License Include?

  • 10 Developers
  • 10 Locations
  • 10 Projects
  • Perpetual License

This license allows ten developers to use Iron Software in up to ten locations. You can use it in unlimited websites, intranet applications, or desktop software. Licenses are non-transferable outside organizations. Excludes OEM redistribution and SaaS use without additional coverage. Integrates with up to 10 projects.

Pricing: Starts from $1,199 per year.

What Are the Benefits of an Unlimited License?

  • Unlimited Developers
  • Unlimited Locations
  • Unlimited Projects
  • Perpetual License

Enables unlimited developers in one organization to use Iron Software in unlimited locations. Use in unlimited applications. Licenses are non-transferable outside organizations. Excludes OEM redistribution and SaaS use without additional coverage.

Pricing: Starts from $2999 per year.

Royalty-Free Redistribution: This allows you to distribute the Iron Software as part of several differently packaged commercial products (without having to pay royalties) based on the number of projects covered by the base license. This will allow the deployment of Iron Software within SaaS software services, which is based on the number of projects covered by the base license.

Pricing: Starts from $1599 per year.

IronPDF pricing tiers comparison showing Lite ($499), Professional ($999), and Unlimited ($2,999) licenses with different developer, location, and project limits

IronPDF offers three license tiers with the Professional license highlighted as 'Most Popular', featuring 10 developers, 10 locations, and 10 projects for $999

What Are GrapeCity PDF's License Models and Pricing?

What Does the Documents for PDF License Include?

  • Includes 1 Developer License
  • 1 Distribution Location

Includes one developer license and one distribution location without support and maintenance.

Pricing: Starts from $1,199 per year.

What Is Documents for PDF Unlimited?

  • Includes 1 Developer License
  • Unlimited Distribution Locations

Includes one developer license with unlimited distribution locations. No support and maintenance. GrapeCity doesn't support SaaS and OEM.

Pricing: Starts from $2799 per year.

What Does Documents for PDF Team Unlimited Offer?

  • Includes 5 Developer Licenses
  • Unlimited Distribution Locations

Includes five developer licenses with unlimited distribution locations. No support and maintenance. GrapeCity doesn't support SaaS and OEM.

Pricing: Starts from $5799 per year.

Three pricing tiers for Documents for PDF software: basic at $999 per developer, Unlimited at $2799, and Team Unlimited at $5799, each with different license and distribution options.

`GrapeCity`'s Documents for PDF pricing structure offers three tiers to accommodate different development team sizes and distribution needs.

IronPDF Lite One-Developer package includes 1-year support for $799. GrapeCity Documents for PDF One-Developer package costs $1,199 without support. IronPDF Professional Package includes 10 developers with one-year support for $1,199. GrapeCity offers only a 5-developer package for $5799. For more information about IronPDF licensing options, visit the official licensing page.

IronPDF Lite and Professional packages include SaaS service, OEM, and 5-year support options. The Lite one-developer package with five years support, SaaS, and OEM costs $2897. GrapeCity doesn't offer SaaS, OEM, or 5-year support. The Iron Professional 10-developer package with 5-year support, SaaS, and OEM costs $3397. GrapeCity lacks a 10-developer option. Learn about license extensions and upgrade options for long-term support.

Which PDF Library Should I Choose for My .NET Project?

GrapeCity Documents for PDF allows export/import, AcroForms creation, and PDF execution in desktop applications. However, for complete PDF manipulation including form creation, digital signatures, and annotation support, IronPDF offers advanced features.

IronPDF provides greater accuracy. Competitors can encounter issues like failed image conversion or unknown characters. IronPDF delivers accurate results. The Chrome rendering engine ensures pixel-perfect rendering, verified using the pixel-perfect HTML to PDF guide. For optimization, see the IronPDF performance assistance guide.

IronPDF offers competitive licensing and support without ongoing costs. IronPDF starts at $799 with complete feature packages. GrapeCity PDF starts at $1649 per year. IronPDF supports multiple platforms at one price. For enterprise deployments, IronPDF provides async and multithreading capabilities for high-performance generation.

You can access the free trial to explore all features. Purchasing the complete Iron Suite provides five products for the price of two. For details about IronPDF licensing, visit Iron Software's Iron Suite product page for complete package information.

참고해 주세요GrapeCity Documents for PDF is a registered trademark of its respective owner. This site is not affiliated with, endorsed by, or sponsored by GrapeCity Documents for PDF. All product names, logos, and brands are property of their respective owners. Comparisons are for informational purposes only and reflect publicly available information at the time of writing.

자주 묻는 질문

.NET에서 HTML을 PDF로 변환하려면 어떻게 해야 하나요?

IronPDF의 RenderHtmlAsPdf 메서드를 사용하여 HTML 문자열을 PDF로 변환할 수 있습니다. 또한 RenderHtmlFileAsPdf 메서드를 사용하여 HTML 파일을 PDF로 변환할 수 있습니다.

NuGet을 사용하는 PDF 라이브러리의 설치 단계는 어떻게 되나요?

NuGet을 사용하여 IronPDF를 설치하려면 Visual Studio를 열고 'NuGet 패키지 관리'로 이동하여 'IronPdf'를 검색한 다음 '설치'를 클릭하여 프로젝트에 추가하세요.

.NET용 GrapeCity PDF 뷰어의 대안에는 어떤 것이 있나요?

IronPDF는 GrapeCity PDF 뷰어의 적절한 대안으로, .NET Core, .NET 5, Framework 및 Standard에 대한 광범위한 지원으로 사용자 친화적인 환경을 제공합니다.

.NET 라이브러리를 사용하여 PDF 파일을 만들고 읽으려면 어떻게 해야 하나요?

IronPDF를 사용하면 IronPdf 네임스페이스를 포함하고 HtmlToPdf 클래스를 사용하여 HTML을 PDF로 렌더링하는 방식으로 PDF를 만들 수 있습니다. PDF를 읽으려면 PdfDocument 클래스를 사용하여 콘텐츠에 액세스하고 조작할 수 있습니다.

PDF 라이브러리에 사용할 수 있는 라이선스 옵션은 무엇인가요?

IronPDF는 단일 개발자를 위한 라이트 패키지, 최대 10명의 개발자를 위한 프로페셔널 라이선스, 팀을 위한 무제한 라이선스 등 다양한 라이선스 옵션을 제공하며, 모두 영구 라이선스 및 지원 옵션이 포함되어 있습니다.

다른 PDF 솔루션 대신 IronPDF를 선택해야 하는 이유는 무엇인가요?

정확성, 포괄적인 기능, 경쟁력 있는 라이선스, 광범위한 지원 옵션으로 IronPDF를 추천합니다. 경쟁력 있는 가격으로 여러 플랫폼을 지원합니다.

PDF 라이브러리를 구매하기 전에 사용해 볼 수 있나요?

예, IronPDF는 구매 결정을 내리기 전에 사용 가능한 모든 기능을 살펴볼 수 있는 무료 평가판을 제공합니다. 또한 Iron Suite 패키지를 이용하면 할인된 가격으로 모든 Iron Software 제품을 이용할 수 있습니다.

PDF 파일 사용의 단점은 무엇인가요?

PDF는 크기 때문에 이메일로 공유하기 어렵고, 모바일 장치에서 Word 문서에 비해 선명하게 표시되지 않을 수 있으며, 편집하거나 업데이트하려면 특정 소프트웨어가 필요할 수 있습니다.

커티스 차우
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.