Split a PDF into parts that fit your file size limit

Set the maximum KB or MB per PDF. Get consecutive page ranges with measured file sizes and a clear warning if one page is too large.

Or drop a PDF. Up to 50 MB and 200 pages.

{{ file.name }}
{{ pageCount }} pages · {{ formatBytes(file.size) }}
Set the maximum per PDF

1 KB = 1,000 bytes. 1 MB = 1,000,000 bytes.

{{ loading ? 'Reading your PDF…' : progress || 'Checking output sizes…' }}

Choose an ordinary unlocked PDF. Interactive forms, signature permissions, and optional-content layers are rejected. Export a flat, unsigned copy first.

Consecutive pages, actual file sizes

Get PDF parts with a clear size check

Choose your PDF and a file size limit. The tool saves and measures each candidate part, then shows its source page range.

{{ allWithinLimit ? 'Every file fits your size limit' : 'Some files exceed your size limit' }}

Maximum per file: {{ formatBytes(checkedLimit) }}

Existing page text and graphics are copied. Check outputs: document bookmarks, attachments, page labels, internal navigation, and signatures are not preserved reliably.

{{ downloadNotice }}

The ZIP includes all results, including failed attempts. The per-file limit does not apply to the ZIP.

Pages {{ result.startPage }}–{{ result.endPage }}

{{ formatBytes(result.actualBytes) }} · {{ result.width }} × {{ result.height }} px

{{ result.metLimit ? '✓ Within the limit' : '✕ Over the limit' }}

{{ result.reason }}

The starting dimensions were reduced to fit the safe rendering budget for this selection.

Continue with this page and the same exact byte limit. Compression creates an image-based PDF and can remove searchable text. Review the result before replacing the original.

{{ downloadNotice }}

{{ continuationError }} Open Compress PDF

How to split a PDF into parts under 1 MB

  1. Choose an ordinary unlocked PDF.
  2. Enter 1 and select MB, or use the exact limit your upload form gives.
  3. Split and check. Each part contains consecutive source pages and shows its final byte count.
  4. Download the PDF parts and upload them separately if the destination supports multiple files.

Why splitting by page count is not enough

A page of text may use far fewer bytes than a scanned page. Fonts and images can be shared across pages, and each separate PDF needs its own file structure. Dividing the original byte count by its pages cannot predict each output. This tool copies candidate ranges into fresh PDFs and measures their final serialized bytes.

The search is bounded to keep browser work manageable. Every returned part is measured; the tool does not promise the fewest possible files. A single page larger than the limit is kept intact and clearly marked. To reduce that page, use Compress PDF, export its large images at a lower resolution, or increase the allowed size.

What stays in the PDF

Page text, vectors, and images are copied without rasterizing. This does not create text in a scanned document. Document-level features can depend on objects outside the copied pages. Forms, signature permissions, and layers are rejected; bookmarks, attachments, page labels, and internal navigation are not guaranteed. The implementation uses pdf-lib’s documented page-copy and save APIs and measures the bytes returned by save.

Measured examples you can reproduce

Saved PDFs measured on 5 September 2026. Chrome 152.0.7977.83 and pdf-lib 1.17.1. Every output was independently decoded to check page order, rotation, and selectable text.
Source pagesMaximum per PDFActual PDFResult
Pages 1–12,000 bytes1,277 bytesWithin limit
Inspect PDF
Pages 2–22,000 bytes1,269 bytesWithin limit
Inspect PDF
Pages 3–32,000 bytes1,270 bytesWithin limit
Inspect PDF
Pages 4–42,000 bytes308,425 bytesSingle page over limit
Inspect PDF
Pages 1–4400,000 bytes310,670 bytesWithin limit
Inspect PDF

Our reproducible test uses a generated PDF with selectable text, a rotated page, and a synthetic color chart. Download the source PDF, actual measurements and output links, and method and reuse license. The report includes deliberately impossible limits, measured bytes, independently decoded page dimensions, retained text checks, and SHA-256 hashes. These synthetic examples do not establish readability or compatibility for every PDF.

Keep pages in order

Parts contain consecutive source pages. Existing text, images, and vectors are copied without turning pages into pictures.

Measure saved PDFs

Checks use the final bytes of each standalone PDF, including its resources and file overhead.

Handle oversized pages

A page that exceeds the limit on its own stays intact and is marked over the limit, so you can decide what to change.

Questions about splitting PDF by file size

Choose the PDF, enter 1 and select MB, then split. This tool checks every saved part against 1,000,000 bytes. Parts use consecutive pages; a page that is too large on its own is returned separately and marked over the limit.

No. A standalone PDF needs its own file structure and page resources. If one page exceeds the limit after saving, page splitting cannot divide its contents. Increase the limit, compress the original, or extract and reduce that page’s large images.

Existing page text, vectors, and images are copied rather than rasterized. Scanned pages remain scans. Document-level features such as bookmarks, attachments, page labels, and internal navigation are not guaranteed to survive. Review important outputs.

This tool rejects encrypted PDFs, detected interactive forms, signature permissions, and optional-content layers. Export a flat, unsigned copy first. Splitting creates new PDFs and does not preserve a digital signature’s validity.

Each part needs its own PDF structure and may repeat fonts or images shared across original pages. The total of the parts can exceed the source size. Each limit check applies to one saved PDF, not the combined ZIP.
(function() { const title = document.querySelector('h1'); const actionRegion = document.querySelector('.action-container, .action-body'); if (!title || !actionRegion || title.querySelector('.tool-hero-mark')) return; const path = window.location.pathname.replace(/\/$/, ''); if (!path || path === '/' || path.startsWith('/converters') || path === '/about' || path === '/contact' || path === '/support' || path === '/privacy-policy') { return; } const lowerKey = path.replace(/^\/(video|audio)\//, '').replace(/^\//, '').toLowerCase(); if (!lowerKey) return; let category = 'image'; if (path.startsWith('/video/')) category = 'video'; if (path.startsWith('/audio/')) category = 'audio'; const isUtility = lowerKey.includes('ascii') || lowerKey === 'check-my-file' || lowerKey === 'prepare-for-ai' || lowerKey.includes('resizer') || lowerKey.includes('metadata') || lowerKey.includes('compress') || lowerKey.includes('base64') || lowerKey.includes('background') || lowerKey.includes('crop') || lowerKey.includes('watermark') || lowerKey.includes('remove-pages') || lowerKey.includes('unlock') || lowerKey.includes('protect') || lowerKey.includes('editor') || lowerKey.includes('excel') || lowerKey.includes('upscale') || lowerKey.includes('merge') || lowerKey.includes('split') || lowerKey.includes('ocr') || lowerKey.includes('sign') || lowerKey.includes('trim') || lowerKey.includes('favicon'); if (category === 'image' && isUtility) category = 'tool'; const labelMap = { jpg: 'JPG', jpeg: 'JPEG', png: 'PNG', gif: 'GIF', svg: 'SVG', pdf: 'PDF', heic: 'HEIC', jfif: 'JFIF', webp: 'WEBP', bmp: 'BMP', ico: 'ICO', word: 'DOCX', docx: 'DOCX', excel: 'Excel', xls: 'XLS', xlsx: 'Excel', mp4: 'MP4', mov: 'MOV', avi: 'AVI', mp3: 'MP3', aac: 'AAC', flac: 'FLAC', wav: 'WAV', webm: 'WEBM', cr2: 'CR2', arw: 'ARW', nef: 'NEF', raf: 'RAF' }; const formatLabel = (value) => labelMap[value] || value.toUpperCase(); function getFormatMeta(key) { if (key === 'check-my-file') { return {primary: 'Check', secondary: 'File', connector: 'dot'}; } if (key === 'prepare-for-ai') { return {primary: 'Prepare', secondary: 'AI', connector: 'dot'}; } const directMatch = key.match(/^([a-z0-9]+)-to-([a-z0-9]+)$/); const convertMatch = key.match(/^convert-([a-z0-9]+)-to-([a-z0-9]+)$/); const convertToMatch = key.match(/^convert-to-([a-z0-9]+)$/); if (directMatch) { return {primary: formatLabel(directMatch[1]), secondary: formatLabel(directMatch[2]), connector: 'arrow'}; } if (convertMatch) { return {primary: formatLabel(convertMatch[1]), secondary: formatLabel(convertMatch[2]), connector: 'arrow'}; } if (convertToMatch) { return {primary: 'Any', secondary: formatLabel(convertToMatch[1]), connector: 'arrow'}; } if (key.startsWith('compress-')) { return {primary: 'Compress', secondary: formatLabel(key.replace('compress-', '')), connector: 'dot'}; } if (key.includes('base64') && key.includes('decode')) { return {primary: 'Base64', secondary: 'Decode', connector: 'dot'}; } if (key.startsWith('base64-to-')) { return {primary: 'Base64', secondary: formatLabel(key.replace('base64-to-', '')), connector: 'arrow'}; } if (key.includes('-to-base64')) { const from = key.replace('convert-', '').replace('-to-base64', ''); return {primary: formatLabel(from), secondary: 'Base64', connector: 'arrow'}; } if (key.includes('base64')) { return {primary: 'Base64', secondary: 'Encode', connector: 'dot'}; } if (key.includes('ascii')) { return {primary: 'ASCII', secondary: 'Art', connector: 'dot'}; } if (key.includes('resizer')) { return {primary: 'Resize', secondary: 'Pixels', connector: 'dot'}; } if (key.includes('remove-pages')) { return {primary: 'Remove', secondary: 'Pages', connector: 'dot'}; } if (key.includes('crop') && key.includes('pdf')) { return {primary: 'Crop', secondary: 'PDF', connector: 'dot'}; } if (key.includes('pdf-editor')) { return {primary: 'Edit', secondary: 'PDF', connector: 'dot'}; } if (key.includes('unlock')) { return {primary: 'Unlock', secondary: 'PDF', connector: 'dot'}; } if (key.includes('protect')) { return {primary: 'Protect', secondary: 'PDF', connector: 'dot'}; } if (key.includes('pdf') && key.includes('metadata')) { return {primary: 'Clean', secondary: 'Metadata', connector: 'dot'}; } if (key.includes('metadata')) { return {primary: 'EXIF', secondary: 'Clean', connector: 'dot'}; } if (key.includes('background')) { return {primary: 'Remove', secondary: 'Background', connector: 'dot'}; } if (key.includes('crop')) { return {primary: 'Crop', secondary: 'Image', connector: 'dot'}; } if (key.includes('watermark')) { return {primary: 'Watermark', secondary: 'Image', connector: 'dot'}; } if (key.includes('upscale')) { return {primary: 'Upscale', secondary: 'Image', connector: 'dot'}; } if (key.includes('merge')) { return {primary: 'Merge', secondary: 'PDF', connector: 'dot'}; } if (key.includes('split')) { return {primary: 'Split', secondary: 'PDF', connector: 'dot'}; } if (key.includes('ocr')) { return {primary: 'OCR', secondary: 'PDF', connector: 'dot'}; } if (key.includes('sign')) { return {primary: 'Sign', secondary: 'PDF', connector: 'dot'}; } if (key.includes('trim')) { return {primary: 'Trim', secondary: 'Video', connector: 'dot'}; } return {primary: 'Tool', secondary: '', connector: 'dot'}; } function getIconClass(key, categoryName) { const toFormat = key.split('-to-')[1]; if (key === 'check-my-file') return 'bi-file-earmark-check'; if (key === 'prepare-for-ai') return 'bi-ui-checks-grid'; if (key.includes('ascii')) return 'bi-textarea-t'; if (key.includes('resizer')) return 'bi-aspect-ratio'; if (key.includes('metadata')) return 'bi-shield-slash'; if (key.includes('compress')) return 'bi-file-earmark-zip'; if (key.includes('base64')) return 'bi-journal-code'; if (key.includes('background')) return 'bi-scissors'; if (key.includes('crop')) return 'bi-crop'; if (key.includes('watermark')) return 'bi-type'; if (key.includes('remove-pages')) return 'bi-trash'; if (key.includes('unlock')) return 'bi-unlock'; if (key.includes('protect')) return 'bi-lock'; if (key.includes('editor')) return 'bi-pencil-square'; if (key.includes('excel')) return 'bi-file-earmark-spreadsheet'; if (key.includes('upscale')) return 'bi-arrows-angle-expand'; if (key.includes('merge')) return 'bi-files'; if (key.includes('split')) return 'bi-scissors'; if (key.includes('ocr')) return 'bi-file-earmark-text'; if (key.includes('sign')) return 'bi-pen'; if (key.includes('trim')) return 'bi-scissors'; if (toFormat) { switch (toFormat) { case 'jpg': case 'jpeg': return 'bi-filetype-jpg'; case 'png': return 'bi-filetype-png'; case 'gif': return 'bi-filetype-gif'; case 'svg': return 'bi-filetype-svg'; case 'pdf': return 'bi-filetype-pdf'; case 'word': case 'docx': return 'bi-file-earmark-word'; case 'xls': case 'xlsx': case 'excel': return 'bi-file-earmark-spreadsheet'; case 'heic': return 'bi-filetype-heic'; case 'webp': return 'bi-filetype-webp'; case 'bmp': return 'bi-filetype-bmp'; case 'ico': return 'bi-file-image'; case 'mp4': return 'bi-filetype-mp4'; case 'mov': return 'bi-filetype-mov'; case 'mp3': return 'bi-filetype-mp3'; case 'wav': return 'bi-filetype-wav'; case 'avi': return 'bi-filetype-avi'; default: return 'bi-file-earmark-image'; } } if (categoryName === 'video') return 'bi-film'; if (categoryName === 'audio') return 'bi-music-note-beamed'; if (categoryName === 'image') return 'bi-file-earmark-image'; return 'bi-gear'; } const formatMeta = getFormatMeta(lowerKey); const connectorIcon = formatMeta.connector === 'arrow' ? 'bi-arrow-right-short' : 'bi-dot'; const iconClass = getIconClass(lowerKey, category); const mark = document.createElement('span'); mark.className = `tool-hero-mark converter-mark converter-mark--${category}`; const iconWrap = document.createElement('span'); iconWrap.className = 'converter-mark__icon'; const icon = document.createElement('i'); icon.className = iconClass; iconWrap.appendChild(icon); mark.appendChild(iconWrap); const formatWrap = document.createElement('span'); formatWrap.className = 'converter-format'; const primary = document.createElement('span'); primary.className = 'format-pill'; primary.textContent = formatMeta.primary; formatWrap.appendChild(primary); if (formatMeta.secondary) { const connector = document.createElement('span'); connector.className = 'format-connector'; const connectorIconEl = document.createElement('i'); connectorIconEl.className = connectorIcon; connector.appendChild(connectorIconEl); formatWrap.appendChild(connector); const secondary = document.createElement('span'); secondary.className = 'format-pill format-pill--secondary'; secondary.textContent = formatMeta.secondary; formatWrap.appendChild(secondary); } mark.appendChild(formatWrap); title.classList.add('tool-hero-title'); title.prepend(mark); })();