Convert PDF files to dark mode with pixel-perfect rendering and preserved text layer.
Built with MuPDF.js (the same C engine as PyMuPDF) — no wrong text, no wrong fonts.
npm install -g pdf-darkerOr use directly with pnpm:
git clone <repo>
cd pdf-darker
pnpm install
pnpm build# Basic conversion (output: input-dark.pdf)
pnpm convert input.pdf
# Specify output path
pnpm convert input.pdf output-dark.pdf
# With options
pnpm convert input.pdf --dpi 200 --no-text
# Or globally installed
pdf-darker input.pdf output-dark.pdf# Start the web server on http://localhost:3000
pnpm serverimport { Converter } from '@pdf-darker/core';
const converter = new Converter();
const result = await converter.convert(
'input.pdf',
'output-dark.pdf',
{
dpi: 300,
quality: 95,
preserveText: true,
preserveForms: true,
preserveLinks: true,
},
(progress) => {
console.log(`Page ${progress.page}/${progress.totalPages} — ${progress.phase}`);
},
);
console.log(`Done! ${result.pageCount} pages in ${result.durationMs}ms`);| Flag | Type | Default | Description |
|---|---|---|---|
--dpi, -d |
number | 300 | Rendering resolution |
--quality, -q |
number | 95 | Image quality (1–100) |
--no-text |
boolean | true | Disable hidden text layer |
- Render each page to a high-resolution image via MuPDF
- Apply luminance inversion — preserves hue while inverting brightness
- Apply gamma correction — boosts midtones for readability
- Create new PDF with inverted page images
- Overlay hidden text layer — keeps text selectable and searchable
packages/
├── shared/ — Types and constants
├── core/ — PDF engine (MuPDF.js WASM)
├── tui/ — Terminal UI (Ink + React)
└── ui/ — Web UI (React + Vite + HTTP server)
See ARCHITECTURE.md and ALGORITHM.md for details.
AGPL-3.0 (same as MuPDF.js)