# Quitar la contraseña de un PDF

Descifre un PDF protegido con contraseña para que ya no pida una contraseña al abrirse.

Quite la contraseña de un PDF cifrado. Proporcione la contraseña que abre el
archivo actualmente y reciba un documento que se abre sin ninguna. La API es
*stateless*: su documento se procesa en la región y nunca se almacena.

## Endpoint

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

Disponible en todas las regiones. Consulte [Regiones y residencia de
datos](/docs/api/regions-and-data-residency) para el enrutamiento y la
residencia de datos.

| Región           | URL                                                  |
| ---------------- | ---------------------------------------------------- |
| Global           | `https://api.pdfblocks.com/v1/remove_password`       |
| Estados Unidos   | `https://us.api.pdfblocks.com/v1/remove_password`    |
| HIPAA de EE. UU. | `https://hipaa.api.pdfblocks.com/v1/remove_password` |
| Unión Europea    | `https://eu.api.pdfblocks.com/v1/remove_password`    |
| Reino Unido      | `https://uk.api.pdfblocks.com/v1/remove_password`    |
| Canadá           | `https://ca.api.pdfblocks.com/v1/remove_password`    |
| Australia        | `https://au.api.pdfblocks.com/v1/remove_password`    |
| Japón            | `https://jp.api.pdfblocks.com/v1/remove_password`    |
| India            | `https://in.api.pdfblocks.com/v1/remove_password`    |
| Brasil           | `https://br.api.pdfblocks.com/v1/remove_password`    |

## Autenticación

Autentique cada solicitud con su clave de API secreta en la cabecera
`X-API-Key`, por HTTPS. Cree y administre sus claves desde el
[dashboard](https://dashboard.pdfblocks.com). Consulte
[Autenticación](/docs/api/authentication) para más detalles.

## Solicitud

El endpoint acepta un cuerpo de solicitud `multipart/form-data`.

<ParamField name="file" type="file" required>
  El documento PDF cifrado de entrada.
</ParamField>

<ParamField name="password" type="string" required>
  La contraseña que abre el archivo actualmente. Máximo 256 caracteres.
</ParamField>

<Note>
  Para quitar la contraseña hay que conocerla: proporcione la contraseña que
  abre el documento actualmente. No existe ninguna vía de recuperación ni de
  fuerza bruta.
</Note>

## Ejemplos

Quite la contraseña de un PDF cifrado:

<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>

## Respuesta

Si todo va bien, la respuesta es `200 OK` con el PDF descifrado como cuerpo:

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

El documento de salida ya no pide una contraseña para abrirse: sus páginas y
su contenido no cambian. Escriba el cuerpo directamente en un archivo, como
hacen los ejemplos anteriores; en nuestro lado no se almacena nada.

## Errores

Las solicitudes fallidas devuelven un cuerpo `application/problem+json`. El
error más habitual en este endpoint es un `400`, que se devuelve cuando la
`password` proporcionada no abre el archivo: el objeto `errors` nombra cada
campo:

```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."]
  }
}
```

Una `X-API-Key` ausente o no válida devuelve un `401`. Consulte
[Errores](/docs/api/errors) para ver todos los códigos de estado y la forma
completa de la respuesta.

## Acciones relacionadas

<CardGroup cols={2}>

<Card title="Añadir una contraseña" href="/docs/api/add-password-to-pdf">
  Cifre un PDF con una contraseña.
</Card>

<Card title="Quitar restricciones" href="/docs/api/remove-restrictions-from-pdf">
  Borre los indicadores de permiso.
</Card>

<Card title="Añadir restricciones" href="/docs/api/add-restrictions-to-pdf">
  Establezca los indicadores de permiso.
</Card>

<Card title="Quitar firmas" href="/docs/api/remove-signatures-from-pdf">
  Quite las firmas de un documento.
</Card>

</CardGroup>
