Client-side
DELETE PAGES
Select and remove specific pages from a PDF document to create a new, trimmed PDF instantly.
Drag & drop a PDF file here, or click to browse
Supports single .pdf file
About Delete PDF Pages Tool
Delete PDF Pages is designed to help you quickly trim and clean up your documents by removing unnecessary pages. Simply upload your PDF, specify the pages or ranges you wish to discard, and the tool will construct a new, optimized PDF file instantly.
Like all tools on toolpad.cc, page removal is processed locally via client-side JavaScript. This ensures that no data leaves your device, making it highly secure for handling confidential logs, bank statements, or sensitive business reports.
Developer Reference
Core Algorithm & Standalone Script
Standalone, zero-dependency JavaScript implementation powering this tool. Free to inspect, copy, and build upon.
let currentPdfBytes = null;
let totalPages = 0;
let fileNameStr = '';
const uploadZone = document.getElementById('uploadZone');
const fileInput = document.getElementById('fileInput');
const configPanel = document.getElementById('configPanel');
const fileNameEl = document.getElementById('fileName');
const pageCountEl = document.getElementById('pageCount');
const pagesToRemoveInput = document.getElementById('pagesToRemove');
const removeBtn = document.getElementById('removeBtn');
const loadingContainer = document.getElementById('loadingContainer');
const resultContainer = document.getElementById('resultContainer');
const resultInfo = document.getElementById('resultInfo');
const downloadBtn = document.getElementById('downloadBtn');
// Drag and drop event listeners
['dragenter', 'dragover'].forEach(eventName => {
uploadZone.addEventListener(eventName, e => {
e.preventDefault();
uploadZone.classList.add('dragover');
}, false);
});
['dragleave', 'drop'].forEach(eventName => {
uploadZone.addEventListener(eventName, e => {
e.preventDefault();
uploadZone.classList.remove('dragover');
}, false);
});
uploadZone.addEventListener('drop', e => {
const dt = e.dataTransfer;
const files = dt.files;
if (files.length > 0) handleFile(files[0]);
});
fileInput.addEventListener('change', e => {
if (e.target.files.length > 0) handleFile(e.target.files[0]);
});
async function handleFile(file) {
if (file.type !== 'application/pdf') return;
fileNameStr = file.name;
try {
currentPdfBytes = await file.arrayBuffer();
const { PDFDocument } = PDFLib;
const pdf = await PDFDocument.load(currentPdfBytes);
totalPages = pdf.getPageCount();
fileNameEl.textContent = file.name;
pageCountEl.textContent = `${totalPages} page${totalPages > 1 ? 's' : ''}`;
configPanel.classList.remove('hidden');
resultContainer.classList.add('hidden');
} catch (err) {
console.error(err);
alert('Could not read PDF file. Make sure it is not encrypted.');
}
}
function parsePageRanges(rangeStr, maxPage) {
const pages = new Set();
const parts = rangeStr.split(',');
for (let part of parts) {
part = part.trim();
if (!part) continue;
if (part.includes('-')) {
const bounds = part.split('-');
const start = parseInt(bounds[0].trim());
const end = parseInt(bounds[1].trim());
if (!isNaN(start) && !isNaN(end)) {
const low = Math.min(start, end);
const high = Math.min(Math.max(start, end), maxPage);
for (let i = low; i <= high; i++) {
if (i >= 1 && i <= maxPage) pages.add(i);
}
}
} else {
const num = parseInt(part);
if (!isNaN(num) && num >= 1 && num <= maxPage) {
pages.add(num);
}
}
}
return Array.from(pages);
}
function formatBytes(bytes, decimals = 2) {
if (bytes === 0) return '0 Bytes';
const k = 1024;
const dm = decimals < 0 ? 0 : decimals;
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
}
removeBtn.addEventListener('click', async () => {
if (!currentPdfBytes) return;
const pageStr = pagesToRemoveInput.value.trim();
if (!pageStr) {
alert('Please specify the page numbers or ranges to remove.');
return;
}
const pagesToRemove = parsePageRanges(pageStr, totalPages);
if (pagesToRemove.length === 0) {
alert('No valid pages found to remove. Please check your range format.');
return;
}
if (pagesToRemove.length >= totalPages) {
alert('Cannot remove all pages from the PDF document.');
return;
}
configPanel.classList.add('hidden');
loadingContainer.classList.remove('hidden');
resultContainer.classList.add('hidden');
try {
const { PDFDocument } = PDFLib;
const pdfDoc = await PDFDocument.load(currentPdfBytes);
// Sort indices to delete in descending order
// pagesToRemove uses 1-based indexing, convert to 0-based
const indicesToDelete = pagesToRemove.map(p => p - 1);
indicesToDelete.sort((a, b) => b - a);
for (const idx of indicesToDelete) {
pdfDoc.removePage(idx);
}
const trimmedBytes = await pdfDoc.save();
const blob = new Blob([trimmedBytes], { type: 'application/pdf' });
const blobUrl = URL.createObjectURL(blob);
downloadBtn.href = blobUrl;
const nameWithoutExt = fileNameStr.replace(/\.[^/.]+$/, "");
downloadBtn.download = `${nameWithoutExt}_trimmed.pdf`;
resultInfo.textContent = `Removed ${pagesToRemove.length} page(s). Remaining: ${totalPages - pagesToRemove.length} page(s). File size: ${formatBytes(blob.size)}.`;
loadingContainer.classList.add('hidden');
resultContainer.classList.remove('hidden');
} catch (err) {
console.error(err);
alert('An error occurred while removing pages.');
loadingContainer.classList.add('hidden');
configPanel.classList.remove('hidden');
}
});