MITFree and open source

One PDF engine.
Five native SDKs.

PDFCora is a PDF SDK for iOS, Android, the Web, Node and Java, built on PDFium. The same API and the same results in Swift, Kotlin, TypeScript and Java.

Features

What it does.

  • Render pages at any size, with annotations and form widgets on or off
  • Text extraction in reading order, search with result rectangles
  • Read and write annotations: ink, notes, highlight, underline, strikeout
  • Read and fill AcroForm fields
  • Outlines, links, attachments, metadata; save in full or incrementally
  • Sign (PAdES B-B / B-T) and verify signatures
  • Real redaction: content leaves the saved bytes
  • Tag untagged PDFs for accessibility (PDF/UA-1)
  • A viewer component for iOS, Android and the Web
  • Optional AI module (summaries, redaction and form proposals, alt text) and an MCP server for agents

Install

Add it to your project.

The packages are not published yet. Until they are, build from source: see Getting a working checkout.

iOS — Swift Package Manager
.package(url: "https://github.com/pdfcora/pdfcora-swift", from: "0.1.0")
.product(name: "PDFCora",   package: "pdfcora-swift")
.product(name: "PDFCoraUI", package: "pdfcora-swift")
.product(name: "PDFCoraAI", package: "pdfcora-swift")

iOS 15+ · Swift 5.9 · async/await

Android — Gradle
implementation("com.pdfcora:pdfcora:0.1.0")
implementation("com.pdfcora:pdfcora-ui:0.1.0")
implementation("com.pdfcora:pdfcora-ai:0.1.0")

minSdk 23 · Kotlin coroutines · all four ABIs

Web — npm
npm install @pdfcora/web
npm install @pdfcora/web-ai     # optional
npm install pdfcora-mcp         # optional, for agents

TypeScript · WebAssembly · ESM · the .wasm ships inside the package

Node — npm
npm install @pdfcora/node
npm install @pdfcora/web-ai     # optional
npm install pdfcora-mcp         # optional, for agents

Node 18+ · the whole web API, plus file and PNG helpers · nothing to compile

Java — Gradle
implementation("com.pdfcora:pdfcora-java:0.1.0")

Java 17+ · macOS and Linux, x86-64 and arm64 · the engine is in the jar