Proteger y desbloquear documentos
Cómo encajan entre sí las acciones de seguridad y en qué orden llamarlas al proteger o desbloquear un documento.
La seguridad de un PDF son dos cosas distintas, y acertar con el orden depende de saber cuál es cuál. Una contraseña cifra el archivo y controla quién puede abrirlo. Las restricciones son indicadores de permiso que controlan qué puede hacer un lector una vez abierto: imprimir, copiar, editar. Esta guía ordena las cinco acciones de seguridad en un flujo de proteger y distribuir y en un flujo de desbloqueo.
Las acciones de seguridad
| Acción | Ruta | Qué hace |
|---|---|---|
| Añadir contraseña | add_password |
Cifra el PDF y establece la contraseña necesaria para abrirlo. |
| Añadir restricciones | add_restrictions |
Establece los indicadores de permiso (imprimir, copiar, editar) detrás de una contraseña de propietario; también puede establecer una contraseña de apertura. |
| Quitar contraseña | remove_password |
Descifra un PDF cuando usted proporciona su contraseña actual. |
| Quitar restricciones | remove_restrictions |
Borra todos los indicadores de permiso. |
| Quitar firmas | remove_signatures |
Quita las firmas criptográficas y las marcas de tiempo. |
Contraseñas frente a restricciones. add_password recibe una sola
password: la contraseña que teclea el lector para abrir el archivo.
add_restrictions recibe una owner_password que protege los indicadores
de permiso, más una user_password opcional que funciona como contraseña
de apertura. Si establece user_password, el documento necesitará una
contraseña para abrirse; si la omite, cualquiera podrá abrirlo pero seguirá
sujeto a los indicadores de permiso.
La regla que gobierna el orden
Cifre al final. Ninguna otra acción puede abrir un PDF cifrado, porque no hay ningún campo para indicar su contraseña. Así que ejecute primero todos los pasos de contenido y de permisos (unir, marca de agua, restricciones) y añada la contraseña de apertura como paso final. Para modificar un documento que ya está protegido con contraseña, quite la contraseña primero, procéselo y vuelva a protegerlo.
Por esa regla, no apile add_password y después add_restrictions: la
llamada de restricciones no puede abrir el archivo que acaba de cifrarse.
Cuando necesite a la vez una contraseña de apertura e indicadores de
permiso, establézcalos en una sola llamada a add_restrictions usando
owner_password y user_password juntas.
Proteger un documento para distribuirlo
Blinde un informe para que pida una contraseña al abrirse y no se pueda imprimir, copiar ni editar, todo en una sola llamada.
Haga ahora cualquier unión, marca de agua o trabajo con páginas, mientras el documento todavía no está cifrado. Consulte Encadenar acciones.
POST /v1/add_restrictions con una owner_password (protege los
permisos), una user_password (la contraseña de apertura) y los
indicadores de permiso en false para lo que quiera prohibir.
curl https://api.pdfblocks.com/v1/add_restrictions \
-H 'X-API-Key: your_api_key' \
-F file=@input.pdf \
-F owner_password='owner-secret' \
-F user_password='open-secret' \
-F allow_print=false \
-F allow_copy_content=false \
-F allow_change_content=false \
-o protected.pdf# pip install requests
import requests
with open('input.pdf', 'rb') as file:
response = requests.post(
'https://api.pdfblocks.com/v1/add_restrictions',
headers={'X-API-Key': 'your_api_key'},
files={'file': file},
data={
'owner_password': 'owner-secret',
'user_password': 'open-secret',
'allow_print': 'false',
'allow_copy_content': 'false',
'allow_change_content': 'false',
},
)
response.raise_for_status()
with open('protected.pdf', 'wb') as output:
output.write(response.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('owner_password', 'owner-secret');
body.set('user_password', 'open-secret');
body.set('allow_print', 'false');
body.set('allow_copy_content', 'false');
body.set('allow_change_content', 'false');
const response = await fetch('https://api.pdfblocks.com/v1/add_restrictions', {
method: 'POST',
headers: { 'X-API-Key': 'your_api_key' },
body,
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
await writeFile('protected.pdf', Buffer.from(await response.arrayBuffer()));<?php
$ch = curl_init('https://api.pdfblocks.com/v1/add_restrictions');
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'),
'owner_password' => 'owner-secret',
'user_password' => 'open-secret',
'allow_print' => 'false',
'allow_copy_content' => 'false',
'allow_change_content' => 'false',
],
]);
$pdf = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200) {
file_put_contents('protected.pdf', $pdf);
}# gem install http
require 'http'
response = HTTP
.headers('X-API-Key' => 'your_api_key')
.post('https://api.pdfblocks.com/v1/add_restrictions', form: {
file: HTTP::FormData::File.new('input.pdf'),
owner_password: 'owner-secret',
user_password: 'open-secret',
allow_print: 'false',
allow_copy_content: 'false',
allow_change_content: 'false',
})
File.write('protected.pdf', response.body) if response.status.success?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("owner_password", "owner-secret")
form.WriteField("user_password", "open-secret")
form.WriteField("allow_print", "false")
form.WriteField("allow_copy_content", "false")
form.WriteField("allow_change_content", "false")
form.Close()
req, _ := http.NewRequest("POST",
"https://api.pdfblocks.com/v1/add_restrictions", &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("protected.pdf")
defer out.Close()
io.Copy(out, res.Body)
}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("owner-secret"), "owner_password" },
{ new StringContent("open-secret"), "user_password" },
{ new StringContent("false"), "allow_print" },
{ new StringContent("false"), "allow_copy_content" },
{ new StringContent("false"), "allow_change_content" },
};
var response = await client.PostAsync(
"https://api.pdfblocks.com/v1/add_restrictions", form);
response.EnsureSuccessStatusCode();
await File.WriteAllBytesAsync(
"protected.pdf", await response.Content.ReadAsByteArrayAsync());Si solo necesita una contraseña de apertura y ningún indicador de permiso,
add_password es la llamada más simple:
curl https://api.pdfblocks.com/v1/add_password \
-H 'X-API-Key: your_api_key' \
-F file=@input.pdf \
-F password='pa$$word' \
-o encrypted.pdfTanto add_password como add_restrictions aceptan un
encryption_algorithm de AES-128 (el predeterminado) o AES-256. Consulte
Añadir una contraseña y Añadir
restricciones para ver todos los campos.
Desbloquear un documento
Para levantar una protección de la que tiene las credenciales, descifre primero y después borre los indicadores de permiso.
POST /v1/remove_password con la password actual del documento. El
resultado ya no pide una contraseña para abrirse, así que los pasos
posteriores pueden leerlo.
POST /v1/remove_restrictions quita los indicadores de permiso y deja un
PDF sin restricciones.
# 1. Decrypt with the known password.
curl -sS https://api.pdfblocks.com/v1/remove_password \
-H 'X-API-Key: your_api_key' \
-F file=@protected.pdf \
-F password='open-secret' |
# 2. Clear the permission flags from the decrypted bytes.
curl -sS https://api.pdfblocks.com/v1/remove_restrictions \
-H 'X-API-Key: your_api_key' \
-F 'file=@-;filename=unlocked.pdf;type=application/pdf' \
-o unrestricted.pdf# pip install requests
import requests
BASE = 'https://api.pdfblocks.com'
HEADERS = {'X-API-Key': 'your_api_key'}
# 1. Decrypt with the known password.
with open('protected.pdf', 'rb') as file:
unlocked = requests.post(
f'{BASE}/v1/remove_password',
headers=HEADERS,
files={'file': file},
data={'password': 'open-secret'},
)
unlocked.raise_for_status()
# 2. Clear the permission flags from the decrypted bytes.
unrestricted = requests.post(
f'{BASE}/v1/remove_restrictions',
headers=HEADERS,
files={'file': ('unlocked.pdf', unlocked.content, 'application/pdf')},
)
unrestricted.raise_for_status()
with open('unrestricted.pdf', 'wb') as output:
output.write(unrestricted.content)remove_restrictions no tiene campo de contraseña, así que funciona sobre
un documento restringido pero no protegido con contraseña. Si un documento
tiene una contraseña de apertura, ejecute remove_password primero, como
hace el flujo anterior, para que la llamada de restricciones pueda leerlo.
Quitar firmas
Una firma criptográfica bloquea un PDF: cualquier edición la invalida. Si
tiene que volver a procesar un documento firmado, quite primero las firmas y
las marcas de tiempo con remove_signatures. Esto sí invalida las firmas,
algo inevitable en cuanto cambia el contenido.
curl https://api.pdfblocks.com/v1/remove_signatures \
-H 'X-API-Key: your_api_key' \
-F file=@signed.pdf \
-o unsigned.pdf