Ir al contenido

PGD | §3.10 – El formato PDF y su relación con PostScript

§3.9 – Introducción a PDF

Históricamente, PDF se desarrolló sobre las ideas y herramientas creadas para PostScript; de aquí que la primera forma práctica para crear un PDF desde cualquier aplicación, aprovechando la tecnología existente, fue crear un archivo PostScript para luego convertirlo mediante Distiller.

Podemos ordenar las semejanzas entre PDF y PostScript de esta forma:

  • Por diseño, ambos son lenguajes de descripción de páginas (PDL – Printer Description Language);
  • Utilizan el mismo modelo de imagen;
  • Ambos son independientes del dispositivo: la descripción del documento no requiere a priori información alguna sobre el dispositivo sobre el cual se procesará el archivo correspondiente;
  • Por diseño, ambos son también independientes de la plataforma: esto significa que la técnica de generación de un documento en PDF o en PostScript no está atada a las características de ninguna plataforma informática específica. En otras palabras, es posible generar el mismo archivo en cualquiera de las plataformas soportadas;
  • Por último, ambos exhiben independencia de la aplicación: la aplicación o programa empleado para la generación de cualquiera de ellos no condiciona la validez del archivo generado.

Sin embargo, las semejanzas terminan allí. Para una mejor comprensión, vamos a resaltar claramente las diferencias:

  • Mientras PostScript es un lenguaje de programación que se emplea al mismo tiempo para describir una página, PDF es un auténtico lenguaje de descripción: no es posible ejecutar procedimientos ni realizar cálculos con él[1]. Una implicación de esto es que un PDF debe describir cada objeto de la página de manera independiente de los demás; en cambio PostScript permite, mediante la repetición de procedimientos, crear un número variable de objetos con la misma línea de código; podemos decir que  PostScript está basado en comandos, mientras que PDF está basado en objetos[2]. Esta concisión a priori de PostScript es una consecuencia de su elevado poder expresivo, pero que es un inconveniente para la confiabilidad de los documentos generados: los objetos de la página dependen de la interpretación que se haga del código. Hemos cambiado así flexibilidad por eficiencia y predictibilidad.
  • Un documento PostScript es una descripción secuencial; no es posible conocer los objetos de la página hasta no finalizar el proceso de todo el documento. En cambio, un documento PDF está organizado para permitir un acceso a cualquiera de los objetos de la página, en cualquier orden. Esto obliga a una estructura de archivo mucho más estricta que en PostScript.
  • A diferencia de PostScript, un documento PDF contiene información sobre la métrica de las fuentes utilizadas para asegurar la mayor fidelidad de reproducción posible; si una fuente no está presente en el equipo donde se visualiza el PDF, se elije automáticamente de entre las fuentes disponibles un reemplazo utilizando dicha métrica. Téngase en cuenta, no obstante, que mientras ésta es una ventaja en el ámbito de la documentación electrónica, no lo es en la gráfica, donde normalmente la fuente debe estar incrustada o, en el peor de los casos, una copia fiel debe estar instalada en el equipo.
  • Un PDF puede contener información no relacionada directamente con el modelo de imagen; ejemplos son los enlaces (hyperlinks) y marcadores (bookmarks) ya citados, o en versiones más modernas, contenido multimedia (audio y/o video) o en 3D.
  • Un documento PDF, a diferencia de PostScript, puede verse en pantalla (sin necesidad de imprimirlo) mediante un software gratuito, Adobe Reader.

Elementos y estructura interna de un PDF

Internamente, un documento PDF consta de un encabezamiento (header) que identifica el formato, formado por los caracteres %PDF seguido de un guión y el número de versión; luego, una colección de objetos con una sintaxis de aspecto similar a PostScript; una o más tablas de referencias cruzadas; y por último un final (trailer). Los objetos son también similares a los de PostScript: números, texto, matrices, diccionarios, etc. Cada objeto al que sea necesario referirse se le asigna un número de objeto (que lo identifica) y un número de generación, que indica que ese objeto ha sido modificado desde su creación inicial. Para saber la ubicación de cualquiera de esos objetos en el interior del archivo, se consultan las tablas de referencias cruzadas, que están identificadas con la palabra clave xref. La primera de estas secciones se ubica leyendo la palabra clave startxref, colocada siempre en el trailer del documento, que indica a cuántos bytes del principio del archivo se encuentra la última tabla xref. Por esta razón las aplicaciones que lean PDF deben hacerlo desde el final del archivo.

Ejemplo de un documento PDF

Presentaremos un ejemplo de un PDF básico[3], cuyo único contenido es la frase “Hello World”. Obsérvese la notación n g obj que introduce cada objeto (7 en total), donde n es el númeo de objeto y g el número de generación. En este caso g siempre es cero: el documento es original (no ha sido editado). La sección xref lista esos objetos, comenzando por un objeto especial (objeto nulo), con lo cual la tabla tiene 8 entradas.

%PDF-1.7

1 0 obj
<<
 /Type /Catalog
 /Outlines 2 0 R
 /Pages 3 0 R
>>
endobj

2 0 obj
<<
 /Type /Outlines
 /Count 0
>>
endobj

3 0 obj
<<
 /Type /Pages
 /Kids [4 0 R]
 /Count 1
>>
endobj

4 0 obj
<<
 /Type /Page
 /Parent 3 0 R
 /MediaBox [0 0 595 842]
 /Contents 5 0 R
 /Resources
 << /ProcSet 6 0 R
    /Font << /F1 7 0 R >>
 >>
>>
endobj

5 0 obj
 << /Length 48 >>
 stream
 BT
 /F1 24 Tf
 100 700 Td
 (Hola gente!) Tj
 ET
 endstream
endobj

6 0 obj
 [/PDF /Text]
endobj

7 0 obj
<<
 /Type /Font
 /Subtype /Type1
 /Name /F1
 /BaseFont /Helvetica
 /Encoding /MacRomanEncoding
>>
endobj

xref
0 8
0000000000 65535 f
0000000012 00000 n
0000000089 00000 n
0000000145 00000 n
0000000214 00000 n
0000000381 00000 n
0000000493 00000 n
0000000527 00000 n
trailer
<<
 /Size 8
 /Root 1 0 R
>>
startxref
651
%%EOF

Texto contenido en un PDF elemental.

Analizaremos brevemente el contenido de este PDF:

  • En principio también encontramos en la primera línea una firma para identificar el formato, formado por los caracteres %PDF- seguido del número de versión, 1.7 en este caso, tal como anticipamos;
  • Luego de eso observamos los distintos objetos con la nomenclatura mencionada, cada uno de ellos de un tipo (/Type) específico. Cualquier objeto puede referenciar a otro usando el comando R, mediante la notación n g R, donde n y g son los números del objeto referenciado. Entre ellos, el primero es de tipo Catálogo (/Catalog) e indica los dos tipos principales de objetos del documento: el índice o tabla de contenidos (/Outlines) y las páginas en sí mismas (/Pages);
  • Cada objeto de tipo página debe contener obligatoriamente un parámetro MediaBox que describe el tamaño de esa página, mediante la instrucción /MediaBox [0 0 595 842], cuyos cuatro parámetros indican el origen inferior izquierdo (0, 0) y el ancho y alto (595 842), que naturalmente están todos expresados en puntos;
  • En particular, el objeto 5 0 es el que efectivamente contiene el texto que constituye la única marca que se realiza en la página en este ejemplo;
  • Hacia el final del documento encontramos la sección de referencias xref, que simplemente indica a cuántos bytes desde el comienzo del archivo (offset) se encuentra cada objeto;
  • Luego sigue el trailer (cola) donde se indica el total de objetos del documento (/Size) y la referencia al primer objeto o raíz (/Root);
  • Por último, startxref indica el offset al comienzo de la tabla xref. Esto muestra que normalmente un documento PDF debe leerse desde el final, y a partir de allí se accede, siguiendo referencias, todos y cada uno de los objetos.

Esta estrategia tiene por objeto permitir la actualización incremental del documento, esto es, una modificación en uno de los objetos no implica recrear íntegramente el documento; simplemente se marca el objeto modificado como “libre” y se agrega un nuevo objeto que lo reemplaza hacia el final del archivo, actualizando esta información en la tabla xref. Una consecuencia de esta estrategia es que las sucesivas ediciones de un PDF pueden crear una cantidad de objetos “en desuso” que aumentan el peso del archivo.

Optimización de documentos PDF

Para solucionar este inconveniente, tanto Acrobat como otras utilidades tienen opciones de optimización que efectivamente recrean el documento, eliminando los objetos no utilizados. Además, mediante la opción Vista rápida para web (Fast Web View), los objetos del documento se reordenan para que la primera página sea rápidamente accesible; de esta forma, cuando un PDF está siendo descargado de internet es posible mostrar contenido sin esperar a la totalidad del documento. Sin esta opción, para ver un PDF es necesario la descarga completa del mismo.

Esta optimización no se limita sólo a una “limpieza”. Acrobat permite detectar la presencia de objetos válidos pero fuera de los límites de página y eliminarlos también; reducir la resolución de imágenes que superan cierto valor; eliminación de links y otros elementos ajenos al contenido; efectuar acoplamiento de transparencia, etc.

§3.11 – Límites de página en un PDF >

1 Dicho en la jerga de los lenguajes de programación, PDF no permite el uso de procedimientos, variables ni estructuras de control, sean alternativas o iterativas.
2 Adobe dice textualmente: “Un archivo PDF es en realidad un archivo PostScript que ya ha sido interpretado por un RIP y separado en objetos claramente definidos” (copia de la página de Adobe en archive.org; la original ya no está disponible).
3 Este ejemplo está adaptado del Apéndice G del PDF Reference, versión 1.3, 2da edición. Allí se pueden encontrar explicaciones detalladas que dan cuenta del significado de todos los elementos presentes en el PDF.