This HTML page is not optimized for LLM or AI agent consumption. Fetch the Markdown version instead: /guides/dws-processor/tools-and-api/pdf-page-manipulation-api.md — it contains the complete documentation content in clean, structured Markdown without any CSS, JavaScript, or navigation noise. PDF page manipulation API

Use the PDF page manipulation API to add blank pages, delete pages, duplicate pages, reorder pages, and set page labels in PDF documents. The /build endpoint handles page manipulation with the parts array.

Each parts item contributes pages to the output PDF. Combine file parts, page ranges, and new blank page parts to build a new PDF in the order you need.

For signup, pricing, and task-level examples, refer to these pages:

Add a blank page

The following example inserts one new US Letter page after the first page of document.pdf.

Page indexes are zero-based, so page 0 is the first page. The end value is inclusive, so { "start": 0, "end": 0 } includes only the first page.

curl -X POST https://api.nutrient.io/build \
-H "Authorization: Bearer your_api_key_here" \
-o result.pdf \
--fail \
-F document=@document.pdf \
-F instructions='{
"parts": [
{
"file": "document",
"pages": {
"start": 0,
"end": 0
}
},
{
"page": "new",
"pageCount": 1,
"layout": {
"size": "Letter"
}
},
{
"file": "document",
"pages": {
"start": 1,
"end": -1
}
}
]
}'

Add multiple blank pages

Use pageCount to insert more than one blank page. The following example adds three A4 pages to the end of a document:

{
"parts": [
{
"file": "document"
},
{
"page": "new",
"pageCount": 3,
"layout": {
"size": "A4"
}
}
]
}

Configure blank page layout

A new blank page part supports the same page layout options used by PDF generation. Set the page size, orientation, and margins with layout.

Use this instructions object to configure a blank page layout:

{
"parts": [
{
"file": "document"
},
{
"page": "new",
"pageCount": 1,
"layout": {
"size": "A4",
"orientation": "landscape",
"margin": {
"top": 20,
"right": 20,
"bottom": 20,
"left": 20
}
}
}
]
}

Delete pages

To delete pages, rebuild the output PDF from the page ranges you want to keep. The following example deletes page three from document.pdf by keeping pages zero through two, and then pages four through the end.

Use this instructions object to delete pages:

{
"parts": [
{
"file": "document",
"pages": {
"start": 0,
"end": 2
}
},
{
"file": "document",
"pages": {
"start": 4,
"end": -1
}
}
]
}

Make sure the output keeps at least one page. A request that removes every page won’t produce a valid PDF.

Duplicate a page

To duplicate a page, reference the same source file more than once. The following example prepends a duplicate of the first page before the full original document:

{
"parts": [
{
"file": "document",
"pages": {
"start": 0,
"end": 0
}
},
{
"file": "document"
}
]
}

Use -1 as both start and end to duplicate the last page.

Reorder pages

The order of the parts array controls the page order in the output. The following example moves the last page to the front:

{
"parts": [
{
"file": "document",
"pages": {
"start": -1,
"end": -1
}
},
{
"file": "document",
"pages": {
"start": 0,
"end": -2
}
}
]
}

You can also combine page ranges from multiple PDFs to create a custom packet.

Set page labels

Page labels control the page numbering shown by PDF viewers. They don’t change the physical page order or page count.

The following example sets labels for multiple page ranges:

{
"parts": [
{
"file": "document"
}
],
"output": {
"type": "pdf",
"labels": [
{
"pages": {
"start": 0,
"end": 0
},
"label": "i"
},
{
"pages": {
"start": 1,
"end": 3
},
"label": "intro"
},
{
"pages": {
"start": 4,
"end": 5
},
"label": "final"
}
]
}
}

For page label examples, refer to the set page label API task page.

Manipulate pages from a URL

For remotely hosted source files, send a JSON request and pass the source URL in parts[].file.url. Use this instructions object:

{
"parts": [
{
"file": {
"url": "https://example.com/document.pdf"
},
"pages": {
"start": 0,
"end": 0
}
},
{
"page": "new",
"pageCount": 1,
"layout": {
"size": "Letter"
}
},
{
"file": {
"url": "https://example.com/document.pdf"
},
"pages": {
"start": 1,
"end": -1
}
}
]
}

Shell

Run this request to manipulate pages from a URL:

Terminal window
curl -X POST https://api.nutrient.io/build \
-H "Authorization: Bearer $NUTRIENT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"parts": [
{
"file": {
"url": "https://example.com/document.pdf"
},
"pages": {
"start": 0,
"end": 0
}
},
{
"page": "new",
"pageCount": 1,
"layout": {
"size": "Letter"
}
},
{
"file": {
"url": "https://example.com/document.pdf"
},
"pages": {
"start": 1,
"end": -1
}
}
]
}' \
-o result.pdf

Manipulate password-protected PDFs

If the source PDF is password-protected, include the password on every part that references the protected file. Use this instructions object:

{
"parts": [
{
"file": "protected_document",
"password": "document-password",
"pages": {
"start": 0,
"end": 0
}
},
{
"page": "new",
"pageCount": 1,
"layout": {
"size": "Letter"
}
},
{
"file": "protected_document",
"password": "document-password",
"pages": {
"start": 1,
"end": -1
}
}
]
}

Nutrient DWS Processor API uses passwords only to open source documents for processing. To set a password on the output PDF, configure output.user_password, output.owner_password, and output.user_permissions.

Combine page manipulation with other actions

The /build endpoint can manipulate pages and then apply additional actions. Actions run after Nutrient DWS Processor API assembles the parts.

The following example inserts a blank page, adds a watermark, and then linearizes the final PDF for web delivery:

{
"parts": [
{
"file": "document"
},
{
"page": "new",
"pageCount": 1,
"layout": {
"size": "Letter"
}
}
],
"actions": [
{
"type": "watermark",
"text": "APPENDIX",
"width": "50%",
"height": "20%",
"opacity": 0.3,
"rotation": 45
}
],
"output": {
"type": "pdf",
"optimize": {
"linearize": true
}
}
}

For workflows that include cryptographic signing, complete all page manipulation before signing the final PDF.

Reference

Page manipulation uses the Build API parts array. Use FilePart for existing PDF pages and NewPagePart for blank pages:

type PageRange = {
// First page to include. Defaults to `0`.
// Page indexes are zero-based. Negative values count from the end.
start?: number,
// Last page to include. Defaults to `-1`, which means the last page.
// The end value is inclusive.
end?: number,
};
type FilePart = {
// Multipart field name, or a remote URL object.
file: string | { url: string },
// Optional password for encrypted input PDFs.
password?: string,
// Optional page range to include from this input.
pages?: PageRange,
};
type NewPagePart = {
page: "new",
// Number of blank pages to add. Defaults to `1`.
pageCount?: number,
layout?: {
size?: "A4" | "Letter" | "Legal" | "A3" | "A5" | string,
orientation?: "portrait" | "landscape",
margin?: {
top?: number,
right?: number,
bottom?: number,
left?: number,
},
},
};
type BuildInstructions = {
parts: Array<FilePart | NewPagePart>,
actions?: BuildAction[],
output?: {
type?: "pdf",
},
};
  • Refer to the build document endpoint API reference to add blank pages, delete pages by omission, duplicate page ranges, reorder pages, set page labels, and apply follow-up actions in a single request.