# Supprimer le mot de passe d’un PDF

Déchiffrez un PDF protégé par mot de passe pour qu’il n’en exige plus à l’ouverture. Fournissez le mot de passe actuel et récupérez un document libre.

Supprimez le mot de passe d’un PDF chiffré. Fournissez le mot de passe qui ouvre
actuellement le fichier et récupérez un document qui s’ouvre sans mot de passe.
L’API est *stateless* : votre document est traité dans la région et n’est jamais
stocké.

## Endpoint

<Endpoint method="POST" path="/v1/remove_password" />

Disponible dans toutes les régions. Consultez [Régions et résidence des
données](/docs/api/regions-and-data-residency) pour le routage et la résidence
des données.

| Région           | URL                                                  |
| ---------------- | ---------------------------------------------------- |
| Global           | `https://api.pdfblocks.com/v1/remove_password`       |
| Union européenne | `https://eu.api.pdfblocks.com/v1/remove_password`    |
| États-Unis       | `https://us.api.pdfblocks.com/v1/remove_password`    |
| HIPAA États-Unis | `https://hipaa.api.pdfblocks.com/v1/remove_password` |
| Royaume-Uni      | `https://uk.api.pdfblocks.com/v1/remove_password`    |
| Canada           | `https://ca.api.pdfblocks.com/v1/remove_password`    |
| Australie        | `https://au.api.pdfblocks.com/v1/remove_password`    |
| Japon            | `https://jp.api.pdfblocks.com/v1/remove_password`    |
| Inde             | `https://in.api.pdfblocks.com/v1/remove_password`    |
| Brésil           | `https://br.api.pdfblocks.com/v1/remove_password`    |

## 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](https://dashboard.pdfblocks.com). Consultez
[Authentification](/docs/api/authentication) pour plus de détails.

## Requête

L’endpoint accepte un corps de requête `multipart/form-data`.

<ParamField name="file" type="file" required>
  Le document PDF chiffré d’entrée.
</ParamField>

<ParamField name="password" type="string" required>
  Le mot de passe qui ouvre actuellement le fichier. Maximum 256 caractères.
</ParamField>

<Note>
  Supprimer le mot de passe suppose de le connaître : fournissez le mot de passe
  qui ouvre actuellement le document. Il n’existe aucune voie de récupération ni
  d’attaque par force brute.
</Note>

## Exemples

Supprimez le mot de passe d’un PDF chiffré :

<CodeGroup>

```bash title="cURL"
curl https://api.pdfblocks.com/v1/remove_password \
  -H 'X-API-Key: your_api_key' \
  -F file=@input.pdf \
  -F password='0pen-Sesame' \
  -o unlocked.pdf
```

```python title="Python"
# pip install requests
import requests

with open('input.pdf', 'rb') as file:
    response = requests.post(
        'https://api.pdfblocks.com/v1/remove_password',
        headers={'X-API-Key': 'your_api_key'},
        files={'file': file},
        data={'password': '0pen-Sesame'},
    )

response.raise_for_status()
with open('unlocked.pdf', 'wb') as output:
    output.write(response.content)
```

```javascript title="Node.js"
// 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('password', '0pen-Sesame');

const response = await fetch('https://api.pdfblocks.com/v1/remove_password', {
  method: 'POST',
  headers: { 'X-API-Key': 'your_api_key' },
  body,
});

if (!response.ok) throw new Error(`Request failed: ${response.status}`);
await writeFile('unlocked.pdf', Buffer.from(await response.arrayBuffer()));
```

```php title="PHP"
<?php
$ch = curl_init('https://api.pdfblocks.com/v1/remove_password');
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'),
        'password' => '0pen-Sesame',
    ],
]);

$pdf = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200) {
    file_put_contents('unlocked.pdf', $pdf);
}
```

```ruby title="Ruby"
# gem install http
require 'http'

response = HTTP
  .headers('X-API-Key' => 'your_api_key')
  .post('https://api.pdfblocks.com/v1/remove_password', form: {
    file: HTTP::FormData::File.new('input.pdf'),
    password: '0pen-Sesame',
  })

File.write('unlocked.pdf', response.body) if response.status.success?
```

```go title="Go"
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("password", "0pen-Sesame")
	form.Close()

	req, _ := http.NewRequest("POST", "https://api.pdfblocks.com/v1/remove_password", &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("unlocked.pdf")
	defer out.Close()
	io.Copy(out, res.Body)
}
```

```csharp title="C#"
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("0pen-Sesame"), "password" },
};

var response = await client.PostAsync(
    "https://api.pdfblocks.com/v1/remove_password", form);
response.EnsureSuccessStatusCode();
await File.WriteAllBytesAsync(
    "unlocked.pdf", await response.Content.ReadAsByteArrayAsync());
```

</CodeGroup>

## Réponse

En cas de succès, la réponse est un `200 OK` dont le corps contient le PDF
déchiffré :

```http
HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Length: 48213
```

Le document de sortie n’exige plus de mot de passe à l’ouverture : 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 lorsque le `password` fourni
n’ouvre pas le fichier. L’objet `errors` nomme chaque champ :

```json
{
  "type": "https://www.pdfblocks.com/docs/api/v1/error/400",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "errors": {
    "password": ["The password is incorrect."]
  }
}
```

Une `X-API-Key` manquante ou invalide renvoie une `401`. Consultez
[Erreurs](/docs/api/errors) pour tous les codes de statut et la forme complète
de la réponse.

## Actions associées

<CardGroup cols={2}>

<Card title="Ajouter un mot de passe" href="/docs/api/add-password-to-pdf">
  Chiffrer un PDF avec un mot de passe.
</Card>

<Card title="Supprimer les restrictions" href="/docs/api/remove-restrictions-from-pdf">
  Effacer les indicateurs d’autorisation.
</Card>

<Card title="Ajouter des restrictions" href="/docs/api/add-restrictions-to-pdf">
  Définir des indicateurs d’autorisation.
</Card>

<Card title="Supprimer les signatures" href="/docs/api/remove-signatures-from-pdf">
  Supprimer les signatures d’un document.
</Card>

</CardGroup>
