Skip to content

PdfSpace

Documents & Officev0.6.4-alpha.1 MIT 10

Read, edit and review PDFs — locally, in the browser or on desktop

PdfSpace is a local-first PDF application built in C# with Uno Platform and SkiaSharp. The browser runs a real Uno WebAssembly app with the same document, editing and rendering libraries as the desktop host, and an Acrobat-inspired shell brings together tabs, comments, form preparation, native object and original-text editing, on-device OCR, AES-256 protection, redaction and page organization. No document or password is sent to a processing service.

12reusable, packable libraries
3on-device OCR languages
AES-256password protection in the browser
5distinct save and export operations
PdfSpacewieslawsoltes.github.io/PdfSpace/
PdfSpace running in a browser
Highlights

What makes PdfSpace special

Familiar if you know Acrobat-style PDF editors — but original, local‑first and written end‑to‑end in C#.

Genuine Uno WebAssembly

The browser build is a real Uno/Skia application sharing its engines with the desktop host — not a PDF.js viewer or HTML canvas app.

Review without flattening

Highlights, notes, replies, ink, shapes, stamps and links are written back as native PDF annotation objects.

Prepare and fill forms

Create text, check-box and dropdown fields, fill imported forms, and import or export values as XFDF or JSON.

Edit native objects

Select native text, paths, images and Form groups on the page, then move, resize, align, group, crop or restyle them with one-step undo.

Real original-text edits

Replaces actual PDF text-showing operands instead of covering them with a white rectangle; unsupported cases are rejected.

Local Scan & OCR

Recognize image-only PDFs in English, Polish or German, review words against the scan, and export a searchable PDF.

Protect and redact a copy

Export AES-256 PDFs with separate opening and owner passwords, or build a confirmed image-only redacted copy.

Indexed performance

Indexed page geometry, bounded search indexes and bounded picture/source caches reduce repeated layout and parsing work on large documents.

0reusable libraries
0lines of C# & XAML
0features catalogued
0.NET projects
0CI workflows
0docs
Feature tour

33 capabilities, 7 areas

Read and navigate

  • Multiple document tabs for PDFs and editable workspaces
  • Search and copy text; zoom, pan and Ctrl+wheel zoom around the pointer
  • Continuous, single-page and two-page layouts with virtualized thumbnails
  • Original PDF outlines alongside editable workspace bookmarks
  • Local named destinations and internal links that follow page reorganization

Review and comment

  • Text, highlight, underline, strikethrough, notes and threaded replies
  • Ink, shapes, arrows, stamps and links
  • Move, resize and recolor annotations; resolve comments; undo and redo
  • Supported annotations and replies export as native PDF objects

Forms

  • Create text, check-box and dropdown fields directly on a page
  • Fill imported text fields, check boxes, radio groups and single-select choices
  • Edit tooltips, defaults, read-only/required/multiline flags, font size and maximum length
  • Import/export plain field values as XFDF or versioned JSON in one undoable transaction
  • Check required fields and Tab / Shift+Tab between supported widgets

Edit existing content

  • Replace supported original text, including text inside nested Form XObjects
  • Select, move, resize, rotate, flip, replace, insert or delete native image placements
  • Align, distribute, crop, stack, group and copy/paste objects across documents
  • Edit real path geometry, control points and solid fill/stroke
  • Native opacity, blending, stroke caps/joins, miter and dash editing
  • Shift constrains movement and aspect ratio; Alt resizes from the center

Scan & OCR

  • Local recognition in English, Polish or German at 150, 200 or 300 DPI
  • Recognize image-only PDFs or import PNG/JPEG scans honoring EXIF orientation
  • Review low-confidence words against the original scan and correct them
  • Export a searchable PDF with an invisible Unicode text layer
  • Browser self-hosts pinned Tesseract.js/WASM models; native hosts use Tesseract 5

Organize and export

  • Reorder, rotate, duplicate, delete, crop, combine, extract and split pages
  • Export native PDF or a separately labeled flattened visual PDF
  • Download PNG, text, form data or an editable .pdfspace workspace
  • Browser recovery in IndexedDB; atomic temporary-file recovery on desktop

Protect and redact

  • AES-256 revision 6 output with distinct opening and owner passwords
  • Print, copy and edit permission flags; owner authentication before re-editing
  • Browser encryption runs in an isolated, hash-pinned QPDF WASM worker
  • Raster redaction rebuilds every page as an image with burned-in marks
Integrated playground

Run PdfSpace right here

Open the live WebAssembly build and try every workflow on the included original sample documents — no upload of private files needed. Switch viewports, go fullscreen and tick off the guided tour as you explore.

https://wieslawsoltes.github.io/PdfSpace/
PdfSpace screenshot

Try PdfSpace live

Open the live WebAssembly build and try every workflow on the included original sample documents — no upload of private files needed.

Real C# · Uno WebAssembly · runs locally in your browser
Booting .NET WebAssembly runtime…
Reusable packages

12 libraries you can embed

PdfSpace is assembled from independently reusable libraries. Hover the graph to trace dependencies; click a node to jump to its package.

Core 525 lines Layout 671 lines Editing 385 lines Documents 361 lines Rendering.Skia 8,056 lines Skia 371 lines Pdf 5,003 lines Ocr 165 lines Controls 297 lines Viewer 1,196 lines Storage 50 lines Workbench 2,932 lines App 280 lines
Arrows point from a project to what it references. Bars show relative size. ModelEngineI/ORenderingServiceControlsEditorWorkbench
Modellibrary

PdfSpace.Core

Workspace, page, annotation, field and geometry models with validated JSON

No UI depsnet10.0
525 lines14 files0 refs
Modellibrary

PdfSpace.Layout

Crop/rotation transforms and viewport/page layouts without UI dependencies

No UI depsnet10.0
refs → Core
671 lines8 files1 refs
Enginelibrary

PdfSpace.Editing

Transactional editing, shared field state and bounded undo/redo

No UI depsnet10.0
refs → Core
385 lines7 files1 refs
I/Olibrary

PdfSpace.Documents

PdfPig import, text extraction, search, page ranges and XFDF/JSON form data

No UI depsnet10.0
refs → Core
nuget → PdfPig
361 lines5 files1 refs
Renderinglibrary

PdfSpace.Rendering.Skia

Source-pinned Apache-2.0 PdfPig Skia renderer with image-alpha, dash and miter fixes

SkiaSharpnet10.0
nuget → PdfPig, PdfPig.Filters.Dct.JpegLibrary, PdfPig.Filters.Jbig2.PdfboxJbig2, PdfPig.Filters.Jpx.OpenJpeg, SkiaSharp, SkiaSharp.HarfBuzz
8,056 lines32 files0 refs
Renderinglibrary

PdfSpace.Skia

Cached rendering, overlays, visual/PNG export and raster redaction

SkiaSharpnet10.0
refs → Documents, Layout, Rendering.Skia
nuget → SkiaSharp, SkiaSharp.HarfBuzz
371 lines6 files3 refs
I/Olibrary

PdfSpace.Pdf

PDFsharp native annotation/form writer, source-text editing and security-provider contract

PDFsharp + SkiaSharpnet10.0
refs → Skia
nuget → PDFsharp
5,003 lines43 files1 refs
Servicelibrary

PdfSpace.Ocr

Local OCR contracts, raster preparation, bounded TSV decoding and snapshot batches

SkiaSharpnet10.0
refs → Skia
165 lines4 files1 refs
Controlspackable

PdfSpace.Controls

Custom Uno icons, command buttons, tabs, panels, palettes and dialogs

Uno + Skianet10.0-browserwasmnet10.0-desktop
297 lines11 files0 refs
Editorpackable

PdfSpace.Viewer

Embeddable document viewport with annotation editing, form input and thumbnails

Uno + Skianet10.0-browserwasmnet10.0-desktop
refs → Controls, Editing, Skia
1,196 lines10 files3 refs
Servicelibrary

PdfSpace.Storage

Platform-neutral file, recovery, clipboard and print contracts

No UI depsnet10.0
50 lines2 files0 refs
Workbenchpackable

PdfSpace.Workbench

Complete multi-document shell and PDF workflows

Uno + Skianet10.0-browserwasmnet10.0-desktop
refs → Pdf, Viewer, Storage, Ocr
2,932 lines24 files4 refs
Architecture

From engine to workbench

Layers build bottom‑up: each one depends only on those beneath it.

L1Model and geometry

Immutable workspace, annotation and field models, layout transforms and transactional undo — free of Uno, rendering and storage.

PdfSpace.CorePdfSpace.LayoutPdfSpace.Editing
L2Parsing and rendering

PdfPig import and search feed a source-pinned Skia renderer with cached pictures, overlays and visual export.

PdfSpace.DocumentsPdfSpace.Rendering.SkiaPdfSpace.Skia
L3PDF writing and recognition

A PDFsharp-backed structured writer, pluggable security provider and local OCR pipeline.

PdfSpace.PdfPdfSpace.Ocr
L4Uno controls and viewer

Custom Uno controls and an embeddable Skia viewport for pointer editing, forms and thumbnails.

PdfSpace.ControlsPdfSpace.Viewer
L5Workbench

The multi-document shell composes the workflows; hosts inject browser or desktop storage contracts.

PdfSpace.WorkbenchPdfSpace.Storage
Use it in code

Embed, script, extend

bashBuild and run
git clone https://github.com/wieslawsoltes/PdfSpace.git
cd PdfSpace
python3 scripts/fetch-assets.py
dotnet workload install wasm-tools

# Native engine and PDF round-trip tests.
dotnet run --project tests/PdfSpace.Tests -c Release

# Desktop host.
dotnet run --project src/PdfSpace.App -f net10.0-desktop -p:PdfSpaceDesktopOnly=true

# Browser publish and static-root collection.
dotnet publish src/PdfSpace.App -f net10.0-browserwasm -c Release \
  -o artifacts/publish -p:WasmShellWebAppBasePath=/PdfSpace/
python3 scripts/collect-site.py artifacts/publish artifacts/site
python3 scripts/serve-site.py --directory artifacts/site --port 4173

File formats

.pdfread/write
.pdfspace (editable workspace)read/write
Encrypted .pdf (AES-256)read/write
Flattened visual .pdfexport
Redacted image-only .pdfexport
XFDF form dataread/write
JSON form dataread/write
PNG / JPEG (scans and images)import
PNG (page)export
Textexport

Keyboard essentials

Open PDF or workspaceCtrl / Cmd O
New blank PDFCtrl / Cmd N
Save editable workspaceCtrl / Cmd S
Export visual PDFCtrl / Cmd Shift S
FindCtrl / Cmd F
Open printable PDFCtrl / Cmd P
Undo / redoCtrl / Cmd Z / Ctrl / Cmd Shift Z
Fit page / 100%Ctrl / Cmd 0 / Ctrl / Cmd 1
Select / hand / text / ink toolV / H / T / D
Previous / next pagePage Up / Page Down
Nudge selected annotationArrow keys
Cancel gesture or inline text editEscape
Build & CI

Continuously verified

Each push runs through GitHub Actions. The public browser build is deployed only from successful pipelines.

Toolchain

.NET SDK10.0.401
Uno SDK6.7.30
Target frameworksnet10.0-browserwasm · net10.0-desktop · net10.0

Third‑party NuGet packages

PdfPig0.1.16
PdfPig.Filters.Dct.JpegLibrary0.1.16.1
PdfPig.Filters.Jbig2.PdfboxJbig20.1.16.1
PdfPig.Filters.Jpx.OpenJpeg0.1.16
PDFsharp6.2.4
SkiaSharp3.119.4
SkiaSharp.HarfBuzz3.119.4
SkiaSharp.NativeAssets.Linux.NoDependencies3.119.4
bashClone & run the browser build locally
git clone https://github.com/wieslawsoltes/PdfSpace.git
cd PdfSpace
dotnet workload install wasm-tools
dotnet run --project src/PdfSpace.App -f net10.0-browserwasm
Honest boundaries

What it doesn’t claim

The project documents its limits as carefully as its features.

  • Functional PDF workflows, not complete or pixel-identical Adobe Acrobat compatibility
  • Export PDF rewrites the document; it is not an incremental or guaranteed lossless save
  • No XFA, form scripts/calculations, certificate signatures, full tagging/compliance or Office conversion
  • Text editing has no paragraph reflow or complex-script shaping; unsupported encodings are rejected
  • Redacted output is image-only; .pdfspace workspaces are unencrypted and keep the full original