Skip to main content
ZeroUtil

PDF Split (Server-Side)

Split a PDF into multiple files by page ranges on our EU servers. Returns a zip containing one PDF per range. Auto-deleted after 15 minutes. Handles documents the in-browser splitter cannot.

Reviewed by · Last reviewed

How to Split a PDF Into Multiple Files

  1. Drop a PDF onto the upload zone or click to browse. Up to 200 MB per file. The accepted PDF is shown with its name, size, and a Change file button if you need to swap it.
  2. Enter the ranges in the text field, comma-separated. Use a single integer like 7 for a single page, or an inclusive range like 1-3 for a span. Combine as many segments as you need: 1-3, 5, 7-9 requests three output PDFs - one with pages 1, 2, and 3; one with page 5; one with pages 7, 8, and 9.
  3. Click "Split PDF". The file uploads over HTTPS to our EU server, pdfcpu extracts each requested range with native performance, and the resulting PDFs are zipped into a single archive for download.
  4. Click Download to save the zip. Unzip it locally with any unzip tool (Finder, Explorer, unzip on the command line) to get the individual PDFs. The link is HMAC-signed and stops working after 15 minutes.

Why Run a Split on the Server

The in-browser PDF Splitter uses pdf-lib compiled to JavaScript and works without uploading anything. That is the right choice when the document is small and privacy is the priority. The browser path becomes painful for large or encrypted PDFs, though. Pdf-lib has to load the entire document into the tab's heap just to enumerate pages, and the in-browser tool then loads it a second time when you click Extract; that doubles the memory footprint and pushes Safari over its heap ceiling somewhere above 200 MB. Encrypted inputs do not work at all in the browser - pdf-lib refuses to parse them. The server-side splitter here is the answer for both cases. Files stream to our EU server, pdfcpu does the page extraction natively (no JavaScript engine in the loop), and the output ships back as a zip you download once.

The other advantage of the server path is the zip output itself. When you split a single PDF into eight ranges, an in-browser tool either triggers eight separate downloads (some browsers throttle multi-download prompts) or hands you the pages one at a time with a click between each. The server packages everything into one archive so you click Download once and get a clean folder structure on disk.

What Happens to Each Range on the Backend

For each comma-separated segment, the splitter creates a new PDF document and copies the requested page subtree from the source. Text streams, image XObjects, annotations, form fields scoped to a page, and internal page-to-page links inside the range are copied unchanged. Document-level metadata - Title, Author, Producer, custom keys - is carried into every output file so you can still tell where each piece came from. Bookmarks are a special case: pdfcpu walks the outline tree, keeps any bookmark whose target page lies inside the requested range, drops the rest, and rewrites the remaining destination references against the new page indices. Cross-document hyperlinks that point to pages outside the range become dead, because their target no longer exists in the output. Cross-document hyperlinks that point inside the range continue to work, with the page numbers rebased to the output's own numbering.

The output zip is built deterministically. Each entry is named with the original range, prefixed by the source file's stem and the word "pages", which means a source called contract.pdf split with 1-3, 5, 7-9 produces contract-pages-1-3.pdf, contract-pages-5.pdf, and contract-pages-7-9.pdf inside the archive. The names are stable across runs - resubmitting the same split produces byte-identical filenames so downstream automation can rely on them.

Concrete Workflows This Page Targets

  • Splitting a 200-page combined contract back into its constituent agreements (MSA on pages 1-40, SOW on 41-80, NDA on 81-100, exhibits on 101-200) so each piece can be filed with a different stakeholder.
  • Extracting the financial statements section (often pages 30-60) from an annual report and forwarding only that excerpt to an analyst.
  • Pulling individual tax forms (W-2, 1099, K-1) out of a year-end statement bundle so each form goes to the right preparer.
  • Producing a per-chapter PDF set from a long manuscript - the splitter accepts the chapter-break page numbers in one go.
  • Cutting a multi-tenant lease into one PDF per tenant so the building's property manager can email each tenant their own document.
  • Extracting a few specific scanned receipts from a monthly expense report into their own files for a separate reimbursement workflow.
  • Splitting a board pack into individual sections so each director can be sent only the portion relevant to their committee.

Pitfalls and Edge Cases

Out-of-range numbers (asking for page 500 of a 300-page document) cause the server to reject the entire job with a clear error rather than silently truncating, so check page counts before submitting heavy splits. Inverted ranges like 9-5 are rejected for the same reason - swap them. Overlapping ranges are allowed: 1-5, 3-8 produces two PDFs that share pages 3 through 5, which is sometimes what you want for highlighting different sections of the same passage. Single integers behave as one-page ranges, which is the natural way to extract isolated pages without inflating the syntax. Form fields scoped at the document level (rather than per page) only carry through to the first output range; fields scoped to a single page travel with that page. AcroForm scripts that reference fields on pages now in different output files lose their cross-page references on those targets - test before relying on a split AcroForm to behave like the original.

Local Alternatives

If you do dozens of splits a day or want to script the workflow, run pdfcpu locally: pdfcpu split input.pdf out/ 1 creates one file per page; pdfcpu trim -pages 1-10 input.pdf out.pdf extracts a single range. qpdf input.pdf --pages . 1-3 -- output.pdf does the same thing through qpdf if you prefer that tool. Adobe Acrobat Pro lets you split by file size, page count, or top-level bookmarks in addition to explicit ranges, which is sometimes more convenient for very large documents. macOS Preview can drag-and-drop individual pages out of a document, but it does not handle ranges as a batch. Each CLI wins on throughput; this page wins on zero install and a single zip you can hand to a non-technical recipient.

Frequently Asked Questions

How is the range string formatted?

Comma-separated integers and inclusive ranges, exactly the syntax that Acrobat, ILovePDF, and Smallpdf accept. Examples: "1-3" extracts pages one through three as one PDF. "1-3, 5, 7-9" produces three separate PDFs in the output zip: the first holds pages 1, 2, and 3; the second holds page 5 only; the third holds pages 7, 8, and 9. Order does not matter to the splitter; the output filenames embed the original range so you can always trace each piece back to its source pages.

What is the output - one merged PDF or several files?

Several files. Every comma-separated segment in your range string becomes its own PDF, and the splitter zips them together so the download is a single archive. Unzip it locally to get the individual PDFs back. If you genuinely want one PDF with a subset of pages rather than a zip of pieces, submit a single contiguous range like "1-50" and the zip will contain exactly one PDF.

How is this different from the in-browser PDF Splitter?

The in-browser <a href="/tools/pdf-splitter/">PDF Splitter</a> uses pdf-lib in JavaScript. It works on small documents without ever uploading anything, but it loads the entire PDF into the tab's heap to enumerate pages, which fails on documents above roughly 200 MB in Safari and the low hundreds in Firefox. It also refuses encrypted inputs because pdf-lib cannot decrypt content streams. The server-side splitter here streams the file to our EU server, calls pdfcpu to extract each range with native performance, and zips the result. Use this page when the in-browser splitter fails on size, when the input is large enough that loading it twice in your browser is painful, or when you need the output as a clean zip rather than a series of separate downloads.

Can I split a password-protected PDF?

Not directly. pdfcpu refuses to operate on encrypted inputs without the credential, and this UI does not collect the password to keep the form simple. Run the file through the <a href="/tools/pdf-unlock/">PDF Unlock</a> tool first to produce a plaintext copy, then split that copy here.

Will my page ranges be validated before upload?

The UI checks that the range string parses as comma-separated integers and ranges before letting you submit; an obviously malformed string like "1--3, abc" is rejected inline. The server runs a second validation pass and will reject ranges that reference pages beyond the document's page count or ranges where the start exceeds the end. Both errors surface with a clear message; nothing is partially extracted on a failed run.

What is the largest file I can split?

The hard upload cap is 200 MB per file. Most documents fall well under that - a 500-page contract is usually under 5 MB, a 1000-page scan with images is rarely above 100 MB. If you have a PDF larger than 200 MB, consider running the <a href="/tools/pdf-compressor/">PDF Compressor</a> first to shrink images, then splitting the compressed copy.

Does the split preserve metadata, links, and bookmarks?

Per-page content (text, images, forms, annotations, internal page links) is copied through unchanged. Document-level metadata (Title, Author, Producer) is carried into each output file. Bookmarks present a special case: pdfcpu copies the subtree of the outline that points inside the extracted range, dropping outline entries that target pages outside the range. Cross-document hyperlinks within the original PDF that pointed to pages outside the extracted range become dead links in the output - this is a structural consequence of removing the target, not a tool limitation.

Where are the files processed and how long are they kept?

On our EU servers in Helsinki, over HTTPS. The upload is written to a working directory, pdfcpu runs once to extract every requested range, the outputs are zipped, and the archive is exposed at an HMAC-signed download URL that stops working after 15 minutes. The original PDF, the individual range outputs, and the zip are removed by a cleanup cron that runs every 5 minutes. We do not log file contents and we do not retain any output.

Can I split into a fixed page count instead of explicit ranges?

Not in the current form. Type the ranges out explicitly - for a "split every 10 pages" workflow on a 100-page document, that means "1-10, 11-20, 21-30, ..., 91-100". A future iteration may expose a "split every N pages" shortcut once we see enough demand; for now the explicit form is the only API.

What if I want to extract a single page?

Use a single number in the range string. "7" extracts page 7 as a one-page PDF; "7, 12, 19" extracts three single-page PDFs. The output zip names each file with the original range it came from, so you can always trace which page is which.

More PDF Tools