PDF Blocks
PreçosSuporte
Começar grátis
Abrir a página

Dividir um PDF por tamanho de arquivo

Divida um PDF em documentos menores, nenhum deles maior que um tamanho máximo em bytes.

Divida um documento PDF em vários documentos menores, nenhum deles maior que um tamanho máximo de arquivo em bytes. Esta ação retorna vários documentos, empacotados em uma única resposta de acordo com o cabeçalho Accept. A API é stateless: seu documento é processado na própria região e nunca é armazenado.

Endpoint

POST
/v1/split_by_size

Disponível em todas as regiões. Consulte Regiões e residência de dados para o roteamento e a residência de dados.

Região URL
Global https://api.pdfblocks.com/v1/split_by_size
Estados Unidos https://us.api.pdfblocks.com/v1/split_by_size
HIPAA Estados Unidos https://hipaa.api.pdfblocks.com/v1/split_by_size
União Europeia https://eu.api.pdfblocks.com/v1/split_by_size
Reino Unido https://uk.api.pdfblocks.com/v1/split_by_size
Canadá https://ca.api.pdfblocks.com/v1/split_by_size
Austrália https://au.api.pdfblocks.com/v1/split_by_size
Japão https://jp.api.pdfblocks.com/v1/split_by_size
Índia https://in.api.pdfblocks.com/v1/split_by_size
Brasil https://br.api.pdfblocks.com/v1/split_by_size

Autenticação

Autentique cada requisição com sua chave de API secreta no cabeçalho X-API-Key, por HTTPS. Crie e gerencie suas chaves no dashboard. Consulte Autenticação para mais detalhes.

Requisição

O endpoint aceita um corpo de requisição multipart/form-data.

filefilerequired

O documento PDF de entrada.

maximum_bytesintegerrequired

O tamanho máximo, em bytes, de cada PDF de saída. Deve ser 1 ou maior.

Exemplos

Divida um documento de modo que cada parte tenha no máximo 1 MB:

cURLbash
curl https://api.pdfblocks.com/v1/split_by_size \
  -H 'X-API-Key: your_api_key' \
  -F file=@input.pdf \
  -F maximum_bytes=1048576 \
  -o parts.zip
Pythonpython
# pip install requests
import requests

with open('input.pdf', 'rb') as file:
    response = requests.post(
        'https://api.pdfblocks.com/v1/split_by_size',
        headers={'X-API-Key': 'your_api_key'},
        files={'file': file},
        data={'maximum_bytes': 1048576},  # 1 MB
    )

response.raise_for_status()
with open('parts.zip', 'wb') as output:
    output.write(response.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('maximum_bytes', '1048576'); // 1 MB

const response = await fetch('https://api.pdfblocks.com/v1/split_by_size', {
  method: 'POST',
  headers: { 'X-API-Key': 'your_api_key' },
  body,
});

if (!response.ok) throw new Error(`Request failed: ${response.status}`);
await writeFile('parts.zip', Buffer.from(await response.arrayBuffer()));
PHPphp
<?php
$ch = curl_init('https://api.pdfblocks.com/v1/split_by_size');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['X-API-Key: your_api_key'],
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => [
        'file' => new CURLFile('input.pdf', 'application/pdf'),
        'maximum_bytes' => '1048576', // 1 MB
    ],
]);

$zip = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200) {
    file_put_contents('parts.zip', $zip);
}
Rubyruby
# gem install http
require 'http'

response = HTTP
  .headers('X-API-Key' => 'your_api_key')
  .post('https://api.pdfblocks.com/v1/split_by_size', form: {
    file: HTTP::FormData::File.new('input.pdf'),
    maximum_bytes: '1048576', # 1 MB
  })

File.write('parts.zip', response.body) if response.status.success?
Gogo
package main

import (
	"bytes"
	"io"
	"mime/multipart"
	"net/http"
	"os"
)

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("maximum_bytes", "1048576") // 1 MB
	form.Close()

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

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

	out, _ := os.Create("parts.zip")
	defer out.Close()
	io.Copy(out, res.Body)
}
C#csharp
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "your_api_key");

using var form = new MultipartFormDataContent
{
    { new ByteArrayContent(File.ReadAllBytes("input.pdf")), "file", "input.pdf" },
    { new StringContent("1048576"), "maximum_bytes" }, // 1 MB
};

var response = await client.PostAsync(
    "https://api.pdfblocks.com/v1/split_by_size", form);
response.EnsureSuccessStatusCode();
await File.WriteAllBytesAsync(
    "parts.zip", await response.Content.ReadAsByteArrayAsync());

Resposta

Esta ação retorna vários documentos, empacotados em uma única resposta de acordo com o cabeçalho de requisição Accept. Consulte Formatos de resposta e negociação de conteúdo para a referência completa da negociação. Sem o cabeçalho Accept, o padrão é um arquivo ZIP:

HTTP/1.1 200 OK
Content-Type: application/zip

Selecione o empacotamento com o cabeçalho Accept:

Cabeçalho Accept Resposta
(nenhum enviado) application/zip (o padrão)
application/zip Um arquivo ZIP com os PDFs de saída
application/json Um envelope JSON com documentos codificados em base64
multipart/mixed Um PDF por parte
qualquer outra coisa 406 Not Acceptable

Os documentos de saída são nomeados 00001.pdf, 00002.pdf e assim por diante, em ordem.

Cada parte é preenchida até ficar logo abaixo de maximum_bytes, segundo o tamanho da saída gerada, de modo que as partes se aproximam do limite sem nunca ultrapassá-lo. A exceção é uma única página cujo próprio tamanho já ultrapassa maximum_bytes: ela é retornada sozinha em uma parte que excede o limite, porque uma página nunca é dividida.

Para código de ponta a ponta que chama uma ação de divisão e desempacota cada formato (extrair o ZIP, decodificar o envelope JSON ou ler as partes multipart), consulte o guia Dividir um PDF.

Erros

Requisições com falha retornam um corpo application/problem+json. O erro mais comum neste endpoint é um 400, retornado quando maximum_bytes está ausente ou é menor que 1, ou quando file não é um PDF legível. O objeto errors nomeia cada campo:

{
  "type": "https://www.pdfblocks.com/docs/api/v1/error/400",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "errors": {
    "maximum_bytes": ["The field maximum_bytes must be greater than or equal to 1."]
  }
}

Se o cabeçalho Accept não corresponder a nenhum dos tipos application/zip, application/json ou multipart/mixed, por exemplo Accept: application/pdf, a API responde 406 Not Acceptable. Omita Accept para usar o padrão ZIP ou peça um dos tipos de mídia compatíveis. Uma X-API-Key ausente ou inválida retorna um 401. Consulte Erros para todos os códigos de status e o formato completo da resposta.

Receitas

Uma variação comum. Expanda-a para ver o código em todas as linguagens.

Receber as partes como um envelope JSON

Envie Accept: application/json para receber todas as partes em linha em uma única resposta e depois decodifique de base64 o content de cada entrada em um arquivo nomeado a partir do seu name:

cURLbash
curl https://api.pdfblocks.com/v1/split_by_size \
  -H 'X-API-Key: your_api_key' \
  -H 'Accept: application/json' \
  -F file=@input.pdf \
  -F maximum_bytes=1048576 \
  | jq -r '.documents[] | .name + " " + .content' \
  | while read -r name content; do
      echo "$content" | base64 --decode > "$name"
    done
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_size',
        headers={
            'X-API-Key': 'your_api_key',
            'Accept': 'application/json',
        },
        files={'file': file},
        data={'maximum_bytes': 1048576},
    )

response.raise_for_status()
for document in response.json()['documents']:
    with open(document['name'], 'wb') as output:
        output.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('maximum_bytes', '1048576');

const response = await fetch('https://api.pdfblocks.com/v1/split_by_size', {
  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 doc of documents) {
  await writeFile(doc.name, Buffer.from(doc.content, 'base64'));
}
PHPphp
<?php
$ch = curl_init('https://api.pdfblocks.com/v1/split_by_size');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'X-API-Key: your_api_key',
        'Accept: application/json',
    ],
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => [
        'file' => new CURLFile('input.pdf', 'application/pdf'),
        'maximum_bytes' => '1048576',
    ],
]);

$body = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200) {
    foreach (json_decode($body, true)['documents'] as $document) {
        file_put_contents($document['name'], base64_decode($document['content']));
    }
}
Rubyruby
# gem install http
require 'base64'
require 'http'
require 'json'

response = HTTP
  .headers('X-API-Key' => 'your_api_key', 'Accept' => 'application/json')
  .post('https://api.pdfblocks.com/v1/split_by_size', form: {
    file: HTTP::FormData::File.new('input.pdf'),
    maximum_bytes: '1048576',
  })

if response.status.success?
  JSON.parse(response.body)['documents'].each do |document|
    File.write(document['name'], Base64.decode64(document['content']))
  end
end
Gogo
package main

import (
	"bytes"
	"encoding/base64"
	"encoding/json"
	"io"
	"mime/multipart"
	"net/http"
	"os"
)

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("maximum_bytes", "1048576")
	form.Close()

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

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

	var result struct {
		Documents []struct {
			Name    string `json:"name"`
			Content string `json:"content"`
		} `json:"documents"`
	}
	json.NewDecoder(res.Body).Decode(&result)

	for _, doc := range result.Documents {
		data, _ := base64.StdEncoding.DecodeString(doc.Content)
		os.WriteFile(doc.Name, data, 0644)
	}
}
C#csharp
using System.Text.Json;

using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "your_api_key");
client.DefaultRequestHeaders.Add("Accept", "application/json");

using var form = new MultipartFormDataContent
{
    { new ByteArrayContent(File.ReadAllBytes("input.pdf")), "file", "input.pdf" },
    { new StringContent("1048576"), "maximum_bytes" },
};

var response = await client.PostAsync(
    "https://api.pdfblocks.com/v1/split_by_size", form);
response.EnsureSuccessStatusCode();

using var json = JsonDocument.Parse(
    await response.Content.ReadAsStringAsync());
foreach (var document in json.RootElement.GetProperty("documents").EnumerateArray())
{
    var name = document.GetProperty("name").GetString()!;
    var content = document.GetProperty("content").GetString()!;
    await File.WriteAllBytesAsync(name, Convert.FromBase64String(content));
}

Ações relacionadas