Ultimate Guide to Splitting PDF Files Online in 2026
A PDF splitter helps you divide one large PDF into smaller files. This tool works directly in your browser, so your document stays on your device and is not uploaded to a server.
What this Split PDF tool can do
- Split by custom page ranges such as 1-3, 4-8, or 9-10.
- Split every page into a separate PDF.
- Split by fixed intervals such as every 5 pages.
- Download individual PDFs, a ZIP file, or a single combined output PDF.
- Preview PDF pages before processing.
Privacy and deployment notes
This deployment build embeds its required JavaScript libraries directly in the HTML file. It does not need Tailwind, Font Awesome, Google Fonts, Flowbite, external analytics files, schema files, logo images, or CDN script downloads.
Preparing PDF engine...
';
setStatus('Selected: ' + file.name);
try {
await ensureLibraries();
await displayPDFPreviews();
} catch (error) {
el('pdfPreviewContainer').innerHTML = '';
el('splitOptions').classList.add('hidden');
showError('errorMessage', 'Unable to load the PDF engine or file: ' + (error && error.message ? error.message : error));
pdfFile = null;
totalPages = 0;
pdfArrayBuffer = null;
await destroyPdfDoc();
}
}
async function displayPDFPreviews() {
const token = ++activePreviewToken;
const previewContainer = el('pdfPreviewContainer');
previewContainer.innerHTML = 'Loading preview...
';
const pdfjs = getPdfJs();
if (!pdfjs) throw new Error('PDF.js is not available.');
pdfArrayBuffer = await pdfFile.arrayBuffer();
const previewData = pdfArrayBuffer.slice(0);
await destroyPdfDoc();
const pdf = await pdfjs.getDocument({ data: previewData, disableAutoFetch: true, disableStream: true }).promise;
if (token !== activePreviewToken) { try { await pdf.destroy(); } catch (_) {} return; }
pdfDocRef = pdf;
totalPages = pdf.numPages;
if (!totalPages) { await destroyPdfDoc(); throw new Error('PDF contains no pages.'); }
// The document is valid and the page count is known, so splitting is available
// even if thumbnail rendering of a particular page fails afterwards.
el('splitOptions').classList.remove('hidden');
previewContainer.innerHTML = '';
const maxPreviewPages = Math.min(totalPages, 40);
for (let i = 1; i <= maxPreviewPages; i++) {
if (token !== activePreviewToken) { await destroyPdfDoc(); return; }
const div = document.createElement('div');
div.className = 'page-card';
div.innerHTML = '