Esta página puede contener texto traducido automáticamente.

Descifrar documentos PDF en C# y VB.NET

Un documento PDF puede estar protegido con contraseñas, certificados o no protegido.

Existen diferentes enfoques para abrir documentos PDF. El método recomendado es comprobar primero si un archivo PDF está protegido. La alternativa es intentar abrir cualquier documento PDF sin comprobar primero si está cifrado o no. La biblioteca Docotic.Pdf genera excepciones CannotDecryptPdfException para documentos que requieren una contraseña o un certificado.

Descifrar PDF, eliminar contraseña de PDF en C# y VB.NET

Comprobar si un documento PDF está protegido

La biblioteca proporciona métodos GetEncryptionInfo para comprobar si un documento PDF está cifrado. Estos métodos también proporcionan información sobre el controlador de cifrado utilizado para cifrar el documento.

Biblioteca Docotic.Pdf 9.3.16943-dev Pruebas de regresión 14,638 pasaron Descargas totales de NuGet 4,145,451

El siguiente fragmento de código C# muestra cómo comprobar si un archivo PDF está cifrado:

var info = PdfDocument.GetEncryptionInfo(fileName);
if (info == null)
    Console.WriteLine("No está cifrado");
else if (info is PdfStandardEncryptionInfo standardInfo)
    Console.WriteLine("Está cifrado con una contraseña");
else if (info is PdfPublicKeyEncryptionInfo publicKeyInfo)
    Console.WriteLine("Está encriptado con un certificado(s) digital(es)");

Muchos documentos PDF cifrados con contraseñas no requieren una contraseña para abrirlos. Para dichos archivos PDF, sólo se requiere una contraseña para el modo "propietario" (sin restricciones).

if (standardInfo.RequiresPasswordToOpen)
    Console.WriteLine("No se puede abrir sin contraseña");
else
    Console.WriteLine("No requiere contraseña");

Para un documento PDF cifrado con certificados, es posible obtener información sobre sus destinatarios. En otras palabras, puedes comprobar qué certificados pueden desbloquear el documento PDF. Tenga en cuenta que los permisos de los documentos dependen del certificado real utilizado para descifrar el archivo PDF.

// la propiedad Destinatarios contiene información sobre los certificados
// que se pueden utilizar para descifrar documentos PDF
foreach (var recipient in publicKeyInfo.Recipients)
    Console.WriteLine(recipient.SerialNumber);

Abrir documentos PDF cifrados en .NET

Un documento PDF cifrado mediante contraseñas puede requerir o no una contraseña para abrirlo. En cualquier caso, utilice un constructor de PdfDocument para abrir el documento.

Si el archivo PDF no requiere una contraseña, utilice un constructor sin un parámetro de controlador de descifrado. La biblioteca Docotic.Pdf abrirá el documento con permisos de "usuario" (restringidos).

Si el documento PDF requiere una contraseña para abrirlo, utilice un constructor con un controlador del tipo PdfStandardDecryptionHandler. Utilice el mismo constructor si desea abrir un archivo PDF seguro con permisos de "propietario" (sin restricciones).

El siguiente fragmento de código muestra cómo abrir un archivo PDF protegido con contraseña en C#:

using (var document = new PdfDocument(fileName, new PdfStandardDecryptionHandler("password")))
{
    // hacer algo con el documento descifrado
}

Los documentos PDF cifrados mediante certificados requieren un certificado coincidente para abrirlos. Puede haber más de un certificado coincidente para un archivo PDF. El autor del documento PDF cifrado puede otorgar diferentes permisos para diferentes certificados coincidentes.

Si tiene un certificado coincidente instalado en el almacén de certificados X.509 del usuario actual, utilice un constructor PdfDocument sin un parámetro de controlador de descifrado. La biblioteca Docotic.Pdf utilizará el primer certificado coincidente del almacén de certificados y utilizará el certificado para abrir el documento.

En los casos en que no tenga instalado un certificado coincidente o deseado en el almacén de certificados X.509 del usuario actual, cree una instancia PdfPublicKeyDecryptionHandler y utilícela con un constructor PdfDocument. Puede crear un controlador utilizando un certificado, un almacén de claves o un almacén de certificados.

El siguiente fragmento de código de C# crea un controlador de descifrado de clave pública con un certificado de un almacén de claves. Luego, el controlador se utiliza para abrir un archivo PDF protegido por certificado:

var handler = new PdfPublicKeyDecryptionHandler("key-store.p12", "password");
using (var document = new PdfDocument(fileName, handler))
{
    // hacer algo con el documento descifrado
}

Eliminar la protección de archivos PDF

Para eliminar la protección de un documento PDF, siga estos pasos:

  • abra el PDF usando un constructor PdfDocument con un controlador de descifrado adecuado
  • no configure ningún controlador de cifrado en las opciones de guardado
  • guardar el documento PDF

Sin un controlador de cifrado, la biblioteca guardará el documento PDF no cifrado.

Para eliminar contraseñas de un PDF, abra el documento con un controlador del tipo PdfStandardDecryptionHandler. Para documentos protegidos por certificado, utilice un controlador del tipo PdfPublicKeyDecryptionHandler.

Verifique los permisos de PDF en .NET

Para verificar los permisos otorgados para un documento PDF, primero deberá crear o abrir el documento. No importa si abres un archivo PDF cifrado o un archivo sin protección.

Este fragmento de código muestra cómo verificar los permisos de PDF en C#:

// crear un documento nuevo o abrir un documento existente
using (PdfDocument document = ...)
{
    Console.WriteLine("Document permissions = {0}", document.GrantedPermissions);
}