BentoPDF is a powerful, privacy-first, client-side PDF toolkit that is self hostable and allows you to manipulate, edit, merge, and process PDF files directly in your browser. No server-side processing is required, ensuring your files remain secure and private.
- Join Us on Discord
- Documentation
- Licensing
- Stargazers over time
- Thank You to Our Sponsors
- Why BentoPDF?
- Features / Tools Supported
- Translations
- Getting Started
- Tech Stack & Background
- Roadmap
- Contributing
- Special Thanks
Have questions, feature requests, or want to chat with the community? Join our Discord server!
Visit our Documentation for:
- Getting Started guide
- Tools Reference (50+ tools)
- Self-Hosting guides (Docker, Vercel, Netlify, Cloudflare, AWS, Hostinger, Nginx, Apache)
- Contributing guide
- Commercial License details
BentoPDF is dual-licensed to fit your needs:
| License | Best For | Price |
|---|---|---|
| AGPL-3.0 | Open-source projects with public source code | Free |
| Commercial | Proprietary / closed-source applications | $49 (lifetime) |
One-time purchase Β· Unlimited devices & users Β· Lifetime updates Β· No AGPL obligations
π For more details, see our Licensing Page
BentoPDF does not bundle AGPL-licensed processing libraries. The following components must be configured separately via Advanced Settings if you wish to use their features:
| Component | License | Features Enabled |
|---|---|---|
| PyMuPDF | AGPL-3.0 | PDF to Text/Markdown/SVG/DOCX, Extract Images/Tables, EPUB/MOBI/XPS conversion, Compression, Deskew |
| Ghostscript | AGPL-3.0 | PDF/A Conversion, Font to Outline |
| CoherentPDF (CPDF) | AGPL-3.0 | Merge, Split by Bookmarks, Table of Contents, PDF to/from JSON, Attachments |
Why? This separation ensures clear legal boundaries. Users who need these features can configure their own WASM sources or use our optional WASM Proxy to load them from external URLs.
To enable these features:
- Navigate to Advanced Settings in BentoPDF
- Configure the URL for each WASM module you need
- The modules will be loaded dynamically when required
We're incredibly grateful to all our sponsors and supporters who help keep BentoPDF free and open source!
- Privacy First: All processing happens in your browser. Your files are never uploaded to a server, guaranteeing 100% privacy.
- No Limits: Manipulate as many files as you want, as often you want. There are no restrictions or upload limits.
- High Performance: Built with modern web technologies, BentoPDF is fast and efficient, handling even large PDF files with ease.
- Completely Free: BentoPDF is a free and open-source tool for everyone.
BentoPDF offers a comprehensive suite of tools to handle all your PDF needs.
| Tool Name | Description |
|---|---|
| Merge PDFs | Combine multiple PDF files into one. Preserves Bookmarks. |
| Split PDFs | Extract specific pages or divide a document into smaller files. |
| Organize Pages | Reorder, duplicate, or delete pages with a simple drag-and-drop interface. |
| Extract Pages | Save a specific range of pages as a new PDF. |
| Delete Pages | Remove unwanted pages from your document. |
| Rotate PDF | Rotate individual or all pages in a document. |
| Rotate by Custom Degrees | Rotate pages by any custom angle. |
| N-Up PDF | Combine multiple pages onto a single page. |
| View PDF | A powerful, integrated PDF viewer. |
| Alternate & Mix Pages | Merge pages by alternating pages from each PDF. Preserves Bookmarks. |
| Posterize PDF | Split a PDF into multiple smaller pages for print. |
| PDF Multi Tool | Merge, Split, Organize, Delete, Rotate, Add Blank Pages, Extract and Duplicate in an unified interface. |
| PDF Booklet | Rearrange pages for double-sided booklet printing. Fold and staple to create a booklet. |
| Add Attachments | Embed one or more files into your PDF. |
| Extract Attachments | Extract all embedded files from PDF(s) as a ZIP. |
| Edit Attachments | View or remove attachments in your PDF. |
| Divide Pages | Divide pages horizontally or vertically. |
| Combine to Single Page | Stitch all pages into one continuous scroll. |
| Add Blank Page | Insert an empty page anywhere in your PDF. |
| Reverse Pages | Flip the order of all pages in your document. |
| View Metadata | Inspect the hidden properties of your PDF. |
| PDFs to ZIP | Package multiple PDF files into a ZIP archive. |
| Compare PDFs | Compare two PDFs side by side. |
| Tool Name | Description |
|---|---|
| PDF Editor | Annotate, highlight, redact, comment, add shapes/images, search, and view PDFs. |
| Create Fillable Forms | Create professional fillable PDF forms with text fields, checkboxes, dropdowns, radio buttons, signatures, and more. Fully compliant with PDF standards for compatibility with all PDF viewers. |
| PDF Form Filler | Fill in forms directly in the browser. Also supports XFA forms. |
| Add Page Numbers | Easily add page numbers with customizable formatting. |
| Add Watermark | Add text or image watermarks to protect your documents. |
| Header & Footer | Add customizable headers and footers. |
| Crop PDF | Crop specific pages or the entire document. |
| Deskew PDF | Automatically straighten tilted scanned pages using OpenCV. |
| Font to Outline | Convert all fonts to vector outlines for consistent rendering across all devices. |
| Invert Colors | Invert the colors of your PDF pages for better readability. |
| Change Background | Modify the background color of your PDF. |
| Change Text Color | Change the color of text content within the PDF. |
| Flatten PDF | Flatten form fields and annotations into static content. |
| Remove Annotations | Remove comments, highlights, and other annotations. |
| Remove Blank Pages | Auto detect and remove blank pages in a PDF. |
| Edit Bookmarks | Add, Edit, Create, Import and Export PDF Bookmarks. |
| Add Stamps | Add image stamps to your PDF using the annotation toolbar. |
| Table of Contents | Generate a table of contents page from PDF bookmarks. |
| Redact Content | Permanently remove sensitive content from your PDFs. |
| Tool Name | Description |
|---|---|
| Image to PDF | Convert JPG, PNG, BMP, GIF, TIFF, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2, PSD, SVG, HEIC, WebP to PDF. |
| JPG to PDF | Convert JPG, JPEG, and JPEG2000 (JP2/JPX) images to PDF. |
| PNG to PDF | Convert PNG images to PDF. |
| WebP to PDF | Convert WebP images to PDF. |
| SVG to PDF | Convert SVG images to PDF. |
| BMP to PDF | Convert BMP images to PDF. |
| HEIC to PDF | Convert HEIC images to PDF. |
| TIFF to PDF | Convert TIFF images to PDF. |
| PSD to PDF | Convert Adobe Photoshop (PSD) files to PDF. |
| Word to PDF | Convert Word documents (DOCX, DOC, ODT, RTF) to PDF. |
| Excel to PDF | Convert Excel spreadsheets (XLSX, XLS, ODS, CSV) to PDF. |
| PowerPoint to PDF | Convert PowerPoint presentations (PPTX, PPT, ODP) to PDF. |
| ODT to PDF | Convert OpenDocument Text files to PDF. |
| ODS to PDF | Convert OpenDocument Spreadsheet (ODS) files to PDF. |
| ODP to PDF | Convert OpenDocument Presentation (ODP) files to PDF. |
| ODG to PDF | Convert OpenDocument Graphics (ODG) files to PDF. |
| RTF to PDF | Convert Rich Text Format documents to PDF. |
| CSV to PDF | Convert CSV spreadsheet files to PDF. |
| Markdown to PDF | Write or paste Markdown and export it as a beautifully formatted PDF. |
| Text to PDF | Convert plain text files into a PDF. |
| JSON to PDF | Convert JSON files to PDF. |
| XML to PDF | Convert XML documents to PDF. |
| EPUB to PDF | Convert EPUB e-books to PDF. |
| MOBI to PDF | Convert MOBI e-books to PDF. |
| FB2 to PDF | Convert FictionBook (FB2) e-books to PDF. |
| CBZ to PDF | Convert comic book archives (CBZ/CBR) to PDF. |
| XPS to PDF | Convert XPS/OXPS documents to PDF. |
| Email to PDF | Convert email files (EML, MSG) to PDF. Supports Outlook exports. |
| Pages to PDF | Convert Apple Pages documents to PDF. |
| WPD to PDF | Convert WordPerfect documents (WPD) to PDF. |
| WPS to PDF | Convert WPS Office documents to PDF. |
| PUB to PDF | Convert Microsoft Publisher (PUB) files to PDF. |
| VSD to PDF | Convert Microsoft Visio (VSD, VSDX) files to PDF. |
| Tool Name | Description |
|---|---|
| PDF to Image | Convert PDF pages to JPG, PNG, WebP, BMP, or TIFF formats. |
| PDF to JPG | Convert each PDF page into a JPG image. |
| PDF to PNG | Convert each PDF page into a PNG image. |
| PDF to WebP | Convert each PDF page into a WebP image. |
| PDF to BMP | Convert each PDF page into a BMP image. |
| PDF to TIFF | Convert each PDF page into a TIFF image. |
| PDF to SVG | Convert each page into a scalable vector graphic (SVG) for perfect quality. |
| PDF to Greyscale | Convert a color PDF into a black-and-white version. |
| PDF to Text | Extract text from PDF files and save as plain text (.txt). |
| PDF to JSON | Convert PDF files to JSON format. |
| PDF to CSV | Extract tables from PDF and convert to CSV format. |
| PDF to Excel | Extract tables from PDF and convert to Excel (XLSX) format. |
| Extract Tables | Extract tables from PDF files and export as CSV, JSON, or Markdown. |
| OCR PDF | Make scanned PDFs searchable and copyable using Optical Character Recognition. |
| Tool Name | Description |
|---|---|
| Compress PDF | Reduce file size while maintaining quality. |
| Repair PDF | Attempt to repair and recover data from a corrupted PDF. |
| Encrypt PDF | Add a password to protect your PDF from unauthorized access. |
| Decrypt PDF | Remove password protection from a PDF (password required). |
| Change Permissions | Set or modify user permissions for printing, copying, and editing. |
| Sign PDF | Draw, type, or upload your signature. |
| Digital Signature | Add cryptographic digital signatures using X.509 certificates (PFX/PEM). Private key never leaves browser. |
| Validate Signature | Verify digital signatures, check certificate validity, and confirm document integrity. |
| Redact Content | Permanently remove sensitive content from your PDFs. |
| Edit Metadata | View and modify PDF metadata (author, title, keywords, etc.). |
| Remove Metadata | Strip all metadata from your PDF for privacy. |
| Linearize PDF | Optimize PDF for fast web viewing. |
| Sanitize PDF | Remove metadata, annotations, scripts, and more. |
| Fix Page Size | Standardize all pages to a uniform size. |
| Page Dimensions | Analyze page size, orientation, and units. |
| Remove Restrictions | Remove password protection and security restrictions associated with digitally signed PDF files. |
BentoPDF is available in multiple languages:
| Language | Status |
|---|---|
| English | |
| Chinese | |
| Traditional Chinese | |
| French | |
| German | |
| Indonesian | |
| Italian | |
| Portuguese | |
| Turkish | |
| Vietnamese |
Want to help translate BentoPDF into your language? Check out our Translation Guide!
You can run BentoPDF locally for development or personal use.
- Node.js (v18 or higher recommended)
- npm (or yarn/pnpm)
- Docker & Docker Compose (for containerized setup)
Run BentoPDF instantly from GitHub Container Registry (Recommended):
docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latestOpen your browser at: http://localhost:3000
Alternative: Using Docker Hub or Podman
Docker Hub:
docker run -p 3000:8080 bentopdfteam/bentopdf:latestPodman (GHCR):
podman run -p 3000:8080 ghcr.io/alam00000/bentopdf:latestPodman (Docker Hub):
podman run -p 3000:8080 docker.io/bentopdfteam/bentopdf:latestNote: All
dockercommands in this documentation work with Podman by replacingdockerwithpodman.
It is very straightforward to host your own instance of BentoPDF using a static web page hosting service. Plus, services such as Netlify, Vercel, and GitHub Pages all offer a free tier for getting started. See Static Hosting for details.
Since BentoPDF is fully client-side, all processing happens in the user's browser and no server-side processing is required. This means you can host BentoPDF as simple static files on any web server or hosting platform.
Download from Releases (Recommended):
The easiest way to self-host is to download the pre-built distribution file from our GitHub releases. Each release includes a dist-{version}.zip file that contains all necessary files for self-hosting.
- Go to BentoPDF Releases
- Download the latest
dist-{version}.zipfile - Extract the zip file
- Serve the extracted folder with your preferred web server
Serve the extracted folder (requires Node.js):
# Navigate to the extracted folder
cd dist-1.7.3 # Replace with your version
# Start a local server
npx http-server -c-1The website will be accessible at: http://localhost:8080/
Note: The
-c-1flag disables caching for development.
Build from Source (Advanced):
If you prefer to build from source:
# Clone the repository
git clone https://github.com/alam00000/bentopdf.git
cd bentopdf
# Install dependencies
npm install
# Build the project
npm run build
# Package the distribution for hosting (optional)
npm run package
# Preview the build locally
npm run preview
# The website will be accessible at: http://localhost:4173/
Compression Modes:
BentoPDF supports different compression modes for optimized builds:
# Gzip only (smallest Docker image size)
npm run build:gzip
docker build --build-arg COMPRESSION_MODE=g -t bentopdf:gzip .
# Brotli only (best compression ratio)
npm run build:brotli
docker build --build-arg COMPRESSION_MODE=b -t bentopdf:brotli .
# No compression (fastest build time)
npm run build:original
docker build --build-arg COMPRESSION_MODE=o -t bentopdf:original .
# All formats (default, maximum browser compatibility)
npm run build:all
docker build --build-arg COMPRESSION_MODE=all -t bentopdf:all .| Mode | Files Kept | Use Case |
|---|---|---|
g |
.gz only |
Standard nginx or minimal size |
b |
.br only |
Modern CDN with Brotli support |
o |
originals | Development or custom compression |
all |
all formats | Maximum compatibility (default) |
CDN Optimization:
BentoPDF can use jsDelivr CDN to serve large WASM files (LibreOffice, Ghostscript, PyMuPDF) for improved performance and reduced bandwidth costs:
# Production build with CDN (Recommended)
VITE_USE_CDN=true npm run build
# Standard build with local files only
npm run buildHow it works:
- When
VITE_USE_CDN=true: Browser loads WASM files from jsDelivr CDN (fast, global delivery) - Local files are always included as automatic fallback
- If CDN fails then it falls back to local files
Subdirectory Hosting:
BentoPDF can also be hosted from a subdirectory (e.g., example.com/tools/bentopdf/):
# Example:
# 1. Build the app with the specific BASE_URL. BASE_URL must have a trailing and leading slash. The BASE_URL can be any url of your choice. Here we are using /tools/bentopdf/ as an example.
BASE_URL=/tools/bentopdf/ npm run build
# 2. Create the nested directory structure inside serve-test (or any folder of your choice for local testing. In case of production, create the nested directory structure inside the root directory)
mkdir -p serve-test/tools/bentopdf
# 3. Copy all files from the 'dist' folder into that nested directory
cp -r dist/* serve-test/tools/bentopdf/
# 4. Serve the 'serve-test' folder
npx serve serve-testThe website can be accessible at: http://localhost:3000/tools/bentopdf/
The npm run package command creates a dist-{version}.zip file that you can use for self-hosting.
Docker Subdirectory Deployment:
BentoPDF's Docker image also supports the BASE_URL build argument for subdirectory deployments:
# Build for subdirectory deployment
docker build --build-arg BASE_URL=/bentopdf/ -t bentopdf .
# Run the container
docker run -p 3000:8080 bentopdf
# The app will be accessible at http://localhost:3000/bentopdf/Combined with Simple Mode:
# Build with both BASE_URL and SIMPLE_MODE
docker build \
--build-arg BASE_URL=/tools/pdf/ \
--build-arg SIMPLE_MODE=true \
-t bentopdf-simple .
docker run -p 3000:8080 bentopdf-simpleImportant:
- Always include trailing slashes in
BASE_URL(e.g.,/bentopdf/not/bentopdf)- The default value is
/for root deployment
For a more robust setup with auto-restart capabilities:
- Download the repo and create a
docker-compose.ymlfile or use the one given in repo:
services:
bentopdf:
image: ghcr.io/alam00000/bentopdf:latest # Recommended
# image: bentopdfteam/bentopdf:latest # Alternative: Docker Hub
container_name: bentopdf
ports:
- '3000:8080'
restart: unless-stopped- Start the application:
# Docker Compose
docker-compose up -d
# Podman Compose
podman-compose up -dThe application will be available at http://localhost:3000.
For Linux production deployments, you can run BentoPDF as a systemd service using Podman Quadlet.
Create ~/.config/containers/systemd/bentopdf.container:
[Unit]
Description=BentoPDF - Privacy-first PDF toolkit
After=network-online.target
[Container]
Image=ghcr.io/alam00000/bentopdf:latest
ContainerName=bentopdf
PublishPort=3000:8080
AutoUpdate=registry
[Service]
Restart=always
[Install]
WantedBy=default.targetThen enable and start:
systemctl --user daemon-reload
systemctl --user enable --now bentopdfFor detailed Quadlet configuration, see Self-Hosting Docker Guide.
For organizations that want a clean, distraction-free interface focused solely on PDF tools, BentoPDF supports a Simple Mode that hides all branding and marketing content.
What Simple Mode does:
- Hides navigation, hero section, features, FAQ, testimonials, and footer
- Shows only the essential PDF tools
- Updates page title to "PDF Tools"
- Perfect for internal company tools and educational institutions
For more details, see SIMPLE_MODE.md.
BentoPDF runs as a non-root user using nginx-unprivileged for enhanced security:
- Non-Root Execution: Container runs with minimal privileges using nginx-unprivileged
- Port 8080: Uses high port number to avoid requiring root privileges
- Security Best Practices: Follows Principle of Least Privilege
docker build -t bentopdf .
docker run -p 8080:8080 bentopdfFor detailed security configuration, see SECURITY.md.
The Digital Signature tool uses a signing library that may need to fetch certificate chain data from certificate authority provider. Since many certificate servers don't include CORS headers, a proxy is required for this feature to work in the browser.
When is the proxy needed?
- Only when using the Digital Signature tool
- Only if your certificate requires fetching issuer certificates from external URLs
- Self-signed certificates typically don't need this
Deploying the CORS Proxy (Cloudflare Workers):
-
Navigate to the cloudflare directory:
cd cloudflare -
Login to Cloudflare (if not already):
npx wrangler login
-
Deploy the worker:
npx wrangler deploy
-
Note your worker URL (e.g.,
https://bentopdf-cors-proxy.your-subdomain.workers.dev) -
Set the environment variable when building:
VITE_CORS_PROXY_URL=https://your-worker-url.workers.dev npm run build
The CORS proxy includes several security measures:
| Feature | Description |
|---|---|
| URL Restrictions | Only allows certificate URLs (.crt, .cer, .pem, /certs/, /ocsp) |
| Private IP Blocking | Blocks requests to localhost, 10.x, 192.168.x, 172.16-31.x |
| File Size Limit | Rejects files larger than 10MB |
| Rate Limiting | 60 requests per IP per minute (requires KV) |
| HMAC Signatures | Optional client-side signing (limited protection) |
Rate limiting requires Cloudflare KV storage:
cd cloudflare
# Create KV namespace
npx wrangler kv namespace create "RATE_LIMIT_KV"
# Copy the returned ID and add to wrangler.toml:
# [[kv_namespaces]]
# binding = "RATE_LIMIT_KV"
# id = "YOUR_ID_HERE"
# Redeploy
npx wrangler deployFree tier limits: 100,000 reads/day, 1,000 writes/day (~300-500 signatures/day)
β οΈ Security Warning: Client-side secrets can be extracted from bundled JavaScript. For production deployments with sensitive requirements, use your own backend server to proxy requests instead of embedding secrets in frontend code.
BentoPDF uses client-side HMAC as a deterrent against casual abuse, but accepts this tradeoff due to its fully client-side architecture. To enable:
# Generate a secret
openssl rand -hex 32
# Set on Cloudflare Worker
npx wrangler secret put PROXY_SECRET
# Set in build environment
VITE_CORS_PROXY_SECRET=your-secret npm run buildBentoPDF supports semantic versioning with multiple container tags available:
GitHub Container Registry (Recommended):
- Latest:
ghcr.io/alam00000/bentopdf:latest - Specific Version:
ghcr.io/alam00000/bentopdf:1.0.0 - Version with Prefix:
ghcr.io/alam00000/bentopdf:v1.0.0
Docker Hub:
- Latest:
bentopdfteam/bentopdf:latest - Specific Version:
bentopdfteam/bentopdf:1.0.0 - Version with Prefix:
bentopdfteam/bentopdf:v1.0.0
# Release a patch version (0.0.1 β 0.0.2)
npm run release
# Release a minor version (0.0.1 β 0.1.0)
npm run release:minor
# Release a major version (0.0.1 β 1.0.0)
npm run release:majorFor detailed release instructions, see RELEASE.md.
-
Clone the Repository:
git clone https://github.com/alam00000/bentopdf.git cd bentopdf -
Install Dependencies:
npm install
-
Run the Development Server:
npm run dev
The application will be available at
http://localhost:5173.
-
Clone the Repository:
git clone https://github.com/alam00000/bentopdf.git cd bentopdf -
Run with Docker Compose:
docker-compose -f docker-compose.dev.yml up -d
The application will be available at
http://localhost:3000.Note: After making any local changes to the code, rebuild the Docker image using:
docker-compose -f docker-compose.dev.yml up --build -d
This ensures your latest changes are applied inside the container.
BentoPDF was originally built using HTML, CSS, and vanilla JavaScript. As the project grew, it was migrated to a modern stack for better maintainability and scalability:
- Vite: A fast build tool for modern web development.
- TypeScript: For type safety and an improved developer experience.
- Tailwind CSS: For rapid and consistent UI development.
Note: Some parts of the codebase still use legacy structures from the original implementation. Contributors should expect gradual updates as testing and refactoring continue.
- HTML to PDF: Convert HTML files or web pages into PDF documents.
- Markdown to PDF: Enhanced support for converting
.mdfiles to PDF. - Convert to PDF/A: Convert PDFs to the PDF/A archival format.
- Edit PDF Content: Directly edit text and other content within your PDF.
- PDF to Office: Converts PDF files into editable Word, Excel, and PowerPoint formats.
- Office to PDF: Converts Word, Excel, and PowerPoint documents into optimized PDFs.
Contributions and discussions on the roadmap are welcome! Join the conversation via Discord.
We welcome contributions from the community! Here's how you can get started:
- Fork the repository and create your branch from
main. - Follow the Getting Started steps to set up your local environment.
- Make your changes and commit them with a clear message.
- Open a Pull Request and describe the changes you've made.
Have an idea for a new tool or an improvement? Open an issue to discuss it first.
Our documentation is built with VitePress. Here's how to contribute:
# Install dependencies
npm install
# Start docs dev server
npm run docs:dev
# Build docs for production
npm run docs:build
# Preview the built docs
npm run docs:previewDocumentation files are in the docs/ folder:
docs/index.md- Home pagedocs/getting-started.md- Getting started guidedocs/tools/- Tools referencedocs/self-hosting/- Self-hosting guides (Docker, Vercel, Netlify, Hostinger, etc.)docs/contributing.md- Contributing guidedocs/licensing.md- Commercial license info
BentoPDF wouldn't be possible without the amazing open-source tools and libraries that power it. We'd like to extend our heartfelt thanks to the creators and maintainers of:
Bundled Libraries:
- PDFLib.js β For enabling powerful client-side PDF manipulation.
- PDF.js β For the robust PDF rendering engine in the browser.
- PDFKit β For creating and editing PDFs with ease.
- EmbedPDF β For seamless PDF editing in pure JS.
- Cropper.js β For intuitive image cropping functionality.
- Vite β For lightning-fast development and build tooling.
- Tailwind CSS β For rapid, flexible, and beautiful UI styling.
- qpdf and qpdf-wasm β For inspecting, repairing, and transforming PDF files.
- LibreOffice β For powerful document conversion capabilities.
AGPL Libraries (Not Bundled - User Configured):
- CoherentPDF (cpdf) β For content-preserving PDF operations. (AGPL-3.0)
- PyMuPDF β For high-performance PDF manipulation and data extraction. (AGPL-3.0)
- Ghostscript (GhostPDL) β For PDF/A conversion and font outlining. (AGPL-3.0)
Note: AGPL-licensed libraries are not bundled with BentoPDF. Users can optionally configure these via Advanced Settings to enable additional features.
Your work inspires and empowers developers everywhere. Thank you for making open-source amazing!
