PDF Blocks
料金サポート
無料で始める
ページへ移動

PDF を分割して出力を扱う

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

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

分割アクションを選ぶ

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

アクション 分割方法 主なフィールド
ページ数で分割する (split_by_page_count) パートごとの固定ページ数 page_count
指定したページで分割する (split_at_page) 1つの境界で2つのパートに分ける page
ファイルサイズで分割する (split_by_size) パートごとの最大バイトサイズ maximum_bytes
ページグループで分割する (split_by_groups) 自分で定義した明示的なグループ groups

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

出力フォーマットを選ぶ

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

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

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

ZIP を取得する(デフォルト)

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

cURLbash
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 …
Pythonpython
# 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')
Gogo
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()
	}
}

JSON を取得する

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

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

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

cURLbash
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
Pythonpython
# 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']))
Node.jsjavascript
// 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'));
}

multipart/mixed を取得する

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

cURLbash
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
Pythonpython
# 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)

注意点

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

関連