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
GrapeCityPDF
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:

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:

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:

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

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:

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;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!");
}
}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;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();
}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:
- Download the zipped source files.
- Extract files to a directory.
- Go to to that directory.
- Execute
run.cmdto build samples, startSupportApiservice, and open http://localhost:3003. - See
readme.MDfor details.
How Do I Install the WinForms Edition?
Follow these steps for WinForms Edition installation:
- Download C1ControlPanel from
GrapeCity'sComponentOne. - Open
ControlPanelwithComponentOneC1ControlPanel.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
WinFormsEdition tile. Install all editions via All Editions checkbox.

`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 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.

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.

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);
}
}
}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 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='___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 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");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 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.

`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.Frequently Asked Questions
How can I convert HTML to PDF in .NET?
You can use IronPDF's RenderHtmlAsPdf method to convert HTML strings into PDFs. Additionally, you can convert HTML files into PDFs using the RenderHtmlFileAsPdf method.
What are the installation steps for a PDF library using NuGet?
To install IronPDF using NuGet, open Visual Studio, navigate to 'Manage NuGet Packages', search for 'IronPdf', and click 'Install' to add it to your project.
What are some alternatives to the GrapeCity PDF Viewer for .NET?
IronPDF is a suitable alternative to the GrapeCity PDF Viewer, providing a user-friendly experience with extensive support for .NET Core, .NET 5, Framework, and Standard.
How do I create and read PDF files using a .NET library?
Using IronPDF, you can create PDFs by including the IronPdf namespace and using the HtmlToPdf class to render HTML as a PDF. To read PDFs, you can use the PdfDocument class to access and manipulate the content.
What are the licensing options available for a PDF library?
IronPDF offers a range of licensing options, including a Lite Package for single developers, a Professional License for up to 10 developers, and an Unlimited License for teams, all with perpetual licensing and support options.
Why should I choose IronPDF over other PDF solutions?
IronPDF is recommended for its accuracy, comprehensive features, competitive licensing, and extensive support options. It offers support for multiple platforms at a competitive price.
Can I try a PDF library before purchasing it?
Yes, IronPDF offers a free trial that allows you to explore all available features before making a purchase decision. Additionally, the Iron Suite package provides access to all Iron Software products at a discounted rate.
What are some disadvantages of using PDF files?
PDFs can be difficult to share via email due to their size, may not display clearly on mobile devices compared to Word documents, and require specific software to edit or update.








