Aprende a proteger tus documentos PDF creados con TCPDF estableciendo una contraseña en PHP.

Un PDF es lo más parecido a un documento oficial en el mundo digital y, de la misma manera, en la vida real, algunos PDF están destinados a ser confidenciales. Y si desea proteger un PDF generado con TCPDF, hay soporte para protección con contraseña y cifrado integrado en la biblioteca y solo necesita aprender a usarlo.

Básicamente, todo lo que necesita hacer para proteger su documento es utilizar el $yourPDF->SetProtection($arguments)método.

Nota: proteger un documento requiere cifrarlo, lo que aumenta mucho el tiempo de procesamiento . Esto puede provocar un tiempo de espera de PHP en algunos casos, especialmente si el documento contiene imágenes o fuentes. Puede extender el tiempo de ejecución aumentando el límite de tiempo usando  set_time_limit($seconds)o cambiando el valor en el php.iniarchivo.

Acerca del método SetProtection

El SetProtectionmétodo espera hasta 5 parámetros:

1. Matriz de permisos

El primer parámetro está destinado a ser una matriz de cadenas con identificadores como contenido que indica qué permisos deben eliminarse del PDF .

  • print : desactiva la posibilidad de imprimir el PDF desde cualquier visor de PDF.
  • modify : evitar la modificación del contenido del documento mediante operaciones distintas de las controladas por 'llenar formularios', 'extraer' y 'ensamblar';
  • copy : evitar la copia o extracción de texto y gráficos del documento;
  • annot-forms : Agregue o modifique anotaciones de texto, complete campos de formulario interactivos y, si también se establece 'modificar', cree o modifique campos de formulario interactivos (incluidos los campos de firma);
  • fill-forms : Complete los campos de formulario interactivos existentes (incluidos los campos de firma), incluso si no se especifica 'annot-forms';
  • extract : Extraer texto y gráficos (en apoyo de la accesibilidad para usuarios con discapacidades o para otros fines);
  • assemble : Ensamblar el documento (insertar, rotar o eliminar páginas y crear marcadores o imágenes en miniatura), incluso si "modificar" no está configurado;
  • print-high: Imprima el documento en una representación a partir de la cual se pueda generar una copia digital fiel del contenido PDF. Cuando no se establece, la impresión se limita a una representación de bajo nivel de la apariencia, posiblemente de calidad degradada.
  • owner : (lógica invertida - solo para clave pública) cuando se establece permite el cambio de cifrado y habilita todos los demás permisos.

El siguiente código debería evitar que se imprima o modifique un PDF:

$pdf->SetProtection(array('print','modify'));

2. Contraseña de usuario

El segundo parámetro está destinado a ser la contraseña que todo usuario debe proporcionar cada vez que intenta abrir el PDF en cualquier visor de PDF. Utilice null''como valor para no utilizar ninguna contraseña para el usuario.

Password protected PDF in PDF Viewer

La imagen anterior muestra un PDF con contraseña que intenta ser visto en el Visor de PDF de Chrome.

3. Contraseña del propietario

La contraseña maestra (propietario), si es diferente de la del usuario, se puede utilizar para obtener acceso completo al documento en caso de que desee revocar alguno de los permisos eliminados en cualquier visor de PDF.

4. Tipo de cifrado

Los valores posibles del tipo de cifrado son:

  • 0 = RSA de 40 bits
  • 1 = RSA de 128 bits
  • 2 = AES de 128 bits
  • 3 = AES de 256 bits

El cifrado de PDF funciona internamente con claves de cifrado de 40, 128 o 256 bits, según la versión del PDF. La clave de cifrado binaria se deriva de una contraseña proporcionada por el usuario.

Se debe crear un PDF cifrado con RSA de 40 bits con:

$pdf->SetProtection($permissions,"PasswordForUsers","MyMasterPassword",0);

5. Firmar pdf con clave pública

En caso de que desee firmar el PDF con una clave pública, debe proporcionar como quinto y último parámetro una matriz con 2 claves:

  • c: la ruta local al certificado ( yourpublickey.crt).
  • p: permisos (la misma estructura que el primer parámetro) dentro de una matriz.

Un PDF firmado con una clave pública, debe crearse utilizando el siguiente código:

$pdf->SetProtection(null,null,null,0, array(
    'c' => '/path/to/self-signed-certificate.crt',
    'p' => array('print','modify')
));

Ejemplo de PDF protegido

Como se mencionó anteriormente, para proteger su PDF, debe prestar atención al SetProtectionmétodo y estará listo para comenzar.

<?php

//require __DIR__ . '/vendor/autoload.php';
// Suponemos que sabes cómo incluir la clase TCPDF en tu documento.

$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

/**
 * Proteja el PDF de ser impreso, copiado o modificado. Para ser visto, el usuario necesita
 * para proporcionar "ourcodeworld" como contraseña.
 */
$pdf->SetProtection(array('print', 'copy','modify'), "ourcodeworld", "ourcodeworld-master", 0, null);

// configurar la información del documento
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Our Code World');
$pdf->SetTitle('TCPDF Example');
$pdf->SetSubject('TCPDF Tutorial');
$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
// establecer datos de encabezado predeterminados
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 016', PDF_HEADER_STRING);
// establecer fuentes de encabezado y pie de página
$pdf->setHeaderFont(array('helvetica', '', PDF_FONT_SIZE_MAIN));
$pdf->setFooterFont(array('helvetica', '', PDF_FONT_SIZE_DATA));
// establecer fuente monoespaciada predeterminada
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
// establecer márgenes
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
// establecer saltos de página automáticos
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
// establecer el factor de escala de la imagen
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

// agregar una página
$pdf->AddPage();

// configurar algo de texto para imprimir
$txt = <<<EOD
Encryption Example

Consulte la documentación del código fuente para el método SetProtection ().
EOD;

// imprimir un bloque de texto usando Write()
$pdf->Write(0, $txt, '', 0, 'L', true, 0, false, false, 0);

// Cierra y envíe el documento PDF al navegador
$pdf->Output('example_016.pdf', 'I');

Puede ver una demostración oficial en el sitio web de TCPDF sobre el cifrado de un PDF aquí  o leer la documentación de la clase TCPDF .

Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores