A completely free, browser-based PDF editor that allows users to upload, edit, and download PDFs without any registration or authentication required.
This application does NOT save any customer data:
- โ Zero disk storage - All PDFs processed entirely in memory
- โ No database - No persistent data storage
- โ No file logging - No customer data in logs
- โ Memory-only processing - Files discarded immediately after response
- โ 100% stateless - No data retention whatsoever
See PRIVACY_STATUS.md for detailed privacy compliance information.
This project provides a modern, ad-supported PDF editing service that:
- Requires no user authentication or registration
- Shows a brief 5-second ad modal before editing begins
- Offers full PDF editing capabilities (text, drawings, highlights, signatures, text selection)
- Processes all files in memory - never saves to disk
- Is completely free to use
- 100% privacy compliant - no data storage or retention
- Text Annotations - Add custom text anywhere on the PDF
- Drawing Tool - Freehand drawing with customizable colors
- Highlights - Highlight important sections with color overlays
- Signatures - Add text-based signatures to documents
- Text Selection - Select and copy text directly from PDFs
- Annotation Selection - Click to select, move, resize annotations
- Multi-select - Select multiple annotations with Shift/Cmd+Click
- Undo/Redo - Full history support for all operations
- Zoom Controls - Zoom from 0.5x to 3x with accurate annotation positioning
- React + TypeScript - Modern, type-safe React application
- Tailwind CSS - Utility-first CSS framework for styling
- Material UI Icons - Professional icon set
- Framer Motion - Smooth animations and transitions
- Zustand - Lightweight state management
- i18next - Internationalization (English, Spanish, French)
- PDF.js - PDF rendering with text layer extraction for selection
- Vite - Fast build tool and dev server
- Node.js + Express - RESTful API server
- TypeScript - Type-safe backend code
- Multer (Memory Storage) - File upload handling (memory-only)
- pdf-lib - PDF manipulation and annotation rendering
- Helmet - Security middleware
- Rate Limiting - Prevent API abuse
- Winston - Console-only logging (no file logs)
- Ad Modal - 5-second countdown with non-intrusive ad display
- PDF Viewer - Interactive PDF rendering with page navigation and zoom controls
- Text Layer - Invisible text layer for native browser text selection
- Toolbar - Tools for text, drawing, highlighting, signatures, and selection
- Annotation Overlay - Renders annotations on top of PDF canvas
- Selection Overlay - Visual selection indicators with resize handles
- Download - Export edited PDFs instantly with annotations burned in
- PDF Coordinate System - Accurate coordinate conversion between CSS pixels and PDF points using PDF.js transform matrices
- Zoom-Independent Annotations - Annotations remain accurate across all zoom levels (0.5x - 3x)
- Text Selection - Native browser text selection with proper text layer alignment
- Non-destructive Editing - Annotations stored in PDF coordinate space, properly converted during export
- Memory-Only Processing - All file operations happen in RAM, zero disk writes
- Coordinate Transformation - Handles PDF.js (top-left origin) to pdf-lib (bottom-left origin) conversion
- Node.js 20+
- npm or yarn
- Docker (optional, for containerized deployment)
- Clone the repository:
git clone <repository-url>
cd Free_PDF_Editor- Install root dependencies:
npm install- Install frontend dependencies:
cd frontend
npm install
cd ..- Install backend dependencies:
cd backend
npm install
cd ..- Start the backend server:
npm run dev:backendServer will run at http://localhost:3000
- In a new terminal, start the frontend:
npm run dev:frontendFrontend will run at http://localhost:5173
- Build the application:
npm run build:frontend
npm run build:backend # Or just use tsx watch in dev mode- Start the server:
npm run start:backend- Build and run with Docker Compose:
docker-compose up --build- Access the application at
http://localhost:3000
Free_PDF_Editor/
โโโ frontend/ # React frontend application
โ โโโ src/
โ โ โโโ components/ # React components
โ โ โ โโโ PDFViewer.tsx # Main PDF viewer with annotation overlay
โ โ โ โโโ TextLayer.tsx # Text selection layer
โ โ โ โโโ SelectionOverlay.tsx # Selection indicators
โ โ โ โโโ Toolbar.tsx # Tool selection toolbar
โ โ โ โโโ AdModal.tsx # Ad display modal
โ โ โโโ pages/ # Page components
โ โ โ โโโ HomePage.tsx # Landing page
โ โ โ โโโ EditorPage.tsx # Main editor interface
โ โ โโโ store/ # Zustand state management
โ โ โ โโโ pdfStore.ts # PDF state and annotations
โ โ โโโ utils/ # Utility functions
โ โ โ โโโ coordinateUtils.ts # PDF coordinate conversion
โ โ โ โโโ annotationUtils.ts # Annotation hit testing
โ โ โ โโโ api.ts # API client
โ โ โโโ i18n/ # Internationalization (EN, ES, FR)
โ โ โโโ types/ # TypeScript type definitions
โ โโโ public/ # Static assets
โ โโโ package.json
โโโ backend/ # Node.js backend server
โ โโโ src/
โ โ โโโ controllers/ # Route controllers
โ โ โ โโโ pdf.controller.ts # PDF processing endpoints
โ โ โโโ services/ # Business logic
โ โ โ โโโ pdf.service.ts # PDF manipulation with pdf-lib
โ โ โโโ routes/ # API routes
โ โ โ โโโ pdf.routes.ts # PDF API routes
โ โ โโโ utils/ # Helper functions
โ โ โโโ logger.ts # Console-only logging
โ โ โโโ fileUtils.ts # File validation utilities
โ โโโ dist/ # Compiled TypeScript
โ โโโ package.json
โโโ Dockerfile # Docker container config
โโโ docker-compose.yml # Docker Compose configuration
โโโ setup.sh # Setup script for dependencies
โโโ QUICKSTART.md # Quick start guide
โโโ PRIVACY_STATUS.md # Privacy compliance documentation
โโโ DELETE_TEXT_PLAN.md # Plan for text deletion feature
โโโ package.json # Root package.json
Process a PDF with annotations and return the edited version.
Request:
file: PDF file (multipart/form-data)annotations: JSON array of annotations (with PDF coordinate points)
Response: Edited PDF file with annotations burned in
Annotation Format:
{
id: string;
type: 'text' | 'drawing' | 'highlight' | 'signature';
x: number; // PDF points (not pixels)
y: number; // PDF points (not pixels)
width?: number; // PDF points
height?: number; // PDF points
content?: string; // For text annotations
data?: string; // For drawing paths or signature images
color?: string; // Hex color string
pageNumber: number; // 1-indexed page number
}Compress a PDF to reduce file size.
Request:
file: PDF file (multipart/form-data)
Response: Compressed PDF file
Merge multiple PDFs into a single file.
Request:
files: Array of PDF files (multipart/form-data)
Response: Merged PDF file
Health check endpoint.
Response: { status: 'ok', timestamp: ... }
Create a .env file in the backend directory:
PORT=3000
NODE_ENV=development
FRONTEND_URL=http://localhost:5173
LOG_LEVEL=infoCreate a .env file in the frontend directory:
VITE_API_URL=http://localhost:3000/api- Helmet.js - Sets various HTTP headers for security
- Rate Limiting - Prevents API abuse (100 requests per 15 minutes per IP)
- File Type Validation - Only accepts PDF files
- File Size Limits - 50MB maximum file size
- HTTPS Ready - Configured for secure connections
- CORS Protection - Controlled cross-origin requests
- Memory-Only Storage - All files processed in RAM, never written to disk
- No Database - Zero persistent data storage
- No File Logging - Console logging only, no customer data logged
- No Temp Files - Temporary file operations disabled
- Stateless Architecture - No data retention between requests
- Immediate Cleanup - Files discarded from memory after processing
See PRIVACY_STATUS.md for complete privacy compliance details.
- Chrome (latest)
- Firefox (latest)
- Safari (latest)
- Edge (latest)
Contributions are welcome! Please feel free to submit a Pull Request.
- Basic PDF annotation tools (text, drawing, highlight, signature)
- Proper PDF coordinate system with zoom support
- Undo/redo history
- Text selection and copying from PDFs
- Annotation selection and visual feedback
- Multi-select annotations (Shift/Cmd+Click)
- Privacy-compliant architecture (memory-only processing)
- Text layer rendering for native text selection
- Delete existing PDF text (white-out overlay)
- Advanced PDF annotation tools (sticky notes, arrows)
- Drag-and-drop page reordering
- OCR text extraction
- PDF encryption/decryption
- Batch processing
- Mobile responsive optimization
- Font embedding for custom text fonts
- Collaborative editing features
- Text deletion implementation (see DELETE_TEXT_PLAN.md)
For issues, questions, or suggestions, please open an issue on the GitHub repository.
- PRIVACY_STATUS.md - Detailed privacy compliance information
- DELETE_TEXT_PLAN.md - Implementation plan for text deletion feature
- QUICKSTART.md - Quick start guide for developers
- PDF.js team - Browser-based PDF rendering and text extraction
- pdf-lib - PDF manipulation and annotation rendering
- React team - Amazing framework for building UIs
- All contributors and users - Thank you for using and improving this project
MIT License - feel free to use this project for personal or commercial purposes.