Ajouter des restrictions à un PDF
Définissez les indicateurs d’autorisation d’un PDF pour contrôler la copie, l’impression, la modification et le remplissage de formulaires, derrière un mot de passe propriétaire.
Appliquez des restrictions d’autorisation à un PDF pour limiter la copie,
l’impression, la modification, le remplissage de formulaires et plus encore, le
tout imposé par un owner_password. Les restrictions sont des indicateurs
d’autorisation, à distinguer de l’ajout d’un mot de
passe, qui définit le mot de passe exigé
uniquement pour ouvrir le fichier ; vous pouvez aussi définir ici un
user_password pour exiger les deux. L’API est stateless : votre document
est traité dans la région et n’est jamais stocké.
Endpoint
/v1/add_restrictionsDisponible dans toutes les régions. Consultez Régions et résidence des données pour le routage et la résidence des données.
| Région | URL |
|---|---|
| Global | https://api.pdfblocks.com/v1/add_restrictions |
| États-Unis | https://us.api.pdfblocks.com/v1/add_restrictions |
| HIPAA États-Unis | https://hipaa.api.pdfblocks.com/v1/add_restrictions |
| Union européenne | https://eu.api.pdfblocks.com/v1/add_restrictions |
| Royaume-Uni | https://uk.api.pdfblocks.com/v1/add_restrictions |
| Canada | https://ca.api.pdfblocks.com/v1/add_restrictions |
| Australie | https://au.api.pdfblocks.com/v1/add_restrictions |
| Japon | https://jp.api.pdfblocks.com/v1/add_restrictions |
| Inde | https://in.api.pdfblocks.com/v1/add_restrictions |
| Brésil | https://br.api.pdfblocks.com/v1/add_restrictions |
Authentification
Authentifiez chaque requête avec votre clé d’API secrète dans l’en-tête
X-API-Key, en HTTPS. Créez et gérez vos clés depuis le
dashboard. Consultez
Authentification pour plus de détails.
Requête
L’endpoint accepte un corps de requête multipart/form-data.
filefilerequiredLe document PDF d’entrée.
owner_passwordstringrequiredLe mot de passe propriétaire. De 4 à 32 caractères ASCII imprimables. Il ouvre le document et modifie ses indicateurs d’autorisation.
user_passwordstringUn mot de passe utilisateur facultatif. De 4 à 32 caractères ASCII imprimables. S’il est défini, le document ne peut pas être ouvert sans lui. Omettez-le, ou laissez-le vide, pour que n’importe qui puisse ouvrir le document.
encryption_algorithmstringdefault:AES-128L’algorithme de chiffrement : AES-128 ou AES-256.
allow_copy_contentbooleandefault:trueAutoriser la copie du texte et des images dans le presse-papiers.
allow_change_contentbooleandefault:trueAutoriser la modification du contenu du document.
allow_printbooleandefault:trueAutoriser l’impression du document.
allow_print_high_resolutionbooleandefault:trueAutoriser l’impression en haute résolution.
allow_comment_and_fill_formbooleandefault:trueAutoriser l’ajout, l’édition ou la modification des annotations ainsi que le remplissage des champs de formulaire.
allow_fill_formbooleandefault:trueAutoriser le remplissage des champs de formulaire.
allow_assemble_documentbooleandefault:trueAutoriser l’assemblage ou la manipulation du document (insérer, supprimer et faire pivoter des pages).
allow_accessibilitybooleandefault:trueAutoriser les logiciels d’accessibilité à lire le texte et les images du document.
Indicateurs d’autorisation
Chaque indicateur régit une action que le lecteur peut effectuer. Transmettez
l’indicateur sous forme de booléen ; mettez-le à false pour désactiver cette
autorisation.
| Indicateur | Par défaut | Mettre à false pour… |
|---|---|---|
allow_copy_content |
true |
bloquer la copie du texte et des images dans le presse-papiers |
allow_change_content |
true |
bloquer la modification du contenu du document |
allow_print |
true |
bloquer l’impression du document |
allow_print_high_resolution |
true |
bloquer l’impression en haute résolution |
allow_comment_and_fill_form |
true |
bloquer l’ajout, l’édition ou la modification des annotations et le remplissage des champs de formulaire |
allow_fill_form |
true |
bloquer le remplissage des champs de formulaire |
allow_assemble_document |
true |
bloquer l’assemblage ou la manipulation du document (insérer, supprimer et faire pivoter des pages) |
allow_accessibility |
true |
empêcher les logiciels d’accessibilité de lire le document |
Chaque indicateur vaut true par défaut : rien n’est donc restreint, sauf
indication contraire. Envoyez uniquement les indicateurs que vous voulez
désactiver. Les restrictions sont imposées par l’owner_password : un lecteur
qui le fournit peut modifier les autorisations. N’ajoutez un user_password
que si vous voulez aussi exiger un mot de passe rien que pour ouvrir le
fichier. Pour le cycle de vie complet, consultez Protéger et déverrouiller
des documents.
Exemples
Verrouillez un document pour qu’il ne puisse être ni copié ni imprimé, tout en restant ouvrable par n’importe qui :
curl https://api.pdfblocks.com/v1/add_restrictions \
-H 'X-API-Key: your_api_key' \
-F file=@input.pdf \
-F owner_password='s3cr3t-owner' \
-F allow_copy_content=false \
-F allow_print=false \
-F allow_print_high_resolution=false \
-o restricted.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': 's3cr3t-owner',
'allow_copy_content': 'false',
'allow_print': 'false',
'allow_print_high_resolution': 'false',
},
)
response.raise_for_status()
with open('restricted.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', 's3cr3t-owner');
body.set('allow_copy_content', 'false');
body.set('allow_print', 'false');
body.set('allow_print_high_resolution', '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('restricted.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' => 's3cr3t-owner',
'allow_copy_content' => 'false',
'allow_print' => 'false',
'allow_print_high_resolution' => 'false',
],
]);
$pdf = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200) {
file_put_contents('restricted.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: 's3cr3t-owner',
allow_copy_content: 'false',
allow_print: 'false',
allow_print_high_resolution: 'false',
})
File.write('restricted.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", "s3cr3t-owner")
form.WriteField("allow_copy_content", "false")
form.WriteField("allow_print", "false")
form.WriteField("allow_print_high_resolution", "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("restricted.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("s3cr3t-owner"), "owner_password" },
{ new StringContent("false"), "allow_copy_content" },
{ new StringContent("false"), "allow_print" },
{ new StringContent("false"), "allow_print_high_resolution" },
};
var response = await client.PostAsync(
"https://api.pdfblocks.com/v1/add_restrictions", form);
response.EnsureSuccessStatusCode();
await File.WriteAllBytesAsync(
"restricted.pdf", await response.Content.ReadAsByteArrayAsync());Réponse
En cas de succès, la réponse est un 200 OK dont le corps contient le PDF
restreint :
HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Length: 48213La sortie est le même document avec les autorisations demandées appliquées : ses pages et son contenu sont inchangés. Écrivez le corps directement dans un fichier, comme le font les exemples ci-dessus ; rien n’est stocké de notre côté.
Erreurs
Les requêtes en échec renvoient un corps application/problem+json. La plus
courante pour cet endpoint est une 400, renvoyée lorsqu’un paramètre est
invalide, par exemple un owner_password qui ne fait pas de 4 à 32 caractères
ASCII imprimables, avec l’objet errors qui nomme chaque champ :
{
"type": "https://www.pdfblocks.com/docs/api/v1/error/400",
"title": "One or more validation errors occurred.",
"status": 400,
"errors": {
"owner_password": ["The field owner_password must match the regular expression '^[\\x20-\\x7e]{4,32}$'."]
}
}Une X-API-Key manquante ou invalide renvoie une 401. Consultez
Erreurs pour tous les codes de statut et la forme complète
de la réponse.
Recettes
Variantes courantes. Dépliez-en une pour la voir dans tous les langages.
Lecture seule : bloquer la copie, la modification et l’impression
curl https://api.pdfblocks.com/v1/add_restrictions \
-H 'X-API-Key: your_api_key' \
-F file=@input.pdf \
-F owner_password='s3cr3t-owner' \
-F allow_copy_content=false \
-F allow_change_content=false \
-F allow_print=false \
-F allow_print_high_resolution=false \
-o readonly.pdfimport 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': 's3cr3t-owner',
'allow_copy_content': 'false',
'allow_change_content': 'false',
'allow_print': 'false',
'allow_print_high_resolution': 'false',
},
)
response.raise_for_status()
with open('readonly.pdf', 'wb') as output:
output.write(response.content)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', 's3cr3t-owner');
body.set('allow_copy_content', 'false');
body.set('allow_change_content', 'false');
body.set('allow_print', 'false');
body.set('allow_print_high_resolution', '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('readonly.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' => 's3cr3t-owner',
'allow_copy_content' => 'false',
'allow_change_content' => 'false',
'allow_print' => 'false',
'allow_print_high_resolution' => 'false',
],
]);
$pdf = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200) {
file_put_contents('readonly.pdf', $pdf);
}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: 's3cr3t-owner',
allow_copy_content: 'false',
allow_change_content: 'false',
allow_print: 'false',
allow_print_high_resolution: 'false',
})
File.write('readonly.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", "s3cr3t-owner")
form.WriteField("allow_copy_content", "false")
form.WriteField("allow_change_content", "false")
form.WriteField("allow_print", "false")
form.WriteField("allow_print_high_resolution", "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("readonly.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("s3cr3t-owner"), "owner_password" },
{ new StringContent("false"), "allow_copy_content" },
{ new StringContent("false"), "allow_change_content" },
{ new StringContent("false"), "allow_print" },
{ new StringContent("false"), "allow_print_high_resolution" },
};
var response = await client.PostAsync(
"https://api.pdfblocks.com/v1/add_restrictions", form);
response.EnsureSuccessStatusCode();
await File.WriteAllBytesAsync(
"readonly.pdf", await response.Content.ReadAsByteArrayAsync());Exiger un mot de passe pour ouvrir, avec AES-256
curl https://api.pdfblocks.com/v1/add_restrictions \
-H 'X-API-Key: your_api_key' \
-F file=@input.pdf \
-F owner_password='s3cr3t-owner' \
-F user_password='open-me-2024' \
-F encryption_algorithm=AES-256 \
-o protected.pdfimport 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': 's3cr3t-owner',
'user_password': 'open-me-2024',
'encryption_algorithm': 'AES-256',
},
)
response.raise_for_status()
with open('protected.pdf', 'wb') as output:
output.write(response.content)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', 's3cr3t-owner');
body.set('user_password', 'open-me-2024');
body.set('encryption_algorithm', 'AES-256');
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' => 's3cr3t-owner',
'user_password' => 'open-me-2024',
'encryption_algorithm' => 'AES-256',
],
]);
$pdf = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200) {
file_put_contents('protected.pdf', $pdf);
}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: 's3cr3t-owner',
user_password: 'open-me-2024',
encryption_algorithm: 'AES-256',
})
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", "s3cr3t-owner")
form.WriteField("user_password", "open-me-2024")
form.WriteField("encryption_algorithm", "AES-256")
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("s3cr3t-owner"), "owner_password" },
{ new StringContent("open-me-2024"), "user_password" },
{ new StringContent("AES-256"), "encryption_algorithm" },
};
var response = await client.PostAsync(
"https://api.pdfblocks.com/v1/add_restrictions", form);
response.EnsureSuccessStatusCode();
await File.WriteAllBytesAsync(
"protected.pdf", await response.Content.ReadAsByteArrayAsync());