# PDF を分割して出力を扱う

分割アクションを実行し、ZIP・JSON・multipart の各形式とそれぞれの注意点を含む、多数の出力の読み取り方を解説します。

分割アクションは、1つの PDF を複数の PDF に変換します。他のすべてのアクションと異なり、レスポンスは単一の PDF ではなくドキュメントの集合になり、`Accept` リクエストヘッダーによってその梱包形式を選べます。ZIP アーカイブ（デフォルト）、base64 エンコードされたドキュメントの JSON エンベロープ、または `multipart/mixed` 形式のいずれかです。このガイドでは分割アクションを1つ選び、各形式をリクエストして、コードでパートを取り出します。

## 分割アクションを選ぶ

4つのアクションが、それぞれ異なる方法でドキュメントを分割します。いずれも同じ出力の仕様を共有しているため、以下の展開コードはすべてに使えます。

| アクション | 分割方法 | 主なフィールド |
| --- | --- | --- |
| [ページ数で分割する](/docs/api/split-pdf-by-page-count) (`split_by_page_count`) | パートごとの固定ページ数 | `page_count` |
| [指定したページで分割する](/docs/api/split-pdf-at-page) (`split_at_page`) | 1つの境界で2つのパートに分ける | `page` |
| [ファイルサイズで分割する](/docs/api/split-pdf-by-file-size) (`split_by_size`) | パートごとの最大バイトサイズ | `maximum_bytes` |
| [ページグループで分割する](/docs/api/split-pdf-into-page-groups) (`split_by_groups`) | 自分で定義した明示的なグループ | `groups` |

これらの例では `page_count=10` を指定して `split_by_page_count` を使用します。他の分割アクションを使うには、ルートとフィールドを置き換えてください。

## 出力フォーマットを選ぶ

`Accept` ヘッダーを設定してフォーマットをリクエストします。出力ドキュメントは常に `00001.pdf`、`00002.pdf` のように順番に名付けられます。

| `Accept` | レスポンスボディ | 読み取り方 |
| --- | --- | --- |
| `application/zip` *(デフォルト)* | ドキュメントごとに1エントリの ZIP アーカイブ | アーカイブを展開する |
| `application/json` | base64 の `documents[]` 配列を含む JSON エンベロープ | 各 `content` をデコードする |
| `multipart/mixed` | ドキュメントごとに1つの `application/pdf` パート | パートを順番に読み込む |

`Accept` を省略すると ZIP になります。この3つのいずれにも一致しない `Accept` ヘッダーには `406 Not Acceptable` が返されます。完全な仕様については [レスポンスフォーマット](/docs/api/response-formats) を参照してください。

## ZIP を取得する（デフォルト）

`Accept` ヘッダーを送らない場合、レスポンスは ZIP アーカイブになります。保存してから、そのエントリを順に処理します。

<CodeGroup>

```bash title="cURL"
curl https://api.pdfblocks.com/v1/split_by_page_count \
  -H 'X-API-Key: your_api_key' \
  -F file=@input.pdf \
  -F page_count=10 \
  -o parts.zip

unzip parts.zip -d parts/
# parts/00001.pdf  parts/00002.pdf  parts/00003.pdf …
```

```python title="Python"
# pip install requests
import io
import zipfile
import requests

with open('input.pdf', 'rb') as file:
    response = requests.post(
        'https://api.pdfblocks.com/v1/split_by_page_count',
        headers={'X-API-Key': 'your_api_key'},  # no Accept → ZIP
        files={'file': file},
        data={'page_count': 10},
    )
response.raise_for_status()

with zipfile.ZipFile(io.BytesIO(response.content)) as archive:
    print(archive.namelist())  # ['00001.pdf', '00002.pdf', …]
    archive.extractall('parts')
```

```go title="Go"
package main

import (
	"archive/zip"
	"bytes"
	"io"
	"mime/multipart"
	"net/http"
	"os"
	"path/filepath"
)

func main() {
	var buf bytes.Buffer
	form := multipart.NewWriter(&buf)
	file, _ := os.Open("input.pdf")
	defer file.Close()
	part, _ := form.CreateFormFile("file", "input.pdf")
	io.Copy(part, file)
	form.WriteField("page_count", "10")
	form.Close()

	req, _ := http.NewRequest("POST",
		"https://api.pdfblocks.com/v1/split_by_page_count", &buf)
	req.Header.Set("Content-Type", form.FormDataContentType())
	req.Header.Set("X-API-Key", "your_api_key")
	// No Accept header → ZIP.

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	archive, _ := zip.NewReader(bytes.NewReader(body), int64(len(body)))
	os.MkdirAll("parts", 0755)
	for _, entry := range archive.File {
		in, _ := entry.Open()
		out, _ := os.Create(filepath.Join("parts", entry.Name))
		io.Copy(out, in)
		out.Close()
		in.Close()
	}
}
```

</CodeGroup>

## JSON を取得する

代わりに `Accept: application/json` を設定すると、エンベロープを受け取ります。各ドキュメントは `name`、base64 エンコードされた `content`、`content_type` を持ちます。

```json
{
  "documents": [
    { "name": "00001.pdf", "content": "JVBERi0xLjcK…", "content_type": "application/pdf" },
    { "name": "00002.pdf", "content": "JVBERi0xLjcK…", "content_type": "application/pdf" }
  ]
}
```

JSON は、呼び出し側がバイト列と一緒にドキュメント名も欲しい場合や、バイナリのアーカイブよりテキストとして扱う方が簡単な転送経路の場合に便利です。各 `content` を base64 からデコードして PDF を復元してください。

<CodeGroup>

```bash title="cURL"
curl https://api.pdfblocks.com/v1/split_by_page_count \
  -H 'X-API-Key: your_api_key' \
  -H 'Accept: application/json' \
  -F file=@input.pdf \
  -F page_count=10 \
  -o parts.json
```

```python title="Python"
# pip install requests
import base64
import requests

with open('input.pdf', 'rb') as file:
    response = requests.post(
        'https://api.pdfblocks.com/v1/split_by_page_count',
        headers={'X-API-Key': 'your_api_key', 'Accept': 'application/json'},
        files={'file': file},
        data={'page_count': 10},
    )
response.raise_for_status()

for document in response.json()['documents']:
    with open(document['name'], 'wb') as out:
        out.write(base64.b64decode(document['content']))
```

```javascript title="Node.js"
// Node.js 18+
import { readFile, writeFile } from 'node:fs/promises';

const body = new FormData();
body.set('file', new Blob([await readFile('input.pdf')]), 'input.pdf');
body.set('page_count', '10');

const response = await fetch('https://api.pdfblocks.com/v1/split_by_page_count', {
  method: 'POST',
  headers: { 'X-API-Key': 'your_api_key', Accept: 'application/json' },
  body,
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);

const { documents } = await response.json();
for (const document of documents) {
  await writeFile(document.name, Buffer.from(document.content, 'base64'));
}
```

</CodeGroup>

## multipart/mixed を取得する

`Accept: multipart/mixed` を設定すると、ドキュメントごとに1つの `application/pdf` パートがストリーミングされ、それぞれに `00001.pdf`、`00002.pdf` のように名付ける `Content-Disposition` が付きます。アーカイブ全体をメモリに保持するのではなく、届いたパートから順に処理したい場合はこちらを選んでください。ほとんどの言語には multipart パーサーがあります。Python では `requests-toolbelt` がレスポンスを直接デコードします。

<CodeGroup>

```bash title="cURL"
curl https://api.pdfblocks.com/v1/split_by_page_count \
  -H 'X-API-Key: your_api_key' \
  -H 'Accept: multipart/mixed' \
  -F file=@input.pdf \
  -F page_count=10 \
  -o parts.multipart
```

```python title="Python"
# pip install requests requests-toolbelt
import requests
from requests_toolbelt.multipart.decoder import MultipartDecoder

with open('input.pdf', 'rb') as file:
    response = requests.post(
        'https://api.pdfblocks.com/v1/split_by_page_count',
        headers={'X-API-Key': 'your_api_key', 'Accept': 'multipart/mixed'},
        files={'file': file},
        data={'page_count': 10},
    )
response.raise_for_status()

for index, part in enumerate(MultipartDecoder.from_response(response).parts, start=1):
    with open(f'{index:05d}.pdf', 'wb') as out:
        out.write(part.content)
```

</CodeGroup>

## 注意点

- **`406` は、送信した `Accept` が一致しなかったことを意味します。**
  `application/zip`、`application/json`、`multipart/mixed` のいずれかを正確に送るか、`Accept` を一切送らないでください。HTTP クライアントの既定値による `application/pdf` や `*/*` の混入がよくある原因です。ヘッダーを明示的に設定してください。
- **大きな分割は大きなレスポンスを生みます。** 大きなドキュメントを多数の
  パートに分割すると、アーカイブがかなりのサイズになることがあります。レスポンス全体をメモリに保持せずディスクへストリーミングするか、`multipart/mixed` を使って届いたパートから順に処理してください。
- **1ページだけが規定サイズを超える場合。**
  [ファイルサイズで分割する](/docs/api/split-pdf-by-file-size) では、`maximum_bytes` を単独で超えるページは、上限を超えたまま単独のパートとして返されます。それ以上分割できないためです。まれに、パートが上限より大きくなることを想定しておいてください。

## 関連

<CardGroup cols={2}>

<Card title="レスポンスフォーマット" href="/docs/api/response-formats">
  ZIP・JSON・multipart の完全な仕様。
</Card>

<Card title="ページ数で分割する" href="/docs/api/split-pdf-by-page-count">
  PDF を固定サイズのチャンクに分割します。
</Card>

<Card title="ページグループで分割する" href="/docs/api/split-pdf-into-page-groups">
  各出力にどのページを含めるかを正確に定義します。
</Card>


</CardGroup>
