Skip to footer content
MIGRATION GUIDES

How to Migrate from PdfPig to IronPDF in C#

Migrating from PdfPig to IronPDF expands your PDF capabilities from a reading-only library to a comprehensive PDF solution that handles creation, manipulation, text extraction, and security features. This guide provides a complete, step-by-step migration path that preserves your existing extraction workflows while adding PDF generation, HTML conversion, document manipulation, and security capabilities that PdfPig cannot provide.

Why Migrate from PdfPig to IronPDF

Understanding PdfPig

PdfPig is an open-source PDF reading and extraction library specifically designed for C#. As an arm of the reputable Apache PDFBox project, this library allows developers to access the content of PDFs with remarkable precision. While PdfPig shines in extraction capabilities, its scope is largely limited compared to more comprehensive libraries available on the market.

PdfPig provides developers with reliable tools for extracting text, images, form data, and metadata from PDF files. This makes it a suitable choice for applications primarily focused on document analysis and data mining. However, PdfPig's capabilities are fundamentally limited to parsing existing documents.

The Reading-Only Limitation

PdfPig focuses exclusively on PDF reading. When your application needs to grow beyond extraction, PdfPig cannot help:

  1. No PDF Generation: Cannot create PDFs from HTML, URLs, or programmatically.

  2. No HTML-to-PDF: PdfPig is a PDF reading/parsing library, not a PDF generation library. You would need to use a different library for HTML to PDF conversion.

  3. No Document Manipulation: Cannot merge, split, or modify PDFs.

  4. No Security Features: Cannot add passwords, encryption, or digital signatures.

  5. No Watermarks/Stamps: Cannot add visual overlays to existing documents.

  6. No Form Filling: Cannot programmatically fill PDF forms.

PdfPig vs IronPDF Comparison

FeaturePdfPigIronPDF
LicenseOpen Source (Apache 2.0)Commercial
PDF Reading/ExtractionExcellentExcellent
PDF GenerationLimitedComprehensive
HTML to PDFNot SupportedSupported
Text ExtractionExcellentExcellent
PDF ManipulationNot supportedMerge, split, rotate
WatermarksNot supportedFull support
Security/EncryptionNot supportedFull support
Support and DocumentationCommunity SupportDedicated Support
Page Indexing1-based0-based

IronPDF supports a complete set of features for creating, reading, editing, and signing PDFs. This versatility allows developers to manage PDF files from start to finish. For teams planning .NET 10 and C# 14 adoption through 2025 and 2026, IronPDF provides a complete PDF lifecycle solution that extends beyond PdfPig's reading capabilities.


Before You Start

Prerequisites

  1. .NET Environment: .NET Framework 4.6.2+ or .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet Access: Ability to install NuGet packages
  3. IronPDF License: Obtain your license key from ironpdf.com

NuGet Package Changes

# Remove PdfPig
dotnet remove package PdfPig

# Install IronPDF
dotnet add package IronPdf
# Remove PdfPig
dotnet remove package PdfPig

# Install IronPDF
dotnet add package IronPdf
SHELL

License Configuration

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
$vbLabelText   $csharpLabel

Identify PdfPig Usage

# Find PdfPig usage
grep -r "UglyToad\.PdfPig\|PdfDocument\.Open\|GetPages\(\)" --include="*.cs" .

# Find page index references (may need 1→0 conversion)
grep -r "GetPage(\|NumberOfPages" --include="*.cs" .
# Find PdfPig usage
grep -r "UglyToad\.PdfPig\|PdfDocument\.Open\|GetPages\(\)" --include="*.cs" .

# Find page index references (may need 1→0 conversion)
grep -r "GetPage(\|NumberOfPages" --include="*.cs" .
SHELL

Complete API Reference

Namespace Changes

// Before: PdfPig
using UglyToad.PdfPig;
using UglyToad.PdfPig.Content;
using UglyToad.PdfPig.DocumentLayoutAnalysis.WordExtractor;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: PdfPig
using UglyToad.PdfPig;
using UglyToad.PdfPig.Content;
using UglyToad.PdfPig.DocumentLayoutAnalysis.WordExtractor;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
$vbLabelText   $csharpLabel

Document Loading Mappings

PdfPigIronPDFNotes
PdfDocument.Open(path)PdfDocument.FromFile(path)Load from file
PdfDocument.Open(bytes)PdfDocument.FromBinaryData(bytes)Load from bytes
PdfDocument.Open(stream)PdfDocument.FromStream(stream)Load from stream
using (var doc = ...)var pdf = ...IronPDF doesn't require using

Page Access and Properties Mappings

PdfPigIronPDFNotes
document.NumberOfPagespdf.PageCountTotal page count
document.GetPages()pdf.PagesPage collection
document.GetPage(1)pdf.Pages[0]Single page (note: 1-based vs 0-based)

Text Extraction Mappings

PdfPigIronPDFNotes
page.Textpdf.Pages[i].TextPage text
page.GetWords()pdf.ExtractTextFromPage(i)Words/text from page
(manual loop)pdf.ExtractAllText()All text at once

Metadata Access Mappings

PdfPigIronPDFNotes
document.Information.Titlepdf.MetaData.TitleDocument title
document.Information.Authorpdf.MetaData.AuthorAuthor
document.Information.Subjectpdf.MetaData.SubjectSubject
document.Information.Creatorpdf.MetaData.CreatorCreator
document.Information.Producerpdf.MetaData.ProducerProducer

New Features Not Available in PdfPig

IronPDF FeatureDescription
renderer.RenderHtmlAsPdf(html)HTML to PDF conversion
renderer.RenderUrlAsPdf(url)URL to PDF conversion
PdfDocument.Merge(pdfs)Merge multiple PDFs
pdf.ApplyWatermark(html)Add watermarks
pdf.SecuritySettings.UserPasswordPassword protection
pdf.Sign(certificate)Digital signatures

Code Migration Examples

Example 1: Text Extraction from PDF

Before (PdfPig):

// NuGet: Install-Package PdfPig
using UglyToad.PdfPig;
using System;
using System.Text;

class Program
{
    static void Main()
    {
        using (var document = PdfDocument.Open("input.pdf"))
        {
            var text = new StringBuilder();
            foreach (var page in document.GetPages())
            {
                text.AppendLine(page.Text);
            }
            Console.WriteLine(text.ToString());
        }
    }
}
// NuGet: Install-Package PdfPig
using UglyToad.PdfPig;
using System;
using System.Text;

class Program
{
    static void Main()
    {
        using (var document = PdfDocument.Open("input.pdf"))
        {
            var text = new StringBuilder();
            foreach (var page in document.GetPages())
            {
                text.AppendLine(page.Text);
            }
            Console.WriteLine(text.ToString());
        }
    }
}
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");
        string text = pdf.ExtractAllText();
        Console.WriteLine(text);
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");
        string text = pdf.ExtractAllText();
        Console.WriteLine(text);
    }
}
$vbLabelText   $csharpLabel

Both PdfPig and IronPDF provide excellent text extraction capabilities. The key difference is in the code pattern. PdfPig requires a using statement with PdfDocument.Open(), manual iteration through pages with GetPages(), and a StringBuilder to accumulate text from each page.Text property.

IronPDF simplifies this to a single call: PdfDocument.FromFile() loads the document, and ExtractAllText() returns all text content at once. No using statement required, no manual iteration, no StringBuilder. See the text extraction documentation for additional options.

Example 2: HTML to PDF Conversion

Before (PdfPig):

// PdfPig does not support HTML to PDF conversion
// PdfPig is a PDF reading/parsing library, not a PDF generation library
// You would need to use a different library for HTML to PDF conversion
// PdfPig does not support HTML to PDF conversion
// PdfPig is a PDF reading/parsing library, not a PDF generation library
// You would need to use a different library for HTML to PDF conversion
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML</p>");
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML</p>");
        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

This example highlights the most significant capability gap. PdfPig explicitly states it "does not support HTML to PDF conversion" and "is a PDF reading/parsing library, not a PDF generation library." If you need to create PDFs from HTML with PdfPig, you would need to use a different library entirely.

IronPDF provides native HTML to PDF conversion through ChromePdfRenderer. The RenderHtmlAsPdf() method accepts HTML strings and converts them to PDF documents using a Chromium engine internally for accurate rendering of HTML, CSS, and JavaScript. The resulting PdfDocument can be saved with SaveAs() or manipulated further before saving. See the HTML to PDF documentation for comprehensive examples.

Example 3: Reading PDF Metadata

Before (PdfPig):

// NuGet: Install-Package PdfPig
using UglyToad.PdfPig;
using System;

class Program
{
    static void Main()
    {
        using (var document = PdfDocument.Open("input.pdf"))
        {
            var info = document.Information;
            Console.WriteLine($"Title: {info.Title}");
            Console.WriteLine($"Author: {info.Author}");
            Console.WriteLine($"Subject: {info.Subject}");
            Console.WriteLine($"Creator: {info.Creator}");
            Console.WriteLine($"Producer: {info.Producer}");
            Console.WriteLine($"Number of Pages: {document.NumberOfPages}");
        }
    }
}
// NuGet: Install-Package PdfPig
using UglyToad.PdfPig;
using System;

class Program
{
    static void Main()
    {
        using (var document = PdfDocument.Open("input.pdf"))
        {
            var info = document.Information;
            Console.WriteLine($"Title: {info.Title}");
            Console.WriteLine($"Author: {info.Author}");
            Console.WriteLine($"Subject: {info.Subject}");
            Console.WriteLine($"Creator: {info.Creator}");
            Console.WriteLine($"Producer: {info.Producer}");
            Console.WriteLine($"Number of Pages: {document.NumberOfPages}");
        }
    }
}
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");
        var info = pdf.MetaData;
        Console.WriteLine($"Title: {info.Title}");
        Console.WriteLine($"Author: {info.Author}");
        Console.WriteLine($"Subject: {info.Subject}");
        Console.WriteLine($"Creator: {info.Creator}");
        Console.WriteLine($"Producer: {info.Producer}");
        Console.WriteLine($"Number of Pages: {pdf.PageCount}");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");
        var info = pdf.MetaData;
        Console.WriteLine($"Title: {info.Title}");
        Console.WriteLine($"Author: {info.Author}");
        Console.WriteLine($"Subject: {info.Subject}");
        Console.WriteLine($"Creator: {info.Creator}");
        Console.WriteLine($"Producer: {info.Producer}");
        Console.WriteLine($"Number of Pages: {pdf.PageCount}");
    }
}
$vbLabelText   $csharpLabel

Both libraries provide metadata access with nearly identical patterns. PdfPig accesses metadata through document.Information and page count through document.NumberOfPages. IronPDF uses pdf.MetaData for metadata and pdf.PageCount for page count.

The migration is straightforward: replace PdfDocument.Open() with PdfDocument.FromFile(), document.Information with pdf.MetaData, and document.NumberOfPages with pdf.PageCount. Remove the using statement wrapper since IronPDF doesn't require it.


Critical Migration Notes

Page Indexing Change

PdfPig uses 1-based indexing; IronPDF uses 0-based:

// PdfPig: 1-based indexing
var firstPage = document.GetPage(1);  // First page

// IronPDF: 0-based indexing
var firstPage = pdf.Pages[0];  // First page

// Migration helper
int pdfPigIndex = 1;
int ironPdfIndex = pdfPigIndex - 1;
// PdfPig: 1-based indexing
var firstPage = document.GetPage(1);  // First page

// IronPDF: 0-based indexing
var firstPage = pdf.Pages[0];  // First page

// Migration helper
int pdfPigIndex = 1;
int ironPdfIndex = pdfPigIndex - 1;
$vbLabelText   $csharpLabel

Using Statement Not Required

// PdfPig: Requires using for disposal
using (var document = PdfDocument.Open("input.pdf"))
{
    // ...
}

// IronPDF: No using required (but can use for cleanup)
var pdf = PdfDocument.FromFile("input.pdf");
// ...
// pdf.Dispose(); // Optional
// PdfPig: Requires using for disposal
using (var document = PdfDocument.Open("input.pdf"))
{
    // ...
}

// IronPDF: No using required (but can use for cleanup)
var pdf = PdfDocument.FromFile("input.pdf");
// ...
// pdf.Dispose(); // Optional
$vbLabelText   $csharpLabel

Document Loading Change

// PdfPig: PdfDocument.Open()
using (var document = PdfDocument.Open("input.pdf"))

// IronPDF: PdfDocument.FromFile()
var pdf = PdfDocument.FromFile("input.pdf");
// PdfPig: PdfDocument.Open()
using (var document = PdfDocument.Open("input.pdf"))

// IronPDF: PdfDocument.FromFile()
var pdf = PdfDocument.FromFile("input.pdf");
$vbLabelText   $csharpLabel

Metadata Property Name Change

// PdfPig: document.Information
var info = document.Information;

// IronPDF: pdf.MetaData
var info = pdf.MetaData;
// PdfPig: document.Information
var info = document.Information;

// IronPDF: pdf.MetaData
var info = pdf.MetaData;
$vbLabelText   $csharpLabel

Page Count Property Change

// PdfPig: document.NumberOfPages
Console.WriteLine($"Pages: {document.NumberOfPages}");

// IronPDF: pdf.PageCount
Console.WriteLine($"Pages: {pdf.PageCount}");
// PdfPig: document.NumberOfPages
Console.WriteLine($"Pages: {document.NumberOfPages}");

// IronPDF: pdf.PageCount
Console.WriteLine($"Pages: {pdf.PageCount}");
$vbLabelText   $csharpLabel

New Capabilities After Migration

After migrating to IronPDF, you gain capabilities that PdfPig cannot provide:

PDF Merging

var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
$vbLabelText   $csharpLabel

Watermarks

pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
$vbLabelText   $csharpLabel

Password Protection

pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
$vbLabelText   $csharpLabel

Digital Signatures

var signature = new PdfSignature("certificate.pfx", "password")
{
    SigningContact = "support@company.com",
    SigningReason = "Document Approval"
};
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password")
{
    SigningContact = "support@company.com",
    SigningReason = "Document Approval"
};
pdf.Sign(signature);
$vbLabelText   $csharpLabel

Feature Comparison Summary

FeaturePdfPigIronPDF
Text Extraction
Metadata Access
Image Extraction
PDF CreationLimited
HTML to PDF
URL to PDF
Merge PDFs
Split PDFs
Watermarks
Form Filling
Password Protection
Digital Signatures
Word Position Data

Migration Checklist

Pre-Migration

  • Inventory all PdfPig usage in codebase
  • Identify if you need word-level position data (consider hybrid approach)
  • Note all page index references (need to convert 1-based to 0-based)
  • Plan IronPDF license key storage (environment variables recommended)
  • Test with IronPDF trial license first

Package Changes

  • Remove PdfPig NuGet package: dotnet remove package PdfPig
  • Install IronPdf NuGet package: dotnet add package IronPdf

Code Changes

  • Update namespace imports (using UglyToad.PdfPig;using IronPdf;)
  • Replace PdfDocument.Open() with PdfDocument.FromFile()
  • Replace document.Information with pdf.MetaData
  • Replace document.NumberOfPages with pdf.PageCount
  • Convert page indices from 1-based to 0-based
  • Remove using statements (optional, IronPDF doesn't require them)
  • Add IronPDF license key at application startup

Post-Migration

  • Test text extraction output matches expectations
  • Test all PDF generation scenarios
  • Add new capabilities (merging, watermarks, security) as needed
  • Install Linux dependencies if deploying to Linux

Curtis Chau
Technical Writer

Curtis Chau holds a Bachelor’s degree in Computer Science (Carleton University) and specializes in front-end development with expertise in Node.js, TypeScript, JavaScript, and React. Passionate about crafting intuitive and aesthetically pleasing user interfaces, Curtis enjoys working with modern frameworks and creating well-structured, visually appealing manuals.

...

Read More