VellumPdf.Signing
1.9.0
See the version list below for details.
dotnet add package VellumPdf.Signing --version 1.9.0
NuGet\Install-Package VellumPdf.Signing -Version 1.9.0
<PackageReference Include="VellumPdf.Signing" Version="1.9.0" />
<PackageVersion Include="VellumPdf.Signing" Version="1.9.0" />
<PackageReference Include="VellumPdf.Signing" />
paket add VellumPdf.Signing --version 1.9.0
#r "nuget: VellumPdf.Signing, 1.9.0"
#:package VellumPdf.Signing@1.9.0
#addin nuget:?package=VellumPdf.Signing&version=1.9.0
#tool nuget:?package=VellumPdf.Signing&version=1.9.0
VellumPdf
A modern, dependency-free PDF generation library for .NET 10, implemented clean-room from the open ISO 32000 standard.
Status: stable. The public API is locked (analyzer-enforced) and the library targets .NET 10. Core features are CI-validated — including PDF/A-2a/2b/2u and PDF/UA-1 conformance proven on every push with veraPDF.
Why VellumPdf
- Zero runtime dependencies. The core is built entirely on the .NET base
class library — no native binaries, no third-party packages. (The optional
signing package is the sole exception: it uses
System.Security.Cryptography.Pkcs.) - AOT- and trim-ready. Ships as managed DLLs; ideal for Native AOT, trimming, containers, and serverless. A Native-AOT smoke test guards this.
- Unicode-first text. Embeds and subsets TrueType and OpenType-CFF fonts,
emits composite (CID) fonts with subset tags, and writes
ToUnicodemaps so output stays searchable and copy-paste-able. - Two API tiers. A low-level canvas for precise drawing, and a high-level document/layout engine with paragraphs, headings, lists, tables, images, and automatic pagination.
- Built for the hard standards. PDF/A-2a (accessible archival) and PDF/UA-1 (universal accessibility) are implemented and CI-validated with veraPDF, alongside PDF/A-2b/2u, PAdES digital signatures, and interactive AcroForms.
- Permissive license. Apache-2.0 — free to use in proprietary products.
Packages
Install
# Core
dotnet add package VellumPdf.Layout
dotnet add package VellumPdf.Kernel
# Add-ons
dotnet add package VellumPdf.Signing
dotnet add package VellumPdf.Fonts.Standard14
dotnet add package VellumPdf.Barcodes
# Preview
dotnet add package VellumPdf.Reader
dotnet add package VellumPdf.Conformance
# Tooling (.NET global tool)
dotnet tool install -g VellumPdf.Cli
VellumPdf.Layout pulls in VellumPdf.Kernel as a dependency, so most apps only need the
first line. Quick start below shows VellumPdf.Layout/VellumPdf.Kernel in
use, and Barcodes shows VellumPdf.Barcodes.
Quick start
dotnet add package VellumPdf.Layout
using VellumPdf.Document; // PdfConformance
using VellumPdf.Fonts; // Standard14
using VellumPdf.Layout; // Document
using VellumPdf.Layout.Core; // TextStyle
using VellumPdf.Layout.Elements; // Paragraph, Heading
using VellumPdf.Layout.Elements.Table; // TableElement
// Basic document — defaults to A4.
using var doc = new Document();
doc.SetDefaultFont(new TextStyle { Font = Standard14.Helvetica, FontSize = 11 });
doc.Add(new Heading("Hello, world!"));
doc.Add(new Paragraph("Generated with VellumPdf — no native dependencies."));
doc.Save("hello.pdf");
// PDF/A-2b archival document. PDF/A requires every glyph to come from an
// embedded font, so load a TrueType font and use it for all text.
using var archive = new Document { Conformance = PdfConformance.PdfA2b };
var font = archive.LoadTrueTypeFont("/path/to/DejaVuSans.ttf");
var style = new TextStyle { FontRef = font, FontSize = 12 };
archive.Add(new Paragraph("This document validates as PDF/A-2b.", style));
var table = new TableElement { DefaultCellStyle = style };
table.SetColumnWidths(200, 200);
table.AddHeaderRow().AddCell("Item").AddCell("Value");
table.AddRow().AddCell("Format").AddCell("PDF/A-2b");
archive.Add(table);
archive.Save("archive.pdf");
Low-level Kernel API
For precise canvas control, bypass the Layout engine and write directly to the PDF content stream:
using VellumPdf.Canvas; // PdfCanvas
using VellumPdf.Document; // PdfDocument, PageSize
using VellumPdf.Fonts; // Standard14
using var doc = new PdfDocument();
var page = doc.AddPage(PageSize.A4);
var font = doc.UseFont(Standard14.Helvetica);
var canvas = new PdfCanvas(page);
canvas
.BeginText()
.SetFont(font, 12)
.SetTextMatrix(1, 0, 0, 1, 72, 720)
.ShowText("Hello from the Kernel API!")
.EndText();
canvas.Finish();
using var stream = File.OpenWrite("kernel-hello.pdf");
doc.Save(stream);
For a full walkthrough of the canvas, graphics primitives, and font handling, see docs/kernel-guide.md.
Barcodes
dotnet add package VellumPdf.Barcodes
using VellumPdf.Barcodes;
// Flow API: adds a QR Code to the document like any other element.
doc.Add(new QrCode("https://example.com") { TargetWidth = 120 });
// Low-level API: draws directly onto a PdfCanvas, with human-readable text below the bars.
canvas.DrawBarcode(new EanBarcode(EanSymbology.Ean13, "400638133393"), 72, 700, font);
QR (including Micro QR), PDF417, Code 128, EAN-13/EAN-8/UPC-A, and ITF-14 are all covered; see docs/barcodes-guide.md for sizing, human-readable text, GS1/FNC1, and the QR charset policy. QR Code is a registered trademark of DENSO WAVE INCORPORATED.
Conventions
- Units. All coordinates and sizes are in PDF user-space points (1 pt = 1/72 inch).
PageSizeprovides the common ISO-A sizes plus aPageSize.Mm(width, height)helper for custom millimetre dimensions. - Synchronous I/O. Saving, signing, and the font/image loaders are synchronous by design
for 1.0 — there is no
asyncsurface. Offload toTask.Runif you need to keep a thread free.
Validation & CI
Correctness is enforced on every push by running real external validators as CI oracles — a missing tool fails the build, so the gates can never silently skip:
qpdf --check— structural integrity of every generated document type.pdftotext(poppler) — text-extraction round-trip provingToUnicodemaps.pdfsig(poppler) — signature validity for PAdES documents.- veraPDF (official
verapdf/cliDocker image) — strict PDF/A-2a/2b/2u and PDF/UA-1 conformance over embedded-font, table, image, and tagged documents. A non-compliant report fails CI with the full rule list attached. - zxing-cpp — decode round-trip for every barcode symbology: each generated PDF is
rasterized with
pdftoppmand decoded back, so the CI oracle catches encoding regressions a unit test's own vectors could miss.
Command-line preflight
vellum-preflight validates a PDF against PDF/A-2b/2u/2a and PDF/UA-1 in-process — no JVM or Docker.
Install it as a cross-platform .NET tool, or download a self-contained native binary (Windows x64/Arm64,
macOS Arm64, Linux x64) from the latest release.
dotnet tool install -g VellumPdf.Cli # then run: vellum-preflight <file>
# Does the PDF honour the conformance level it claims? (pass/fail, with reasons)
vellum-preflight invoice.pdf
# A specific profile, machine-readable output
vellum-preflight invoice.pdf -p 2u -f json -o report.json
# Validate a whole tree; fail CI on any error
vellum-preflight ./out --recurse --fail-on error -q
# Several profiles at once
vellum-preflight report.pdf -p 2b,2a,ua1
# See exactly what the tool checks for a profile
vellum-preflight --coverage 2b
Every report states three things: what failed (rule id, ISO clause, reason, offending object), what
passed, and what was not fully evaluated — so a clean result is never mistaken for an absolute
guarantee. Exit codes are 0 (conformant), 1 (non-conformant), and 2 (usage or I/O error).
Roadmap
Planned direction, tracked as GitHub milestones. These are scopes, not commitments — the milestones carry no due dates, and nothing past 1.9.0 has shipped yet.
| Milestone | Scope |
|---|---|
| 1.9 — Barcodes (this release) | VellumPdf.Barcodes (#51): QR, Micro QR, PDF417, Code 128/GS1-128, EAN/UPC, and ITF-14. |
| 2.0 — Breaking changes | Strong-named assemblies (#53) and an async I/O surface for Save/Sign/loaders (#54); both change assembly identity or the public contract, so they wait for a major version. |
| 2.1 — PDF reader (structural) | VellumPdf.Reader grows classic and cross-reference-stream parsing, object streams, and encryption support, with a fixture corpus proving it against real-world files (Epic #100). |
| 2.2 — PDF content extraction | Text and image extraction on top of the reader. |
| 3.0 — Read-modify-write | A unified round-trip document model that supersedes the write-once PdfDocument, so existing PDFs can be opened, edited, and saved back (Epic #101). |
VellumPdf.Reader, VellumPdf.Conformance, and VellumPdf.Barcodes are marked Preview in the
table above; expect their public surfaces to settle as these milestones land.
Building
Requires the .NET 10 SDK.
dotnet build VellumPdf.slnx
dotnet test VellumPdf.slnx
The veraPDF conformance gate runs automatically in CI; to reproduce it locally,
install veraPDF (or use its Docker image) so the
verapdf CLI is on your PATH, then run the oracle tests.
License & provenance
Licensed under the Apache License 2.0. VellumPdf is an original, independent implementation written solely from open published specifications; see NOTICE and docs/architecture.md.
| Product | Versions 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. |
-
net10.0
- System.Security.Cryptography.Pkcs (>= 9.0.5)
- VellumPdf.Kernel (>= 1.9.0)
- VellumPdf.Layout (>= 1.9.0)
- VellumPdf.Reader (>= 1.9.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.3.2 | 89 | 9/12/2026 |
| 2.3.1 | 83 | 9/10/2026 |
| 2.3.0 | 115 | 9/1/2026 |
| 2.2.0 | 95 | 8/28/2026 |
| 2.1.0 | 101 | 8/28/2026 |
| 2.0.0 | 108 | 8/17/2026 |
| 1.11.0 | 148 | 7/11/2026 |
| 1.10.0 | 660 | 7/7/2026 |
| 1.9.0 | 127 | 7/6/2026 |
| 1.8.2 | 130 | 7/5/2026 |
| 1.8.1 | 131 | 7/3/2026 |
| 1.8.0 | 121 | 7/3/2026 |
| 1.7.8 | 128 | 7/3/2026 |
| 1.7.7 | 124 | 7/2/2026 |
| 1.7.6 | 139 | 6/28/2026 |
| 1.7.5 | 139 | 6/23/2026 |
| 1.7.4 | 134 | 6/23/2026 |
| 1.7.3 | 131 | 6/22/2026 |
| 1.7.2 | 142 | 6/22/2026 |
| 1.7.1 | 140 | 6/21/2026 |