Proteggere e sbloccare i documenti
Come si combinano le azioni di sicurezza e in quale ordine chiamarle per proteggere o sbloccare un documento.
La sicurezza di un PDF è fatta di due cose distinte, e trovare l’ordine giusto richiede di sapere quale è quale. Una password crittografa il file e controlla chi può aprirlo. Le restrizioni sono flag di autorizzazione che controllano ciò che un lettore può fare una volta che è aperto: stampare, copiare, modificare. Questa guida mette in sequenza le cinque azioni di sicurezza in una procedura di protezione prima della distribuzione e in una procedura di sblocco.
Le azioni di sicurezza
| Azione | Percorso | Che cosa fa |
|---|---|---|
| Aggiungere una password | add_password |
Crittografa il PDF e imposta la password necessaria per aprirlo. |
| Aggiungere restrizioni | add_restrictions |
Imposta i flag di autorizzazione (stampa, copia, modifica) dietro una password proprietario; può impostare anche una password di apertura. |
| Rimuovere la password | remove_password |
Decrittografa un PDF quando se ne fornisce la password attuale. |
| Rimuovere le restrizioni | remove_restrictions |
Azzera tutti i flag di autorizzazione. |
| Rimuovere le firme | remove_signatures |
Rimuove le firme crittografiche e le marche temporali. |
Password e restrizioni. add_password accetta una sola password: quella
che un lettore digita per aprire il file. add_restrictions accetta una
owner_password che protegge i flag di autorizzazione, più una
user_password facoltativa che funge da password di apertura. Impostando
user_password il documento richiede una password per essere aperto;
omettendola chiunque può aprirlo, restando comunque vincolato dai flag di
autorizzazione.
L’unica regola che governa l’ordine
Crittografare per ultimo. Un PDF crittografato non può essere aperto da nessun’altra azione, perché non esiste un campo in cui fornirne la password. Eseguire quindi prima tutti i passaggi sul contenuto e sulle autorizzazioni (unione, filigrana, restrizioni) e aggiungere la password di apertura come passaggio finale. Per modificare un documento già protetto da password, rimuovere prima la password, elaborarlo e poi proteggerlo di nuovo.
Per via di questa regola, non usare add_password seguito da
add_restrictions: la chiamata alle restrizioni non può aprire il file appena
crittografato. Quando servono sia una password di apertura sia i flag di
autorizzazione, impostarli in un’unica chiamata a add_restrictions usando
insieme owner_password e user_password.
Proteggere un documento per la distribuzione
Bloccare un report in modo che richieda una password per essere aperto e non possa essere stampato, copiato o modificato, il tutto in un’unica chiamata.
Eseguire ora le unioni, le filigrane o il lavoro sulle pagine, mentre il documento non è ancora crittografato. Vedere Concatenare le azioni.
POST /v1/add_restrictions con una owner_password (protegge le
autorizzazioni), una user_password (la password di apertura) e i flag di
autorizzazione impostati su false per ciò che si vuole vietare.
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());Se serve solo una password di apertura e nessun flag di autorizzazione,
add_password è la chiamata più semplice:
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.pdfSia add_password sia add_restrictions accettano un encryption_algorithm
pari ad AES-128 (il valore predefinito) o AES-256. Vedere Aggiungere una
password e Aggiungere
restrizioni per tutti i campi.
Sbloccare un documento
Per togliere una protezione di cui si possiedono le credenziali, decrittografare prima e poi azzerare i flag di autorizzazione.
POST /v1/remove_password con la password attuale del documento. Il
risultato non richiede più una password per essere aperto, così i passaggi
successivi possono leggerlo.
POST /v1/remove_restrictions rimuove i flag di autorizzazione e lascia un
PDF senza restrizioni.
# 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 non ha un campo per la password, quindi funziona su un
documento che ha restrizioni ma non è protetto da password. Se un documento ha
una password di apertura, eseguire prima remove_password, come fa la
procedura qui sopra, in modo che la chiamata alle restrizioni possa leggerlo.
Rimuovere le firme
Una firma crittografica blocca un PDF: qualsiasi modifica la invalida. Se
occorre rielaborare un documento firmato, rimuovere prima le firme e le marche
temporali con remove_signatures. Questo invalida davvero le firme, cosa
inevitabile una volta che il contenuto cambia.
curl https://api.pdfblocks.com/v1/remove_signatures \
-H 'X-API-Key: your_api_key' \
-F file=@signed.pdf \
-o unsigned.pdf