PDF Blocks
PreciosSoporte
Empezar gratis
Ir a la página

Dividir un PDF en grupos de páginas

Divida un PDF en los grupos de páginas que usted defina, donde cada grupo se convierte en un documento de salida.

Divida un documento PDF en los grupos de páginas que usted defina: cada grupo se convierte en un PDF de salida, en el orden escrito. Dentro de un grupo, las páginas y los rangos siguen la sintaxis de páginas ordenada, así que salen exactamente como se listan. Esta acción devuelve varios documentos, empaquetados en una sola respuesta según la cabecera Accept. La API es stateless: su documento se procesa en la región y nunca se almacena.

Endpoint

POST
/v1/split_by_groups

Disponible en todas las regiones. Consulte Regiones y residencia de datos para el enrutamiento y la residencia de datos.

Región URL
Global https://api.pdfblocks.com/v1/split_by_groups
Estados Unidos https://us.api.pdfblocks.com/v1/split_by_groups
HIPAA de EE. UU. https://hipaa.api.pdfblocks.com/v1/split_by_groups
Unión Europea https://eu.api.pdfblocks.com/v1/split_by_groups
Reino Unido https://uk.api.pdfblocks.com/v1/split_by_groups
Canadá https://ca.api.pdfblocks.com/v1/split_by_groups
Australia https://au.api.pdfblocks.com/v1/split_by_groups
Japón https://jp.api.pdfblocks.com/v1/split_by_groups
India https://in.api.pdfblocks.com/v1/split_by_groups
Brasil https://br.api.pdfblocks.com/v1/split_by_groups

Autenticación

Autentique cada solicitud con su clave de API secreta en la cabecera X-API-Key, por HTTPS. Cree y administre sus claves desde el dashboard. Consulte Autenticación para más detalles.

Solicitud

El endpoint acepta un cuerpo de solicitud multipart/form-data.

filefilerequired

El documento PDF de entrada.

groupsstringrequired

Los grupos de páginas que se producirán, siguiendo la sintaxis de grupos de páginas. Los grupos se separan con ;; dentro de un grupo, las páginas y los rangos se separan con , y siguen las reglas de orden. Cada grupo se convierte en un PDF de salida, en el orden escrito. Por ejemplo, 2..8,29;1 produce dos PDF: las páginas 2 a 8 y luego la 29, y la página 1.

Grupos de páginas

Los grupos se separan con ;. Dentro de cada grupo, las páginas y los rangos siguen la sintaxis ordenada: el orden y las repeticiones importan, una página nombrada dos veces se emite dos veces y un rango puede ir hacia atrás. Cada grupo se convierte en un PDF de salida, emitido en el orden en que están escritos los grupos.

Por ejemplo, 2..8,29;1 produce dos documentos:

Grupo PDF de salida Páginas
2..8,29 00001.pdf Las páginas 2, 3, 4, 5, 6, 7, 8 y luego la 29
1 00002.pdf La página 1

Dentro de un grupo, groups comparte la semántica ordenada de page_order. Consulte Seleccionar páginas para ver la referencia completa.

Ejemplos

Divida un documento en dos PDF: las páginas 2 a 8 y luego la 29, y la página 1:

cURLbash
curl https://api.pdfblocks.com/v1/split_by_groups \
  -H 'X-API-Key: your_api_key' \
  -F file=@input.pdf \
  -F groups='2..8,29;1' \
  -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_groups',
        headers={'X-API-Key': 'your_api_key'},
        files={'file': file},
        data={'groups': '2..8,29;1'},
    )

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('groups', '2..8,29;1');

const response = await fetch('https://api.pdfblocks.com/v1/split_by_groups', {
  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_groups');
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'),
        'groups' => '2..8,29;1',
    ],
]);

$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_groups', form: {
    file: HTTP::FormData::File.new('input.pdf'),
    groups: '2..8,29;1',
  })

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("groups", "2..8,29;1")
	form.Close()

	req, _ := http.NewRequest("POST", "https://api.pdfblocks.com/v1/split_by_groups", &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("2..8,29;1"), "groups" },
};

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

Respuesta

Esta acción devuelve varios documentos, empaquetados en una sola respuesta según la cabecera de solicitud Accept: consulte Formatos de respuesta y negociación de contenido para ver la referencia completa de la negociación. Sin cabecera Accept, la opción predeterminada es un archivo ZIP:

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

Seleccione el empaquetado con la cabecera Accept:

Cabecera Accept Respuesta
(no se envía) application/zip: la opción predeterminada
application/zip Un archivo ZIP con los PDF de salida
application/json Un sobre JSON con los documentos codificados en base64
multipart/mixed Un PDF por parte
cualquier otra cosa 406 Not Acceptable

La API produce un documento de salida por grupo, en el orden en que están escritos los grupos, con los nombres 00001.pdf, 00002.pdf y así sucesivamente.

Para ver código de principio a fin que llama a una acción de división y desempaqueta cada formato, ya sea extrayendo el ZIP, decodificando el sobre JSON o leyendo las partes multipart, consulte la guía Dividir un PDF.

Errores

Las solicitudes fallidas devuelven un cuerpo application/problem+json. El error más habitual en este endpoint es un 400, que se devuelve cuando falta groups, está mal formado o hace referencia a una página que no existe en el documento: el objeto errors nombra cada campo:

{
  "type": "https://www.pdfblocks.com/docs/api/v1/error/400",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "errors": {
    "groups": ["The groups field references a page that does not exist in the document."]
  }
}

Si la cabecera Accept no coincide con application/zip, application/json ni multipart/mixed, por ejemplo Accept: application/pdf, la API responde con 406 Not Acceptable. Omita Accept para tomar el ZIP predeterminado, o solicite uno de los tipos de medio admitidos. Una X-API-Key ausente o no válida devuelve un 401. Consulte Errores para ver todos los códigos de estado y la forma completa de la respuesta.

Recetas

Una variante habitual. Despliéguela para ver el código en todos los lenguajes.

Recibir las partes como un sobre JSON

Envíe Accept: application/json para recibir todas las partes en línea en una sola respuesta y después decodifique de base64 el content de cada entrada en un archivo con el nombre de su name:

cURLbash
curl https://api.pdfblocks.com/v1/split_by_groups \
  -H 'X-API-Key: your_api_key' \
  -H 'Accept: application/json' \
  -F file=@input.pdf \
  -F groups='2..8,29;1' \
  | 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_groups',
        headers={
            'X-API-Key': 'your_api_key',
            'Accept': 'application/json',
        },
        files={'file': file},
        data={'groups': '2..8,29;1'},
    )

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('groups', '2..8,29;1');

const response = await fetch('https://api.pdfblocks.com/v1/split_by_groups', {
  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_groups');
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'),
        'groups' => '2..8,29;1',
    ],
]);

$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_groups', form: {
    file: HTTP::FormData::File.new('input.pdf'),
    groups: '2..8,29;1',
  })

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("groups", "2..8,29;1")
	form.Close()

	req, _ := http.NewRequest("POST", "https://api.pdfblocks.com/v1/split_by_groups", &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("2..8,29;1"), "groups" },
};

var response = await client.PostAsync(
    "https://api.pdfblocks.com/v1/split_by_groups", 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));
}

Acciones relacionadas