BentoPDF
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
Have questions, feature requests, or want to chat with the community? Join our Discord server!
📜 Licensing
BentoPDF is dual-licensed:
- AGPL-3.0 for open-source projects where you share your full source code publicly
- Commercial License for proprietary/closed-source applications - Get Lifetime License for $49 (a one-time lifetime purchase, includes all feature updates forever)
For more details, see our Licensing Page
⭐ Stargazers over time
✨ Why BentoPDF?
- 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.
🛠️ Features / Tools Supported
BentoPDF offers a comprehensive suite of tools to handle all your PDF needs.
Organize & Manage PDFs
| Tool Name | Description |
|---|---|
| Merge PDFs | Combine multiple PDF files into one. |
| 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. |
| 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. |
| 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. |
| 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. |
Edit & Modify PDFs
| Tool Name | Description |
|---|---|
| PDF Editor | A comprehensive editor to modify your 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. |
| 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. |
| 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. |
| Fill Forms | Fill out PDF forms directly in your browser. |
| 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. |
Convert to PDF
| Tool Name | Description |
|---|---|
| Image to PDF | Convert JPG, PNG, WebP, SVG, BMP, HEIC, and TIFF images to PDF. |
| JPG to PDF | Convert JPG 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. |
| Markdown to PDF | Convert .md files into professional PDF documents. |
| Text to PDF | Convert plain text files into a PDF. |
| JSON to PDF | Convert JSON to PDF. |
Convert from 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 Greyscale | Convert a color PDF into a black-and-white version. |
| OCR PDF | Make scanned PDFs searchable and copyable using Optical Character Recognition. |
| PDF to JSON | Convert PDF files to JSON format. |
Secure & Optimize PDFs
| 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 | Add your digital signature to a document. |
| 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 view. |
| Sanitize PDF | Remove potentially unwanted or malicous files from PDF. |
| 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. |
🌍 Translations
BentoPDF is available in multiple languages:
| Language | Status |
|---|---|
| English | |
| German |
Want to help translate BentoPDF into your language? Check out our Translation Guide!
🚀 Getting Started
You can run BentoPDF locally for development or personal use.
Prerequisites
- Node.js (v18 or higher recommended)
- npm (or yarn/pnpm)
- Docker & Docker Compose (for containerized setup)
🚀 Quick Start with Docker
You can run BentoPDF directly from Docker Hub or GitHub Container Registry without cloning the repository:
You can also watch the video on how to set it up 👉 BentoPDF Docker Setup
Using Docker Hub:
docker run -p 3000:8080 bentopdf/bentopdf:latest
Using GitHub Container Registry:
docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest
Open your browser at: http://localhost:3000
This is the fastest way to try BentoPDF without setting up a development environment.
🏠 Self-Hosting
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
Navigate to the extracted Folder:
# Navigate to the extracted folder
cd dist-1.7.3 # Replace with your version
Serve with Python:
# For Python 3
python -m http.server 8000
The website can be accessible at: http://[::1]:8000/
Serve with Node.js:
# Install a simple server
npx serve .
# Or if you have serve installed globally
npm install -g serve
serve .
The website can be accessible at: http://localhost:3000/
Serve with other tools:
You can also use other static file servers like:
- Go:
go run main.gowith a simple Go server - PHP:
php -S localhost:8000 - Ruby:
ruby -run -e httpd . -p 8000
The website can be accessible at:
- Go:
http://localhost:8080/(default) or as specified - PHP:
http://localhost:8000/ - Ruby:
http://localhost:8000/(default port can be changed)
Simply serve the extracted folder using any static file server, and BentoPDF will work completely client-side without any server-side dependencies.
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
# Serve the dist folder
npx serve dist
The website can be accessible at: http://localhost:3000/
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-test
The 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-simple
Important
: Always include trailing slashes in
BASE_URL(e.g.,/bentopdf/not/bentopdf). The default value is/for root deployment.
🚀 Run with Docker Compose (Recommended)
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: bentopdf/bentopdf:latest
container_name: bentopdf
ports:
- '3000:8080'
restart: unless-stopped
- Start the application:
docker-compose up -d
The application will be available at http://localhost:3000.
🏢 Simple Mode for Internal Use
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.
🔒 Security Features
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
Basic Usage
docker build -t bentopdf .
docker run -p 8080:8080 bentopdf
For detailed security configuration, see SECURITY.md.
📦 Version Management
BentoPDF supports semantic versioning with multiple Docker tags available on both Docker Hub and GitHub Container Registry:
Docker Hub:
- Latest:
bentopdf/bentopdf:latest - Specific Version:
bentopdf/bentopdf:1.0.0 - Version with Prefix:
bentopdf/bentopdf:v1.0.0
GitHub Container Registry:
- 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
Quick Release
# 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:major
For detailed release instructions, see RELEASE.md.
🚀 Development Setup
Option 1: Run with npm
-
Clone the Repository:
git clone https://github.com/alam00000/bentopdf.git cd bentopdf -
Install Dependencies:
npm install -
Run the Development Server:
npm run devThe application will be available at
http://localhost:5173.
Option 2: Build and Run with Docker Compose
-
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 -dThe 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 -dThis ensures your latest changes are applied inside the container.
🛠️ Tech Stack & Background
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.
🗺️ Roadmap
Planned Features:
- 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.
🤝 Contributing
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.
Special Thanks
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:
- 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– A powerful command-line tool and library for inspecting, repairing, and transforming PDF file ported to wasm
- cpdf – For content preserving pdf operations.
Your work inspires and empowers developers everywhere. Thank you for making open-source amazing!
