Lxman.PdfLibrary 0.1.0-beta

This is a prerelease version of Lxman.PdfLibrary.
dotnet add package Lxman.PdfLibrary --version 0.1.0-beta
                    
NuGet\Install-Package Lxman.PdfLibrary -Version 0.1.0-beta
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Lxman.PdfLibrary" Version="0.1.0-beta" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Lxman.PdfLibrary" Version="0.1.0-beta" />
                    
Directory.Packages.props
<PackageReference Include="Lxman.PdfLibrary" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Lxman.PdfLibrary --version 0.1.0-beta
                    
#r "nuget: Lxman.PdfLibrary, 0.1.0-beta"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Lxman.PdfLibrary@0.1.0-beta
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Lxman.PdfLibrary&version=0.1.0-beta&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=Lxman.PdfLibrary&version=0.1.0-beta&prerelease
                    
Install as a Cake Tool

PdfLibrary

License: MIT .NET

A comprehensive .NET library for parsing, rendering, and creating PDF documents. Built with C# and targeting .NET 10.

Features

PDF Rendering

  • Full PDF 1.x and 2.0 parsing support
  • High-quality rendering using SkiaSharp
  • Support for complex graphics operations (paths, clipping, transparency)
  • Comprehensive color space support (DeviceRGB, DeviceCMYK, DeviceGray, ICCBased, Separation, Lab)
  • Image handling with custom high-performance decompressors:
    • JPEG (via JpegLibrary fork with enhanced compatibility)
    • JPEG2000 (JP2/J2K via custom CSJ2K-based decoder)
    • CCITT Group 3 and Group 4 fax compression
    • JBIG2 monochrome compression
    • LZW compression
    • FlateDecode (zlib/PNG)
    • RunLength, ASCII85, ASCIIHex encoding
  • Font rendering (Type1, TrueType, CID, embedded fonts)
  • Text extraction and positioning

PDF Creation (Fluent Builder API)

  • Intuitive fluent API for document creation
  • Text with full styling (fonts, colors, spacing)
  • Vector graphics (rectangles, circles, lines, paths)
  • Image embedding (JPEG, PNG)
  • Interactive forms (text fields, checkboxes, radio buttons, dropdowns)
  • Annotations (links, notes, highlights)
  • Bookmarks/Outlines with hierarchical navigation
  • Page labels (custom numbering schemes)
  • Layers (Optional Content Groups)
  • Encryption (RC4, AES-128, AES-256)
  • Custom font embedding (TrueType, OpenType)

Project Structure

PDF/
├── PdfLibrary/                       # Core library
│   ├── Document/                     # PDF document model
│   ├── Structure/                    # PDF structure (xref, trailer, objects)
│   ├── Parsing/                      # PDF lexer/parser
│   ├── Content/                      # Content stream processing
│   ├── Filters/                      # Stream decode filters (Flate, JBIG2Decode, etc.)
│   ├── Rendering/                    # Rendering pipeline
│   ├── Builder/                      # Fluent API for PDF creation
│   ├── Fonts/                        # Font handling
│   ├── Functions/                    # PDF function objects
│   ├── Fixups/                       # Per-document corrective passes
│   ├── Core/                         # Primitive types
│   └── Security/                     # Encryption/decryption
├── PdfLibrary.Rendering.SkiaSharp/   # SkiaSharp render target
├── PdfLibrary.Tests/                 # Unit tests
├── PdfLibrary.Integration/           # Integration tests
├── PdfLibrary.Wpf.Viewer/            # WPF PDF viewer application
├── PdfLibrary.Utilities/             # Utility applications
│   └── ImageUtility/                 # Image format viewer with codec system
├── PdfLibrary.Examples/              # Standalone usage samples
├── ImageLibrary/                     # Pure-C# image format library
│   ├── ImageLibrary/                 # Core: Compression/{Ccitt,Lzw}, Container/{Bmp,Gif,Jp2,Png,Tga,Tiff}
│   ├── Jbig2Decoder/                 # JBIG2 decoder (ITU-T T.88)
│   ├── Jbig2Decoder.Tests/
│   ├── Compression.Ccitt.Tests/
│   ├── Compression.Lzw.Tests/
│   ├── BmpCodec.Tests/
│   ├── GifCodec.Tests/
│   ├── PngCodec.Tests/
│   ├── TgaCodec.Tests/
│   └── ImageLibrary.IntegrationTests/
├── Compressors/                      # Standalone codec libraries
│   └── Compressors.Jpeg2000/         # JPEG2000 (Melville.CSJ2K)
├── JpegLibrary/                      # High-performance JPEG decompression
├── FontParser/                       # TrueType/OpenType parsing
├── Logging/                          # Logging infrastructure
└── Docs/                             # Documentation

Quick Start

Rendering a PDF

using PdfLibrary.Structure;
using PdfLibrary.Rendering.SkiaSharp;

// Load a PDF document
using var stream = File.OpenRead("document.pdf");
var document = PdfDocument.Load(stream);

// Get the page to render
var page = document.GetPage(0);  // 0-based index

// Render to file using the fluent API
page.Render(document)
    .WithScale(1.0)  // 1.0 = 72 DPI
    .ToFile("output.png");

// Or render to SKImage for further processing
using var image = page.Render(document)
    .WithDpi(144)  // 2x resolution
    .ToImage();

Creating a PDF

using PdfLibrary.Builder;

PdfDocumentBuilder.Create()
    .WithMetadata(meta => meta
        .Title("My Document")
        .Author("John Doe"))
    .AddPage(page => page
        .AddText("Hello, World!", 100, 700)
            .WithFont("Helvetica-Bold")
            .WithSize(24)
            .WithColor(PdfColor.Blue)
        .AddRectangle(100, 650, 200, 30)
            .Fill(PdfColor.LightGray)
            .Stroke(PdfColor.Black))
    .AddPage(page => page
        .AddText("Page 2", 100, 700))
    .AddBookmark("Page 1", 0)
    .AddBookmark("Page 2", 1)
    .Save("output.pdf");

Creating a Form

PdfDocumentBuilder.Create()
    .AddPage(page => page
        .AddText("Registration Form", 100, 750)
            .WithSize(18)
            .Bold()
        .AddText("Name:", 100, 700)
        .AddTextField("name", 170, 695, 200, 25)
            .Required()
        .AddText("Email:", 100, 660)
        .AddTextField("email", 170, 655, 200, 25)
        .AddText("I agree to terms:", 100, 620)
        .AddCheckbox("agree", 220, 618, 18, 18))
    .WithAcroForm(form => form.SetNeedAppearances(true))
    .Save("form.pdf");

Advanced Rendering Options

// Render with custom background color
using var image = page.Render(document)
    .WithDpi(300)  // High resolution for printing
    .WithBackgroundColor(new SKColor(255, 250, 240))  // Antique white
    .ToImage();

// Render specific region of page
using var cropImage = page.Render(document)
    .WithScale(2.0)
    .WithCropBox(100, 100, 400, 600)  // x, y, width, height
    .ToImage();

Text Extraction

// Extract all text from a page
var page = document.GetPage(0);
var textContent = page.ExtractText(document);

// Extract text with positioning information
var textBlocks = page.ExtractTextBlocks(document);
foreach (var block in textBlocks)
{
    Console.WriteLine($"Text: {block.Text}");
    Console.WriteLine($"Position: ({block.X}, {block.Y})");
    Console.WriteLine($"Font: {block.FontName}, Size: {block.FontSize}");
}

Image Decompression Architecture

PdfLibrary uses custom-built, high-performance decompression libraries for all PDF image formats. These are pure C# implementations with no external dependencies:

Custom Decompressors

  • JpegLibrary - DCTDecode filter (high-performance fork) for baseline and progressive JPEG
  • Compressors.Jpeg2000 - JPXDecode filter (Melville.CSJ2K) for JP2 and J2K codestreams
  • ImageLibrary.Compression.Ccitt - CCITTFaxDecode filter (Group 3 1D/2D and Group 4)
  • ImageLibrary.Jbig2Decoder - JBIG2Decode filter for monochrome document compression (ITU-T T.88, used directly by PdfLibrary.Filters.Jbig2DecodeFilter)
  • ImageLibrary.Compression.Lzw - LZWDecode filter with Early Change support
  • PdfLibrary.Filters.FlateDecodeFilter - FlateDecode (DEFLATE) using System.IO.Compression

Integration

PDF stream filters in PdfLibrary/Filters/ are thin adapters: each maps PDF filter parameters onto the underlying codec library and returns decoded bytes in the layout the renderer expects. Image containers (BMP/GIF/PNG/TGA/JP2/TIFF) live in ImageLibrary and are used by the standalone ImageUtility application; PDF rendering only consumes the codec layer (CCITT, LZW, JBIG2, JPEG, JPEG2000).

Requirements

  • .NET 10.0 or later
  • SkiaSharp (for rendering - separate PdfLibrary.Rendering.SkiaSharp package)

Core Dependencies

  • Serilog - Structured logging
  • Unicolour - Advanced color space transformations
  • JpegLibrary - High-performance JPEG decompression for PDF images
  • In-tree codec libraries:
    • ImageLibrary - LZW, CCITT (Group 3/4), and image container formats
    • ImageLibrary.Jbig2Decoder - JBIG2 monochrome compression (ITU-T T.88)
    • Compressors.Jpeg2000 - JPEG2000 (JP2/J2K) support

Note: ImageSharp is NOT a dependency of the core library. It is only used in utility applications for general image format support (PNG, BMP, GIF, TIFF, WebP, etc.).

Building

# Clone the repository with submodules
git clone --recurse-submodules https://github.com/lxman/PDF.git
cd PDF

# Or if already cloned, initialize submodules
git submodule update --init --recursive

# Build the solution
dotnet build PdfProcessor.slnx

# Run tests
dotnet test PdfLibrary.Tests/PdfLibrary.Tests.csproj

Note: The repository uses git submodules for JpegLibrary. Make sure to use --recurse-submodules when cloning or run git submodule update --init --recursive after cloning.

Documentation

Supported PDF Features

Content Streams

  • Graphics state operators (q, Q, cm, w, J, j, M, d, ri, i, gs)
  • Path operators (m, l, c, v, y, h, re, S, s, f, F, f*, B, B*, b, b*, n, W, W*)
  • Text operators (BT, ET, Tc, Tw, Tz, TL, Tf, Tr, Ts, Td, TD, Tm, T*, Tj, TJ, ', ")
  • Color operators (CS, cs, SC, SCN, sc, scn, G, g, RG, rg, K, k)
  • XObject operators (Do)
  • Inline image operators (BI, ID, EI)
  • Marked content operators (MP, DP, BMC, BDC, EMC)

Color Spaces

  • DeviceGray, DeviceRGB, DeviceCMYK
  • CalGray, CalRGB, Lab
  • ICCBased
  • Indexed
  • Separation, DeviceN
  • Pattern (tiling and shading)

Fonts

  • Type1, Type1C (CFF)
  • TrueType
  • Type0 (CID fonts)
  • Type3
  • Embedded and system fonts

Images

  • DCTDecode (JPEG)
  • FlateDecode (PNG/zlib)
  • LZWDecode
  • CCITTFaxDecode (Group 3 and 4)
  • JBIG2Decode
  • JPXDecode (JPEG2000)
  • RunLengthDecode
  • ASCII85Decode, ASCIIHexDecode

Security

  • RC4 40-bit and 128-bit encryption
  • AES 128-bit and 256-bit encryption
  • Permission flags

License

This project is licensed under the MIT License - see the LICENSE file for details.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

Development Setup

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

Code Style

  • Follow C# coding conventions
  • Use meaningful variable and method names
  • Add XML documentation for public APIs
  • Include unit tests for new features

Acknowledgments

Core Library

  • SkiaSharp - 2D graphics library for PDF rendering
  • Serilog - Structured logging framework
  • Unicolour - Advanced color space handling and transformations
  • JpegLibrary - High-performance JPEG decoder

Utilities

  • ImageSharp - Used in ImageUtility viewer for general image format support (not a dependency of PdfLibrary itself)
Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Lxman.PdfLibrary:

Package Downloads
Lxman.PdfLibrary.Rendering.SkiaSharp

SkiaSharp rendering backend for PdfLibrary. Provides high-quality PDF page rendering to images using SkiaSharp.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.1.0-beta 24 5/10/2026
0.0.10-beta 150 12/13/2025
0.0.9-beta 110 12/12/2025
0.0.8-beta 418 12/9/2025
0.0.6-beta 329 12/8/2025
0.0.5-beta 328 12/8/2025
0.0.4-beta 201 12/7/2025
0.0.3-beta 108 12/6/2025
0.0.2-beta 105 11/29/2025