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.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 が返されます。完全な仕様については レスポンスフォーマット を参照してください。
ZIP を取得する(デフォルト)
Accept ヘッダーを送らない場合、レスポンスは ZIP アーカイブになります。保存してから、そのエントリを順に処理します。
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 …# 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')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 エンコードされた content、content_type を持ちます。
{
"documents": [
{ "name": "00001.pdf", "content": "JVBERi0xLjcK…", "content_type": "application/pdf" },
{ "name": "00002.pdf", "content": "JVBERi0xLjcK…", "content_type": "application/pdf" }
]
}JSON は、呼び出し側がバイト列と一緒にドキュメント名も欲しい場合や、バイナリのアーカイブよりテキストとして扱う方が簡単な転送経路の場合に便利です。各 content を base64 からデコードして PDF を復元してください。
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# 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.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.pdf、00002.pdf のように名付ける Content-Disposition が付きます。アーカイブ全体をメモリに保持するのではなく、届いたパートから順に処理したい場合はこちらを選んでください。ほとんどの言語には multipart パーサーがあります。Python では requests-toolbelt がレスポンスを直接デコードします。
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# 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/zip、application/json、multipart/mixedのいずれかを正確に送るか、Acceptを一切送らないでください。HTTP クライアントの既定値によるapplication/pdfや*/*の混入がよくある原因です。ヘッダーを明示的に設定してください。- 大きな分割は大きなレスポンスを生みます。 大きなドキュメントを多数の
パートに分割すると、アーカイブがかなりのサイズになることがあります。レスポンス全体をメモリに保持せずディスクへストリーミングするか、
multipart/mixedを使って届いたパートから順に処理してください。 - 1ページだけが規定サイズを超える場合。
ファイルサイズで分割する では、
maximum_bytesを単独で超えるページは、上限を超えたまま単独のパートとして返されます。それ以上分割できないためです。まれに、パートが上限より大きくなることを想定しておいてください。