Ver índice
Inclusión de ficheros y firma digital

        Ocultar índice  

   Índice de contenidos
   Instalación en Windows
   Instalación en Ubuntu
   Servidores seguros
   Páginas dinámicas
   Sintaxis básica
   Operaciones
   Arrays
   Formatos de presentación
   Operadores
   Bucles
   Extraer y ord. información
   Funciones
   Ficheros externos
   Imágenes dinámicas
   Gestión de directorios
   Cookies y sesiones
   Clases y objetos
   Ficheros en formato PDF
   Bases de datos MySQL
   PHP y XML
   PDO - Bases SQLite / MySQL
   MySQL a traves de misqli
   Algo de JavaScript y AJAX


Inclusión de ficheros

Otra de las posibilidades que ofrece la clase TCPDF es la inclusión de anotaciones y ficheros incrustados en el propio documento PDF. Para ello se utiliza el método siguiente:

$Objecto->Annotation(x, y, ancho, alto, texto, array('Subtype'=>'FileAttachment', 'Name' =>'icono', 'FS'=>'nombre_fichero '))

dónde x e y son las coordenadas del punto dónde se insertará el icono que advierte de la existencia de una anotación. Los valores ancho y alto especifican las dimensiones de ese icono. El parámetro texto permite incluir un texto alternativo que si visualizaría cuando se colocara el puntero del ratón sobre el icono. Cuando se incluye ese texto aparecerá a la derecha del icono una advertencia en forma de «bocadillo de cómic». Si ese texto se deja como cadena vacía no se visualizará esta última marca.

El array que se incluirá como sexto parámetro es de tipo asociativo. Su primer elemento, Subtype, tendrá como valor FileAttachement (alude a la inclusión de un fichero adjunto), el elemento cuyo índice es Name especificará en su valor el tipo de icono que se visualizará en el documento. Son válidos los tipos: Graph, Paperclip Tag y PushPin. El elemento de índice FS tendrá como valor el nombre y la extensión del fichero que incluirá en el documento. Como es lógico tal fichero ha de estar ubicado en un lugar accesible por el servidor.

  ¡Cuidado!  

La descarga de ficheros adjuntos (pulsando con el botón derecho del ratón sobre el icono) está restringida en Adobe Reader por razones de seguridad. Ficheros ejecutables, comprimidos, etcétera no se abren en prevención de que pudieran contener elementos maliciosos.

Cuando se trata de incluir únicamente una nota de comentario puede utilizarse el método anterior con la sintaxis siguiente:

$Objecto->Annotation(x, y, ancho, alto, texto, array('Subtype'=>'Text', 'Name' =>'Comment', 'T'=>titulo, 'C' => array(255, 255, 0)))

las modificaciones respecto al supuesto anterior son: la modificación del valor del elemento Subtype que ahora toma Text como valor; la modificación de valor del elemento Name que ahora pasa a tener como valor Comment; la inclusión del elemento T al que podremos asignar como valor el título de comentario y la posibilidad de añadir un color al icono de comentario mediante el elemento C al que se asigna como valor un array cuyos tres elementos son las componentes R, G, B del color que pretende aplicarse.

Firma digital de los documentos

Otra de posibilidades de la clase TCPDF es la firma digital de los documentos generados. Con ello, si el servidor dispone de certificados digitales (no es necesario que esté configurado en modo seguro) los ficheros pdf pueden ser firmados de forma que al ser leidos por el cliente a través de Adobe Reader pueda verificar la no manipulación y la autenticidad de la firma.

Para efectuar la firma de un documento necesitaremos acceder al certificado digital de servidor y también su clave privada. Si no hemos efectuado la instalación en modo seguro del servidor Apache y no disponemos de los certificados allí utilizados podemos utilizar a efectos de pruebas uno que viene incluido con la distribución de TCPDF, dentro del directorio tcpdf, con nombre tcpdf.crt y cuya contraseña es tcpdfdemo. El método que permite incluir la firma digital del servidor es el siguiente:

$objeto->setSignature( certificado, clave_privada, contraseña, extras, tipo, informacion)

dónde certificado es una cadena que comienza por file:// y va seguida de la ruta y nombre del fichero que contiene el certificado que va a ser utilizado para facilitar la comprobación de la firma del documento; clave_privada es la clave privada del firmante (también debe indicarse mediante file:// y va seguida de la ruta y nombre del fichero). La contraseña será la contraseña de uso de la clave privada.

Si utilizamos el certificado de servidor mencionado en este enlace esa contraseña será una cadena vacía ya que, tal como puedes recordar si visitas el enlace anterior, al crear la clave privada del servidor (la función genrsa de OpenSSL) habíamos omitido el modificador -des3 precisamente para que tal contraseña no fuera requerida.

Como parámetro extras vamos a utilizar una cadena vacía ya que nuestro certificados carecen de esa información complementaria. Como parámetro tipo podemos incluir 1 (cualquier cambio en el documento invalidará la firma), 2 (se permite la cumplimentación de formularios sin invalidar la firma) o 3 (no invalida la firma ni la cumplimentación de formularios ni la inclusión, modificación o eliminación de anotaciones).

Por último, informacion es un array asociativo cuyos elementos tienen por índices: 'Name', 'Reason' , 'Location' y 'ContactInfo' y contendrán como valores cadena conteniendo datos informativos sobre el titular del certificado digital utilizado. Esos valores podrán ser visualizados por el cliente de la forma que veremos en el párrafo siguiente.

Aunque no resulta elemento imprescindible es habitual incluir en el documento algún tipo de imagen o símbolo que sugiera que el documento incluye una firma digital. Puede ser cualquier elemento gráfico. Cuando se ejerce esa opción suele complementarse con la definición de un área activa en el documento (normalmente la que ocupa el gráfico que simboliza la firma) de modo que al pulsar con el ratón sobre esa zona se abra una ventana que facilite la información aludida en el párrafo anterior.

En los ejemplos que incluimos a continuación tienes una muestra del uso de anotaciones y firma digital. En el primero de ellos utilizaremos el certificado demostración incluido con TCPDF y en el segundo haremos uso del certificado al que hemos hecho mención en certificado de servidor mencionado en este enlace. Si no dispones de esos certificados o si la ruta no coincide el segundo de los ejemplos te dará error.

ejemplo353.php Ver código fuente ejemplo354.php Ver código fuente

  ¡Cuidado!  

En el ejemplo anterior habrás observado que en el caso de que el sistema operativo sea Ubuntu hemos aplicado la funcion realpath() a la ruta hasta el certificado y la clave privada. De no hacerlo así la ejecución del script produce un error.
La funcion realpath(ruta) devuelve el nombre de la ruta en forma de ruta absoluta canónica que tiene un valor único y que no siempre coincide con la ruta absoluta que suele depender del sistema operativo en uso.

Tal como habrás podido observar a mirar el código fuente, en este ejemplo he intentado incluir algunos fichero incrustados y a la vez crear un documento firmado con certificado digital, guardando el pdf resultante en el servidor –con un nombre creado de forma aleatoria– e incluyendo en el propio fichero la ruta hasta el mismo. Una vez creado el fichero se abriría de forma automática en el navegador del cliente que podría guardarlo en su equipo y/o imprimirlo.

La firma digital es facilmente comprobable en un documento digital pero es evidente que esa comprobación es imposible en una copia impresa del documento. Al guardarlo en el servidor e incluir la dirección estaremos facilitando la posibilidad de comprobar la fidelidad de una copia a cualquiera que tenga acceso a ella.

Un ejemplo de aplicación

Incluimos un ejemplo que intenta mostrar en alguna medida las posibilidades de esta herramienta emulando una ventanilla de registro clásica. Al ejecutar el script se carga un formulario que, una vez cumplimentado e incluidos los ficheros adjuntos solicitados, es enviado al servidor, donde se bloquean los campos del formulario y se agregan unos textos que emulan el sello de registro de entrada (en caso de identificación mediante certificado electrónico podría incluir los datos de este). También se incrustan en el documento, formando un todo con él, los ficheros adjuntos. El fichero resultante se almacena en el servidor (emulando el original para la administración) y se devuelve al navegador una copia completa del mismo.

ejemplo355.php Ver código fuente