Ajouter un filigrane texte à un PDF
Apposez jusqu’à trois lignes de texte sur les pages d’un PDF, avec un contrôle sur le modèle, la couleur et l’opacité.
Ajoutez un filigrane texte à un document PDF. Fournissez jusqu’à trois lignes
de texte et contrôlez le modèle, la couleur, la transparence et la marge. Par
défaut, le filigrane est apposé sur toutes les pages : utilisez le paramètre
pages pour cibler un sous-ensemble. L’API est
stateless : votre document est traité dans la région et n’est jamais stocké.
Endpoint
/v1/add_text_watermarkDisponible 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_text_watermark |
| États-Unis | https://us.api.pdfblocks.com/v1/add_text_watermark |
| HIPAA États-Unis | https://hipaa.api.pdfblocks.com/v1/add_text_watermark |
| Union européenne | https://eu.api.pdfblocks.com/v1/add_text_watermark |
| Royaume-Uni | https://uk.api.pdfblocks.com/v1/add_text_watermark |
| Canada | https://ca.api.pdfblocks.com/v1/add_text_watermark |
| Australie | https://au.api.pdfblocks.com/v1/add_text_watermark |
| Japon | https://jp.api.pdfblocks.com/v1/add_text_watermark |
| Inde | https://in.api.pdfblocks.com/v1/add_text_watermark |
| Brésil | https://br.api.pdfblocks.com/v1/add_text_watermark |
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.
line_1stringrequiredLa première ligne du texte du filigrane. Maximum 32 caractères. Utilisez des caractères latins standard.
line_2stringLa deuxième ligne du texte du filigrane. Maximum 32 caractères.
line_3stringLa troisième ligne du texte du filigrane. Maximum 32 caractères.
pagesstringLes pages sur lesquelles apposer le filigrane, écrites sous forme de plage
de pages comme 1..3,5. Si le paramètre est omis,
le filigrane est appliqué à toutes les pages. Maximum 1000 caractères.
templateintegerdefault:1001Le modèle du filigrane, qui fixe le style (plein ou contour) et l’orientation.
colorstringdefault:GrayLa couleur du filigrane. L’une de Red, Blue, Gray ou
Black.
transparencyintegerdefault:75Le niveau de transparence, de 0 (totalement opaque) à 100 (totalement
transparent).
margindecimaldefault:1.0La distance, en pouces, entre le bord de la page et le filigrane. 0 ou
plus.
Modèles de filigrane
Chaque template combine un style, plein ou contour, avec une
orientation. Passez l’identifiant au paramètre template.
| Modèle | Style | Orientation |
|---|---|---|
1001 |
Plein | Diagonale, du bas à gauche vers le haut à droite (par défaut) |
1002 |
Plein | Diagonale, du haut à gauche vers le bas à droite |
1003 |
Plein | Horizontale |
1004 |
Plein | Verticale, lue de bas en haut |
1005 |
Plein | Verticale, lue de haut en bas |
1017 |
Contour | Diagonale, du bas à gauche vers le haut à droite |
1018 |
Contour | Diagonale, du haut à gauche vers le bas à droite |
1019 |
Contour | Horizontale |
1020 |
Contour | Verticale, lue de bas en haut |
1021 |
Contour | Verticale, lue de haut en bas |
Voyez tous les modèles rendus sur une page d’exemple dans le catalogue visuel des modèles.
Couleurs
| Valeur | Échantillon |
|---|---|
Red |
#C00000 |
Blue |
#005DFF |
Gray |
#545454 |
Black |
#000000 |
Sélectionner des pages
Le paramètre pages prend une liste, séparée par des virgules, de numéros de
page en base 1 et de plages. Il est traité comme un ensemble : l’ordre et
les doublons sont ignorés, et le filigrane est toujours apposé dans l’ordre du
document.
| Motif | Sélectionne |
|---|---|
| (omis) | Toutes les pages |
1 |
La première page uniquement |
1..3,5 |
Les pages 1, 2, 3 et 5 |
2.. |
De la page 2 à la dernière page |
..-2 |
De la première page à l’avant-dernière |
-1 |
La dernière page |
Consultez Sélectionner des pages pour la référence complète.
Exemples
Apposez un filigrane de deux lignes sur les pages 1 à 3 et 5 :
curl https://api.pdfblocks.com/v1/add_text_watermark \
-H 'X-API-Key: your_api_key' \
-F file=@input.pdf \
-F line_1='CONFIDENTIAL' \
-F line_2='ACME, Inc.' \
-F template=1001 \
-F color=Red \
-F pages='1..3,5' \
-o watermarked.pdf# pip install requests
import requests
with open('input.pdf', 'rb') as file:
response = requests.post(
'https://api.pdfblocks.com/v1/add_text_watermark',
headers={'X-API-Key': 'your_api_key'},
files={'file': file},
data={
'line_1': 'CONFIDENTIAL',
'line_2': 'ACME, Inc.',
'template': 1001,
'color': 'Red',
'pages': '1..3,5',
},
)
response.raise_for_status()
with open('watermarked.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('line_1', 'CONFIDENTIAL');
body.set('line_2', 'ACME, Inc.');
body.set('template', '1001');
body.set('color', 'Red');
body.set('pages', '1..3,5');
const response = await fetch('https://api.pdfblocks.com/v1/add_text_watermark', {
method: 'POST',
headers: { 'X-API-Key': 'your_api_key' },
body,
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
await writeFile('watermarked.pdf', Buffer.from(await response.arrayBuffer()));<?php
$ch = curl_init('https://api.pdfblocks.com/v1/add_text_watermark');
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'),
'line_1' => 'CONFIDENTIAL',
'line_2' => 'ACME, Inc.',
'template' => '1001',
'color' => 'Red',
'pages' => '1..3,5',
],
]);
$pdf = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200) {
file_put_contents('watermarked.pdf', $pdf);
}# gem install http
require 'http'
response = HTTP
.headers('X-API-Key' => 'your_api_key')
.post('https://api.pdfblocks.com/v1/add_text_watermark', form: {
file: HTTP::FormData::File.new('input.pdf'),
line_1: 'CONFIDENTIAL',
line_2: 'ACME, Inc.',
template: '1001',
color: 'Red',
pages: '1..3,5',
})
File.write('watermarked.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("line_1", "CONFIDENTIAL")
form.WriteField("line_2", "ACME, Inc.")
form.WriteField("template", "1001")
form.WriteField("color", "Red")
form.WriteField("pages", "1..3,5")
form.Close()
req, _ := http.NewRequest("POST", "https://api.pdfblocks.com/v1/add_text_watermark", &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("watermarked.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("CONFIDENTIAL"), "line_1" },
{ new StringContent("ACME, Inc."), "line_2" },
{ new StringContent("1001"), "template" },
{ new StringContent("Red"), "color" },
{ new StringContent("1..3,5"), "pages" },
};
var response = await client.PostAsync(
"https://api.pdfblocks.com/v1/add_text_watermark", form);
response.EnsureSuccessStatusCode();
await File.WriteAllBytesAsync(
"watermarked.pdf", await response.Content.ReadAsByteArrayAsync());Réponse
En cas de succès, la réponse est 200 OK avec le PDF filigrané comme corps :
HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Length: 48213La sortie conserve le nombre de pages et les dimensions de l’entrée : seul le filigrane est ajouté. É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 ou que file n’est pas un PDF lisible. L’objet errors nomme chaque
champ :
{
"type": "https://www.pdfblocks.com/docs/api/v1/error/400",
"title": "One or more validation errors occurred.",
"status": 400,
"errors": {
"line_1": ["The field line_1 must be a string with a maximum length of 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.
Un DRAFT rouge et bien visible sur toutes les pages
curl https://api.pdfblocks.com/v1/add_text_watermark \
-H 'X-API-Key: your_api_key' \
-F file=@input.pdf \
-F line_1='DRAFT' \
-F color=Red \
-F template=1001 \
-F transparency=40 \
-o draft.pdfimport requests
with open('input.pdf', 'rb') as file:
response = requests.post(
'https://api.pdfblocks.com/v1/add_text_watermark',
headers={'X-API-Key': 'your_api_key'},
files={'file': file},
data={'line_1': 'DRAFT', 'color': 'Red', 'template': 1001, 'transparency': 40},
)
response.raise_for_status()
with open('draft.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('line_1', 'DRAFT');
body.set('color', 'Red');
body.set('template', '1001');
body.set('transparency', '40');
const response = await fetch('https://api.pdfblocks.com/v1/add_text_watermark', {
method: 'POST',
headers: { 'X-API-Key': 'your_api_key' },
body,
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
await writeFile('draft.pdf', Buffer.from(await response.arrayBuffer()));<?php
$ch = curl_init('https://api.pdfblocks.com/v1/add_text_watermark');
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'),
'line_1' => 'DRAFT',
'color' => 'Red',
'template' => '1001',
'transparency' => '40',
],
]);
$pdf = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200) {
file_put_contents('draft.pdf', $pdf);
}require 'http'
response = HTTP
.headers('X-API-Key' => 'your_api_key')
.post('https://api.pdfblocks.com/v1/add_text_watermark', form: {
file: HTTP::FormData::File.new('input.pdf'),
line_1: 'DRAFT',
color: 'Red',
template: '1001',
transparency: '40',
})
File.write('draft.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("line_1", "DRAFT")
form.WriteField("color", "Red")
form.WriteField("template", "1001")
form.WriteField("transparency", "40")
form.Close()
req, _ := http.NewRequest("POST", "https://api.pdfblocks.com/v1/add_text_watermark", &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("draft.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("DRAFT"), "line_1" },
{ new StringContent("Red"), "color" },
{ new StringContent("1001"), "template" },
{ new StringContent("40"), "transparency" },
};
var response = await client.PostAsync(
"https://api.pdfblocks.com/v1/add_text_watermark", form);
response.EnsureSuccessStatusCode();
await File.WriteAllBytesAsync(
"draft.pdf", await response.Content.ReadAsByteArrayAsync());Un CONFIDENTIAL en contour sur la page de couverture
curl https://api.pdfblocks.com/v1/add_text_watermark \
-H 'X-API-Key: your_api_key' \
-F file=@input.pdf \
-F line_1='CONFIDENTIAL' \
-F template=1017 \
-F pages='1' \
-o confidential.pdfimport requests
with open('input.pdf', 'rb') as file:
response = requests.post(
'https://api.pdfblocks.com/v1/add_text_watermark',
headers={'X-API-Key': 'your_api_key'},
files={'file': file},
data={'line_1': 'CONFIDENTIAL', 'template': 1017, 'pages': '1'},
)
response.raise_for_status()
with open('confidential.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('line_1', 'CONFIDENTIAL');
body.set('template', '1017');
body.set('pages', '1');
const response = await fetch('https://api.pdfblocks.com/v1/add_text_watermark', {
method: 'POST',
headers: { 'X-API-Key': 'your_api_key' },
body,
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
await writeFile('confidential.pdf', Buffer.from(await response.arrayBuffer()));<?php
$ch = curl_init('https://api.pdfblocks.com/v1/add_text_watermark');
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'),
'line_1' => 'CONFIDENTIAL',
'template' => '1017',
'pages' => '1',
],
]);
$pdf = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200) {
file_put_contents('confidential.pdf', $pdf);
}require 'http'
response = HTTP
.headers('X-API-Key' => 'your_api_key')
.post('https://api.pdfblocks.com/v1/add_text_watermark', form: {
file: HTTP::FormData::File.new('input.pdf'),
line_1: 'CONFIDENTIAL',
template: '1017',
pages: '1',
})
File.write('confidential.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("line_1", "CONFIDENTIAL")
form.WriteField("template", "1017")
form.WriteField("pages", "1")
form.Close()
req, _ := http.NewRequest("POST", "https://api.pdfblocks.com/v1/add_text_watermark", &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("confidential.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("CONFIDENTIAL"), "line_1" },
{ new StringContent("1017"), "template" },
{ new StringContent("1"), "pages" },
};
var response = await client.PostAsync(
"https://api.pdfblocks.com/v1/add_text_watermark", form);
response.EnsureSuccessStatusCode();
await File.WriteAllBytesAsync(
"confidential.pdf", await response.Content.ReadAsByteArrayAsync());Une mention grise discrète sur toutes les pages sauf la dernière
curl https://api.pdfblocks.com/v1/add_text_watermark \
-H 'X-API-Key: your_api_key' \
-F file=@input.pdf \
-F line_1='ACME, Inc.' \
-F line_2='Do not distribute' \
-F color=Gray \
-F transparency=88 \
-F pages='..-2' \
-o notice.pdfimport requests
with open('input.pdf', 'rb') as file:
response = requests.post(
'https://api.pdfblocks.com/v1/add_text_watermark',
headers={'X-API-Key': 'your_api_key'},
files={'file': file},
data={
'line_1': 'ACME, Inc.',
'line_2': 'Do not distribute',
'color': 'Gray',
'transparency': 88,
'pages': '..-2',
},
)
response.raise_for_status()
with open('notice.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('line_1', 'ACME, Inc.');
body.set('line_2', 'Do not distribute');
body.set('color', 'Gray');
body.set('transparency', '88');
body.set('pages', '..-2');
const response = await fetch('https://api.pdfblocks.com/v1/add_text_watermark', {
method: 'POST',
headers: { 'X-API-Key': 'your_api_key' },
body,
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
await writeFile('notice.pdf', Buffer.from(await response.arrayBuffer()));<?php
$ch = curl_init('https://api.pdfblocks.com/v1/add_text_watermark');
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'),
'line_1' => 'ACME, Inc.',
'line_2' => 'Do not distribute',
'color' => 'Gray',
'transparency' => '88',
'pages' => '..-2',
],
]);
$pdf = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200) {
file_put_contents('notice.pdf', $pdf);
}require 'http'
response = HTTP
.headers('X-API-Key' => 'your_api_key')
.post('https://api.pdfblocks.com/v1/add_text_watermark', form: {
file: HTTP::FormData::File.new('input.pdf'),
line_1: 'ACME, Inc.',
line_2: 'Do not distribute',
color: 'Gray',
transparency: '88',
pages: '..-2',
})
File.write('notice.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("line_1", "ACME, Inc.")
form.WriteField("line_2", "Do not distribute")
form.WriteField("color", "Gray")
form.WriteField("transparency", "88")
form.WriteField("pages", "..-2")
form.Close()
req, _ := http.NewRequest("POST", "https://api.pdfblocks.com/v1/add_text_watermark", &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("notice.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("ACME, Inc."), "line_1" },
{ new StringContent("Do not distribute"), "line_2" },
{ new StringContent("Gray"), "color" },
{ new StringContent("88"), "transparency" },
{ new StringContent("..-2"), "pages" },
};
var response = await client.PostAsync(
"https://api.pdfblocks.com/v1/add_text_watermark", form);
response.EnsureSuccessStatusCode();
await File.WriteAllBytesAsync(
"notice.pdf", await response.Content.ReadAsByteArrayAsync());