Free PDF tool
Split a PDF into separate files
Choose how to divide the document: custom ranges such as 1-3, 4-10, a fixed number of pages per file, or one file per page.
Your PDF stays on your device
- Free, no account needed
- Built on the open-source libraries pdf-lib and PDF.js
How it works
Split a PDF into separate files in 4 steps
- 1
Add a PDF
Drop the document onto the tool or choose it from your device.
- 2
Choose a split mode
Enter ranges like 1-3, 4-, pick a number of pages per file, or split every page.
- 3
Split
Select Split PDF. Each range becomes its own PDF, created in your browser.
- 4
Download
Save files one by one or download all of them as a single ZIP archive.
Questions
Frequently asked questions
Are my files uploaded to a server?
No. The tool runs entirely in your browser: the PDF is read, changed and saved on your device, and its contents are never sent to our servers.
How do I write page ranges?
Separate files with commas. 1-3 is pages one to three, 4- means page four to the end, -2 means the first two pages and last is the final page. For example, 1-2, 3-5, 6- creates three files.
What are the new files called?
Each file is named after the original document plus its pages, for example report-pages-4-10.pdf, so the parts sort in order.
Can I use password-protected PDFs?
Not in the browser tool. Encrypted PDFs cannot be modified without the password, so the tool reports them instead of producing a broken file. Remove the protection with the software that created it, then try again.
Is there a file size or page limit?
There is no fixed limit because processing happens on your device. Very large files (several hundred megabytes) depend on your browser's available memory; if a file fails to open, try closing other tabs or use the API for server-side processing.
Automate it
Do the same in your application with Dynamic Document API
The split endpoint accepts the same range syntax and can return a ZIP archive, so batch exports can be divided per customer or per chapter.
POST /v1/pdf-tools/splitPlanned endpointThis endpoint is specified in the public API but not released yet; the request shape may still change.
curl -X POST https://api-eu.dynamicdocumentapi.com/v1/pdf-tools/split \
-H "Authorization: Bearer $DYNAMIC_DOCUMENT_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"source": {
"upload_id": "upl_01J9ZP2H4K6M8N0Q2R4T6V8X0Z"
},
"ranges": [
"1-3",
"4-"
],
"delivery": {
"type": "url"
}
}'const response = await fetch("https://api-eu.dynamicdocumentapi.com/v1/pdf-tools/split", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.DYNAMIC_DOCUMENT_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"source": {
"upload_id": "upl_01J9ZP2H4K6M8N0Q2R4T6V8X0Z"
},
"ranges": [
"1-3",
"4-"
],
"delivery": {
"type": "url"
}
}),
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const result = await response.json();
console.log(result);import os
import uuid
import requests
response = requests.post(
"https://api-eu.dynamicdocumentapi.com/v1/pdf-tools/split",
headers={
"Authorization": f"Bearer {os.environ['DYNAMIC_DOCUMENT_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"source": {
"upload_id": "upl_01J9ZP2H4K6M8N0Q2R4T6V8X0Z",
},
"ranges": ["1-3", "4-"],
"delivery": {
"type": "url",
},
},
timeout=90,
)
response.raise_for_status()
print(response.json())