7
DESCRIPCION DE LAS HERRAMIENTAS
EMPLEADAS______________________________
8
1.1-PDF
1.1.1 Introducción
Las siglas PDF, corresponden a Formato de Documento Portable (Portable Document
Format), y es el formato original de la familia de productos de la casa Adobe, creados
a comienzos de los años 90 y que acabaron convirtiéndose en un standard "de facto".
Permiten compartir y visualizar documentos electrónicos de todo tipo,
independientemente de la plataforma donde fueron creados (Hardware y Sistema
Operativo).
PDF implementa el mismo modelo de imagen que el lenguaje descriptivo Postcript
para describir textos y gráficos, de forma independiente del dispositivo y la
resolución.
Incluye hipertextos, imágenes, anotaciones, y actualmente, muchas más herramientas
que facilitan el objetivo para el que fueron creados.
Algunas de sus características más notables son:
� Preservación de la fidelidad de los documentos, independientemente del
dispositivo, plataforma y software.
� Obtención de contenidos de diversas fuentes- Sítios web, procesadores de
texto, documentos escaneados, fotos, gráficos- dentro de un único
documento que mantiene la integridad de todos los elementos fuente.
� Colaboración en tiempo real desde diversas plataformas.
� Firma digital para garantizar la autenticidad de los documentos.
� Permisos y gestión de seguridad, que permiten mantener todo tipo de
derechos al autor.
� Accesibilidad a los documentos por parte de discapacitados.
� Posibilidad de la extracción y re-uso de elementos de otros archivos y
formatos.
� Posibilidad de formularios para integración con otros documentos o
aplicaciones empresariales.
1.1.2 Estructura
Un documento PDF consiste en una colección de objetos que, conjuntamente
describen la estructura de una o más páginas, posiblemente acompañados de otros
elementos interactivos o de información.
9
Un fichero PDF contiene los objetos que construyen el documento PDF, junto con la
información de su estructura, todo en un flujo de bytes.
La apariencia de una página es descrita mediante un flujo de contenidos, que contiene
los elementos gráficos que deben ser dibujados en ella. Asimismo, contiene objetos
electrónicos tales como dibujos, videos, hipertextos, otros archivos, formularios...
Por último, el PDF contiene información lógica que permite el intercambio de datos
entre aplicaciones.
1.1.3 Modelo de Creación de Imagen de Adobe
PDF sirve como un lenguaje de descripción de página. De ésta forma existen dos
fases:
A. La generación de la página por la aplicación que implementa el documento
PDF.
B. Su posterior interpretación por el programa que controla el dispositivo de
representación.
Una de las principales cosas que un PDF puede hacer, es describir la apariencia de
gráficos y tipografía. Esto lo realiza mediante el Adobe imaging model, que es la
misma representación de alto nivel independiente de dispositivo usada para el
lenguaje Postcript. Los elementos se describen de forma abstracta, como elementos,
más que como pixeles. De ésta forma, se consigue la independencia de dispositivo de
representación.
Las figuras dibujadas pueden estar en forma de caracteres (glifos), formas geométricas,
líneas o muestras de imágenes digitales. Y éstas formas, pueden estar en blanco y
negro o a color.
El flujo de contenidos posee operandos y operadores, que describen los objetos.
Los principales objetos son:
� Caminos-Consisten en secuencias de puntos que construyen líneas y curvas
mediante una serie de operadores, que gestionan su dibujado en la página.
� Texto-Consiste en uno o más glifos que representan texto en la página. La forma
en que los glifos representan los caracteres se haya en estructuras aparte,
denominadas fuentes.
10
� Imágenes-Las imágenes son matrices rectangulares, donde cada celda representa
el color de esa posición en el rectangulo, tipico de las fotografias.
Aparte de esto, existe los márgenes de página (current clipping path) , que definen las
áreas dentro de las que se pueden dibujar los objetos. Éstos se expresan como claves
(keys) para describir la geometría de un documento en cada página. Sólo uno de ellos,
el que describe el tamaño de la página (MediaBox) es imprescindible en el estandar
PDF. Los demás son opcionales (aunque en subestándares como el PDF/X sean
necesarios).
Fig. 1.1- PDF current clipping path
Todos ellos van expresados en la medida establecida por omisión para el usuario.
Ninguno de ellos tiene bordes visibles, aunque en estos esquemas se han indicado con
líneas continuas o discontinuas para mayor claridad.
Casilla de material (MediaBox)
Una matriz de cuatro números que indica la zona máxima de la página, incluido
cualquier espacio en blanco que se haya dejado más allá de los cortes, sangrados,
marcas de registro o barras de color. Indica pues, el tamaño de la hoja de papel en la
11
que está situado el documento, no de la página final cuando se acabe el trabajo
impreso.
Casilla de recorte (CropBox)
Matriz de cuatro números que indica la zona rectangular de la página donde van los
elementos que deben reproducirse o imprimirse. Esta casilla de recorte, no debe ser
mayor que la casilla de material (MediaBox) y, si fuera así, la casilla de recorte
(CropBox), real será la intersección de la casilla de recorte y la casilla de material
(MediaBox).
Casilla de sangrado (BleedBox)
Ésta otra matriz de cuatro números expresa la página de un trabajo impreso antes de
que haya sido cortado o guillotinado. En ese sentido, indica la página impresa acabada
antes de ser cortada por la guillotina (el valor que expresa la misma página ya
guillotinada es la casilla de límite de página (TrimBox)). Nunca puede ser nunca
mayor que la casilla de material.
Casilla de límite de página (TrimBox)
Expresa la página de un trabajo impreso después de que haya sido cortado o
guillotinado. En ese sentido, indica la página impresa acabada, ya cortada por la
guillotina. El valor que representa la misma página antes de ser guillotinada es la
casilla de sangrado (BleedBox).
Casilla de ilustraciones (ArtBox)
Es una matriz de cuatro números también, que indica qué parte del fichero se debe
usar si el documento pdf se coloca dentro de un documento en un programa de
maquetación o diseño gráfico. La casilla de ilustraciones sólo se debe usar si el
fichero pdf expresa sólo un elemento para colocar en otras páginas (un módulo de
publicidad, por ejemplo), es decir: no es una página completa.
1.1.4 Sintaxis
La sintaxis del PDF puede orientarse a 4 partes:
12
I. Objetos
Un documento PDF esta compuesto de elementos de información denominados
objetos.
II. Estructura del fichero PDF
Nos viene a decir en que forma están almacenados esos objetos en el fichero. Como se
accede a ellos y como se actualizan.
III. Estructura del documento PDF
Nos dice como se utilizan los objetos para representar el PDF: páginas, fuentes, etc.
IV. Flujos de contenidos
Contiene una secuencia de instrucciones (tambien en forma de objetos), que describen
la apariencia de una página.
Al más bajo nivel, un PDF es una secuencia de bytes (8 bits). Éstos pueden agruparse
siguiendo la sintaxis de la página, o para formar objetos. Se emplean caracteres ASCII
para ello, siguiendo unas reglas y mediante unos delimitadores.
Tambien es posible insertar comentarios, como en cualquier lenguaje representativo.
Asimismo, se pueden insertar cadenas binarias, manteniendo la coherencia de éstas.
I. Objetos
Hay 8 tipos de objetos:
Valores booleanos
Numeros enteros y numeros reales
Cadenas
Nombres
Matrices
Diccionarios
Flujos
Objeto nulo
Adicionalmente a estos objetos, trataremos otro más: los filtros, que si bien no forman
parte de los objetos básicos, si integran a otro tipo de objeto.
Los objetos tambien pueden ser etiquetados para ser referenciados. Ésta estructura es
denominada Objeto indirecto.
13
Como se puede intuir, un lenguaje orientado a objetos implementa inmediatamente el
formato de PDF.
Los valores que pueden tomar los objetos son:
booleanos-Pueden tomar valores true o false
numéricos- Hay enteros, y reales -en punto fijo-
Objeto Null-Equivale a ningun tipo de objeto, o a direccionar a un objeto inexistente.
Cadenas-Series de bytes. Pueden ser caracteres literales o en hexadecimal. La barra (\)
se emplea como caracter especial de escape, como en la mayoría de lenguajes de
programación.
Nombres-Son símbolos unívocamente identificados con una secuencia de caracteres,
de forma que si dos tienen la misma secuencia, son el mismo nombre. No poseen
estructura interna. Un (/) en el formato PDF sirve para introducir un nombre.
Cualquier grupo de caracteres están permitidos. Los hexadecimales también,
introduciendose mediante (#). En ocasiones los nombres pueden representar texto,
para así ser identificados más cómodamente, en cuyo caso, deben interpretarse
mediante UTF-8 de Unicode, donde los ASCII a imprimir, tienen la misma
representación que los caracteres ASCII.
Matrices-Las matrices son colecciones unidimensionales secuenciales. Pueden ser
heterogeneas (números, cadenas, diccionarios e incluso otras matrices).
Comienzan con []. Para mayor dimensión, se pueden construir matrices de matrices.
Diccionarios-Este es el elemento principal, y más empleado en PDF, y que le da
estructura similar a una orientación a objetos. Consiste en una tabla asociativa que
contiene pares de objetos, conocidos como entradas.
El primer elemento es la llave (key), y el segundo el valor (value). La llave debe ser
obligatoriamente un nombre. El valor, en cambio, puede ser cualquier cosa, incluido
otro diccionario.
Los diccionarios vienen dentro de corchetes tal que <<>>. Sirven para contener
objetos complejos como fuentes y páginas. La entrada /Type, define el tipo de
objeto
que describe el diccionario en cuestión.
14
Flujos-Son secuencias de bytes, como las cadenas. En diferencia con éstas, un flujo
puede ser leido de forma incremental. Además, no esta sujeto a limitaciones de
longitud. Esto lo hace ideal para descripciones de páginas o imagenes.
Se construyen a partir de un diccionario (donde está la longitud del flujo y el posible
filtro de decodificación), más la palabra reservada stream, y la secuencia de bytes,
cerrada por endstream. Todos los flujos deben referenciarse por objetos indirectos.
Objetos indirectos-Cualquier objeto en el PDF puede ser etiquetado como indirecto.
Esto le da una UID única, que permite diferenciarlo. Esta UID consta de un objeto
numérico entero que sirve para indexarlo y un número de generación, cuya utilidad
estriba en la gestión de actualizaciones.
En un documento PDF, los objetos indirectos comienzan con su número, número de
generación, y las palabras reservadas obj y endobj, delimitando el objeto. Cuando se
referencia este objeto, se utiliza su número, número de generación y R (de reference).
Filtros-Los filtros son una parte de los flujos. Indica como debe ser decodificada la
información de ese flujo para ser leída.
Los filtros se subdividen en: Filtros ASCII y Filtros de Descompresión. Los primeros
decodifican información codificada como texto ASCII. Los segundos, información
que ha sido comprimida.
Un ejemplo de filtro es FlateDecode. Es el tipo ASCII más común, basado en el
compresor público zlib/deflate que implementa la codificación adaptativa Huffman.
II. Estructura del fichero
En esta sección se describe cómo los objetos se organizan dentro del fichero PDF,
para aumentar la eficiencia a la hora de acceder a ellos, y de actualizaciones
incrementales.
Un fichero PDF esta construido a partir de líneas, acabadas por marcadores de fin de
línea (retorno de carro o nueva linea). Éstas están limitadas a 255 caracteres -a no ser
que sean flujos-.
Un fichero PDF consta de cuatro elementos: (Fig. 1.2)
15
Fig. 1.2: Estructura de un fichero PDF
� Una cabecera de una linea, identificando la versión del PDF
� El cuerpo, que contiene los objetos que construyen el documento mediante una
secuencia de objetos indirectos. Dichos objetos, representan componentes del
documento, como fuentes, páginas e imagenes.
� La tabla de referencias cruzadas, que contiene la información relativa a los
objetos indirectos que hay en el fichero.
La tabla contiene una linea por cada objeto indirecto, especificando la dirección
lógica de ese objeto en el cuerpo del fichero.
Comienza con la palabra xref. Puede haber varias subsecciones de referencias
cruzadas, segun actualizaciones posteriores por borrado, creacion, o actualizado
de objetos. Si se acaba de crear el PDF, sólo contiene una tabla. Las entradas
constan de dos números: el primero es el número de objeto de comienzo, y el
segundo el número (cantidad) de esos objetos.
Debajo, hay una línea de 20 bytes dividida en dos cifras: la primera cifra
16
corresponde al offset de ese objeto en el fichero, y la segunda corresponde al
número de generación, que nos permite averiguar si un objeto ha sido reutilizado
o no. La letra n nos indica que el objeto esta actualmente en uso. f significa libre.
Los elementos (objetos) libres se enlazan unos con otros, de forma, que el
primero de ellos (que es el 0), apunta al número de objeto que corresponde al
siguiente libre. El último de ellos vuelve a apuntar al 0.
En versiones posteriores de PDF, se utilizan los denominados flujos de
referencias cruzadas, que consisten en flujos que contienen estas tablas.
� El trailer, es la última parte del fichero. Sin embargo, el trailer es la primera
parte que debe leer una aplicación al aceder a un fichero PDF. De esta forma, los
ficheros PDF se leen desde el final.
En ella, la aplicación encuentra la dirección de la tabla de referencias cruzadas
cruzadas, donde puede obtener las direcciones de los objetos. El trailer acaba por
%%EOF, y es por ahí por donde debe empezar la aplicación a leer.
Tambien hay información significativa sobre el fichero, sobre la anterior tabla de
referencias cruzadas (cuando hay actualizaciones –ver Fig.1.3-)asi como sobre
el objeto Root (raíz del documento PDF).
Fig 1.3: Actualización de un fichero PDF
17
Encriptación
Un PDF puede encriptarse, para proteger sus datos de accesos no autorizados. La
encriptación se aplica a todos los elementos del fichero, pero no a números enteros o
valores booleanos.
La información de encriptación se almacena en un diccionario de encriptación. La
entrada Encrypt identifica este tipo de encriptación, mientras que la entrada V
especifica el algoritmo de encriptación (antiguamente RC4 de Adobe, actualmente
sustituido por AES (Advanced Encryption Standard) ambos simétricos.
Tambien está la entrada correspondiente al manejador de seguridad. Éste gestiona el
acceso a los datos encriptados mediante dos posibles contraseñas (de usuario y de
propietario del documento).
III. Estructura del Documento
Los objetos dentro de un documento PDF siguen una jerarquía, tipo árbol (ver
Fig.1.4).
En la raíz (objeto Root), esta el denominado Catálogo.
La mayoría de los objetos son diccionarios. Por ejemplo: las páginas estan
representadas por objetos Page (página), que son diccionarios que hacen referencia a
los objetos dentro de esa página.
Las conexiones se efectuan mediante referencias indirectas a otros diccionarios.
Catálogo
Es identificado como Root. Contiene las líneas principales que definen el documento
PDF, contenidos, como deben mostrarse éstos en la pantalla y que página debe
mostrarse en primer lugar.
Árbol de páginas
El árbol de páginas indica como son ordenadas las páginas dentro del documento y en
que orden se acceden. Existen nodos de páginas (intermedias) y páginas (que son las
hojas en la estructura de árbol). Los nodos de páginas Pages son agrupaciones de
páginas. No tienen porqué coincidir con las secciones o capítulos del documento. Se
agrupan normalmente en función de características comunes.
Las hojas Page, si corresponden a cada una de las páginas del documento. Éstas
pueden heredar atributos de los nodos superiores Pages. Entre sus atributos, están los
18
ya comentados Mediabox, Cropbox, Bleedbox, Trimbox. También existe la entrada
Resources, que es en la que aparecen las fuentes empleadas en esa página
(caracteristica que nos atañe especialmente, por el objetivo de esta memoria).
Diccionario de Nombres
Muchos de los elementos del documento PDF pueden referenciarse por un nombre,
más que por su número de objeto. Ésta correspondencia está en el diccionario de
nombres. Su entrada Names está en el Catálogo.
IV. Flujos de Contenidos
Los flujos de contenidos son la forma inmediata de describir la apariencia de las
páginas y sus elementos gráficos. Cada página puede estar descrita por uno o más
flujos de contenidos, que contienen: elementos gráficos XObjects, patrones
Patterns, algunos tipos de fuentes (sintéticas Type3) y anotaciones Appearance
Streams.
El flujo se interpreta según sus objetos, como operandos (esos objetos), y unos
operadores, que nos dicen en que forma deben utilizarse esos operandos. Por ejemplo,
en que forma debe dibujarse una forma determinada.
Los que a nosotros nos interesan son los operadores que dibujan texto usando los
glifos (implementación de caracteres), definidos en las fuentes (dentro del campo
Resources).
Un flujo es una secuencia de objetos comprimidos, lo cual permite reducir el tamaño
del fichero PDF significativamente. No pueden aparecer dentro de en un flujo:
-Otro flujo.
-Objetos con número de generación superior a 0 (que hayan sido actualizados).
-El diccionario de encriptación de un documento PDF.
-El diccionario que contiene la longitud de un flujo.
Las referencias indirectas a estos objetos dentro del flujo son iguales que antes. Por
ejemplo: 14 0 R. Sin embargo, la forma de acceso es diferente. Los objetos se
almacenan dentro del flujo normalmente formando colecciones de objetos con
caracteristicas comunes. El flujo contiene:
-N pares de enteros. Cada uno representa el numero de objeto y su offset.
-Los objetos, de forma consecutiva (aqui no se usa obj y endobj).
Cuando se actualiza un objeto que esta dentro de un stream, éste no se reutiliza,
19
sino que la actualización recibe un nuevo número y se asigna a otro stream diferente.
Diccionarios de Recursos
Ya que los flujos no permiten utilizar objetos indirectos, es necesario resolver el
problema de que, a la hora de describir una página, necesitemos referenciar a objetos
que estén fuera del flujo, como fuentes o mapas de imágenes. Esto se consigue
mediante los recursos (Resources), a los cuales se refiere en los flujos mediante su
nombre.
Los recursos se agrupan en diccionarios de recursos, donde están los nombres de esos
recursos a los que se hace referencia en los flujos de contenidos.
Por ejemplo: en un flujo se puede hacer referencia a la fuente F2, la cual esté definida
(fuera del flujo) en el diccionario de recursos como F2 = TimesNewRoman.
1.1.5 Texto
Tal como se avanzó anteriormente, el texto se representa mediante glifos que
proceden de fuentes. Un glifo es una forma gráfica, y por tanto puede ser manipulada.
La forma en que se dibujan estos glifos comprende los siguientes conceptos:
I. Estado del texto-Representado por un conjunto de parámetros que seleccionan
valores, como la fuente y la escala a un determinado tamaño.
II. Objetos de texto y operadores-Los operadores especifican los glifos a dibujar.
Un objeto de texto consta de operadores y de sus parámetros asociados.
Las fuentes están estructuradas mediante diccionarios. Éstos proporcionan
información al visualizador de PDF información sobre como debe interpretar el
texto y posicionar los glifos.
Uso de fuentes
Un carácter es un símbolo abstracto, mientras que un glifo es la representación
especifica de un carácter. Por ejemplo, sin utilizar ninguna fuente concreta, el uso de
negrita en A, o itálica en A son glifos que representan al carácter abstracto "A".
Los glifos se organizan en programas fuentes con un nombre determinado. Ej:
Helvetica o Times.
Estos programas se escriben en un lenguaje determinado, como Type1 o TrueType,
20
que son interpretados por programas específicos.
En PDF, normalmente una fuente se refiere a un diccionario, que contiene el programa
de la fuente, en el denominado FontFile -normalmente en forma de un stream-, y
una serie de campos que proporcionan información adicional.
Los glifos contenidos en el programa de la fuente, están representados por secuencias
de códigos, que pueden ser incrustados o no en el PDF (parte que nos atañe en esta
memoria), construidos por alguna aplicación u obtenidos de un fichero externo.
En un flujo de contenidos, se especifican los códigos que pertenecen a los glifos de
una fuente determinada. Esto se llama muestreo de la cadena de texto. Éstos se
dibujan siguiendo la descripción del glifo dada en el programa de esa fuente.
Muestreo de texto
La forma más comun de muestreo de una fuente es por ejemplo:
BT
/F13 12 Tf
288 720 Td
(ABC) Tj
ET
BT-significa “Begin Text”-Es la etiqueta de comienzo
Fx-fuente (externa al flujo de contenido, ya que en los flujos no pueden aparecer
referencias, solo nombres)
Tf-su tamaño
Tj-La posición de comienzo del texto
ET-Etiqueta de “End text”, finalización del texto
En el siguiente ejemplo, se muestra como en Recursos, aparece la fuente
comentada, y la referencia a esta (su numero de objeto).
/Resources
<< /Font <</F13 23 0 R >>
>>
23 0 obj
<< /Type /Font
/Subtype /Type1
21
/BaseFont /Helvetica
>>
endobj
Posteriormente en el fichero, podemos ver el objeto y podemos que éste corresponde a
la fuente Helvetica.
Las fuentes están definidas para un tamaño standard que corresponde (tamaño 1) a
1/72 pulgadas.
Tf, Td y Tj, son operadores de texto. Hay numerosos más, como de creación de
efectos gráficos específicos. Si se desean consultar activamente todos los que hay y
sus funciones, el lector puede remitirse a la refencia de PDF (ver bibliografía).
Los glifos tienen una longitud (Width), o desplazamiento horizontal del cursor que
dibuja los glifos en el acto de dibujarlos. Las fuentes en la que no varia de glifo a glifo
esta longitud se llaman monoespaciadas. Sin embargo la mayoria de las fuentes
utilizan longitudes distintas para cada glifo. Estas son llamadas proporcionales.
También es interesante el concepto de marco "Bounding Box" del glifo, en el cual este
es dibujado mínimamente (sus limites).
Las fuentes Type1 tienen asociadas un fichero denominado AFM que contiene las
métricas de dibujado de los glifos. En ocasiones este fichero es denominado PFM.
Estructuras de Datos de Fuentes
Una fuente es representada por un diccionario, que especifica el tipo de fuente, su
nombre Postcript, su codificacion, y otros datos. Adicionalmente, la fuente (su
programa), puede ser incrustado, como ya se adelantó.
El tipo de las fuentes se distingue por su Subtype. Las fuentes Type0 son conocidas
como compuestas, porque comprenden unos objetos adicionales denominados
CIDFont y Cmap (que se comentarán más adelante), mientras que el resto son fuentes
simples.
Principales campos en un diccionario de Fuente
(Ver Fig 1.4)
Type-“Font” (es el tipo de diccionario)
Subytpe-el tipo de fuente, según el lenguaje de representación
22
Name-El nombre por el cual es referenciado en los flujos de texto esta fuente
BaseFont-El nombre auténtico de la fuente, utilizado por los dispositivos
FirstChar-El primer carácter definido en las Widths
LastChar-El último carácter definido en las Widths
FontDescriptor-Hace referencia a un diccionario que contiene las métricas de
los glifos
FontBox-Matriz que describe el marco mínimo de representación de los glifos
Encoding-Puede contener un diccionario que especifique un determinado código de
construcción de los glifos. Un código es una tabla que asocia a un determinado
caracter un glifo determinado. Este varia de S.O. a S.O. por eso se permite su cambio.
Ej: MacOS usa el MacRomanEncoding, mientras que Windows usa el
WinAnsiEncoding.
ToUnicode-Referencia a un flujo que contiene un fichero CMap que mapea los
caracteres con valores Unicode.
23
Fig 1.4: Ejemplo de diccionario de fuente
Fuentes simples
Las características comunes a las fuentes simples son:
Los glifos son seleccionados por caracteres de un solo byte (256 glifos únicamente).
Cada fuente tiene un código de construcción (ej: Ansi), que puede ser cambiado.
Cada glifo también posee unas métricas (Widths) que en la mayoría de los casos está
presente en forma de un descriptor de fuente (FontDescriptor). Dentro de éste
descriptor puede existir (en caso de fuente incrustada) un campo que referencie al
FontFile.
24
Type1
Son fuentes con programa en lenguaje Postcript. Incluye descripción completa de los
glifos y representación de alta calidad y resolución.
Las 14 fuentes Postcript standard son:
Times-Roman Helvetica Courier Symbol
Times-Bold Helvetica-Bold Courier-Bold ZapfDingbats
Times-Italic Helvetica-Oblique Courier-Oblique
Times-BoldItalic Helvetica-BoldOblique Courier-BoldOblique
La mayoría de las aplicaciones, conocen estos tipos de fuentes, y por ello, no son
necesarias las especificaciones de sus métricas.
Multiple Master Fonts
Es un subtipo de las Type1 que permite definir distinas formas de escritura de los
glifos, en un sólo programa de fuente.
TrueType
Las fuentes Truetype fueron diseñadas por Apple Computer,Inc. y tomadas como
standard por el S.O. Microsoft Windows.
En éstas fuentes, el campo BaseFont es rellenado siguiendo el nombre que tiene en
Postcript, o según el nombre que le da el S.O.
Los nombres TrueType pueden contener varios bytes, ya que hay nombres de fuentes,
como las CJK (Chinese, Japanese, Korean) que tiene sus nombres en lenguaje oriental
y deben representarse con códigos distintos de los básicos (1 byte). Éstos aparecen
mediante un símbolo #, seguido del código de representación.
Debido al sistema de mapeado de caracteres en glifos (encoding) que usa Truetype,
que depende fuertemente de la aplicación que los dibuja, Adobe recomienda que se
incruste la fuente. Si bien, esto no siempre ocurre, y es lo que la aplicación sobre la
que trata esta memoria va a solucionar.
Subsets
Tanto de las Type1 como de las Truetype, se pueden incrustar subsets de caracteres
25
(comprenden sólo los caracteres empleados en el texto) en el PDF. El nombre consiste
en una etiqueta (6 letras en mayúsculas arbitrarias), más (+) y el nombre original de
la fuente.
Type3
Son distintas de las anteriores porque la fuente esta definida en el diccionario. Los
glifos estan definidos en flujos de operadores gráficos. Estos están relacionados con
sus nombres.
Cuando el programa quiere dibujar los glifos, primero busca el Encoding y luego
busca el caracter a dibujar en su flujo de operadores correspondiente.
Type 0 (Fuentes Compuestas)
Es un tipo de fuente, en que los glifos son obtenidos de una estructura llamada
CIDFont, y referenciada como descendiente "Descendant" en el diccionario de la
fuente. Para las fuentes simples, un byte referenciaba todos los caracteres con los
glifos. Aqui los glifos se seleccionan por uno o más bytes. Esto es útil sobre todo para
fuentes CJK.
Las fuentes compuestas tienen una representación de los programas de fuentes distinta,
definida por los diccionarios CIDFont y los CMaps.
CID en CIDFont significa "identificador de caracter", y emplea en vez de los nombres
de los caracteres, números para acceder a los glifos, lo cual es un metodo más
eficiente para el acceso a grandes cantidades de ellos. Esto es, a cada glifo se le asocia
un número.
Un Cmap va a relacionar esos números con los caracteres. El concepto es el mismo
que con el Encoding básico. Sin embargo permite el acceso a miles de glifos más,
mediante más bytes empleados en los CIDs.
Un programa CIDFont, contiene las descripciones de los glifos para un set completo
de caracteres. Estas son muy parecidas a las Type1, pero organizadas de forma
diferente.
El programa CIDFont y el Cmap pueden ser referenciados e incrustados dentro del
PDF, indicándose en sus diccionarios respectivos.
Hay de dos clases: Type 0 CIDFont, basadas en Postcript, y Type 2 CIDFont, basadas
en Truetype.
(Ejemplo de CIDFont)
Aunque los CIDFonts, en su entrada Type pone “Font” (para identificar que este
objeto referencia a una fuente), no es una fuente en sí, sino el codificado de ésta.
26
Las fuentes compuestas, tambien siguen unas métricas especificadas por unos
parámetros distintos de los de las fuentes simples.
El Cmap, además, contiene información sobre la dirección en que debe escribirse el
glifo (horizontal, vertical o combinación). Los Cmaps normalmente vienen ya
predefinidos (normalmente siguiendo Unicode) a partir de unos genéricos (Identity-H
e Identity-V).
Programas de Fuentes Incrustados
Como ya se dijo con anterioridad, los programas de fuentes se pueden incrustar en
forma de flujos (streams) en el PDF, llamados también FontFile.
Los tipos son:
Fontfile El original para Postcript definido por Adobe.
Fontfile2 Para fuentes tipo TrueType.
FontFile3 Hay Type1C o CIDFontType0C, que corresponde al Compact
FontFormat (CFF) y las fuentes Opentype (extensión de las
TrueType que permite fuentes en formato CFF.
27
1.2-PERL
Este apartado, revisará algunos conceptos básicos de Perl y de Programación
Orientada a Objetos de Perl; si bien, no pretende ser un manual exhaustivo de tal. Para
ello, remítase el lector a uno de los múltiples manuales que hay, o de los que se
encuentran en la bibliografía.
Perl es un lenguaje de programación desarrollado por Larry Wall a partir de algunas
herramientas de UNIX. De esta forma posee ciertas similitudes con el lenguaje C.
Uno de sus lemas es "Perl hace faciles las cosas simples y posibles las cosas
complejas".
No posee ninguna filosofía de programación concreta: no se puede decir que sea
orientado a objetos, modular o estructurado, pero permite la utilización de todos
estos paradigmas. En el caso que nos ocupa, hemos de centrarnos en la utilización
de objetos.
Perl no es un compilador ni un intérprete de código, sino que es algo intermedio entre
los dos. Cuando ejecutamos un programa, se compila el código fuente a un código
intermedio en memoria que se optimiza, pero luego es interpretado por un motor.
Caracteristicas interesantes de Perl son:
� No hay que declarar los tipos de variables. En caso de hacerlo (con "my" $var),
éstas dejarán de ser globales para tener ámbito léxico (depende de donde se
encuentren)
� Las variables van precedidas por caracteres especiales como $ @ y % , que
indican su tipo
� También se distingue entre mayúsculas y minúsculas
� Las sentencias van terminadas por ";" para delimitarse entre ellas
� Los comentarios comienzan con "#"
Cabe decir que en el código de Perl también encontraremos PerlPod, que es un
lenguaje de marcación simple, que se interpreta como comentarios, y que permite
invocar el comando "perldoc" sobre un programa Perl y nos aporta información
tipo "man" sobre este, tales como su funcionamiento, su autor, actualizaciones, etc.
Este se escribe con etiquetas como "=head" o "=cut".
28
1.2.1 Revisión de sintaxis de Perl
I. Tipos de datos:
Los principales son: Scalar ($), Array (@), Hash (%) – Éstos últimos son una
colección de valores indexados por una clave.
Existen otros tipos como Filehandle, para manejo de ficheros, o Glob, que
permite referenciar cualquier otro tipo de datos (tipo genérico).
II. Tipos de estructuras de control:
Condicionales: if...else, elseif, unless
Repetitivas: For, While,Do...Until, Foreach (siendo ésta última una de las
más usadas).
III. Expresiones regulares y patrones de búsqueda: Una de las características más
potentes de Perl es la manipulación de cadenas, mediante expresiones y
patrones que nos facilitan esta tarea.
Ej: if ($var=~/Hola/) ...
Ejecutaría una sentencia determinada si en la cadena $var se encuentra "Hola".
Como se puede ver $var es la cadena, porque la hemos definido en la misma
sentencia como tal, pero podría haber representado un entero o una referencia en
su lugar.
IV. Sustitución en expresiones regulares: Es la otra función de Perl asociada al
tratamiento de expresiones. Permite sustituir en cadenas caracteres por otros.
Ej: $var=~s/Hola/Adios/g
Sustituiria “Hola”, por “Adios” y debido al operador "g", lo haría globalmente
en todas las ocurrencias de “Hola“dentro de $var.
Otras funciones aplicadas a expresiones regulares son: Split, que subdivide
una cadena e inserta los trozos en una matriz y Join, que realiza la operación
inversa.
V. Subrutinas: En perl se permite programar funciones propias, siempre que éstas se
declaren con anterioridad antes del programa principal (main).
Ej: sub mi_subrutina
29
Cuando se pasan parametros a una función, se hace a través de una matriz
especial, "@_", donde están contenidos.
1.2.2 Programación Orientada a Objetos en Perl
Viendo las recomendaciones de PDF (que es realmente lo que nos interesa), nos
damos cuenta de que su estructura está preparada para ser implementada mediante
objetos.
En programación de objetos, éste se define como una estructura que nos permite
hubicar, utilizar, y modificar cualquier tipo de datos.
Una clase es la estructura abstracta de ese objeto, antes de que sea creado. Los datos
se guardan en forma de atributos del objeto, y son consultados o manipulados
mediante métodos.
Es interesante también mencionar la llamada herencia, que permite que unas clases
deriven de otras, y asi sus realizaciones en memoria (los objetos), puedan usar las
funciones (métodos) de la clase o las clases padres (herencia multinivel). Por último,
el polimorfismo permite que diferentes objetos respondan de forma diferente a una
misma sentencia, dependiendo a que clase pertenezcan.
Los objetos normalmente se crean a partir de una clase (mediante la orden bless), y
luego lo que se usa de ellos generalmente son sus métodos. Los métodos son
subrutinas definidas dentro de la clase o del objeto mismo (una vez ha sido creado). A
ellas se accede mediante la sintaxis $objeto->metodo ().
Cuando se trabaja en un proyecto grande, es necesario definir unidades de
organización para el programa. De esta forma, cuando usamos una variable que está
en el programa principal (main ()), empleamos la sintaxis $main::var. Lo
mismo sucede con las funciones.
De ésta forma, se puede abordar la programación de objetos con mayor facilidad. La
forma de realizar esta sixtaxis para que funcione, es mediante el uso de los llamados
packages.
Un package es un tipo de módulo. Los módulos son ficheros que contienen código
listo para ser incluido en nuestro programa. Cada package por tanto, es un fichero
".pm" (denominación de package), que contiene una de las clases que hallamos
definido en nuestro proyecto. El nombre del fichero, coincide con el nombre de la
clase que contiene, para hacer más intuitiva su utilización.
30
Para incluir un módulo (o package) en nuestro código, símplemente usamos una
sentencia “use package.pm”.
Los métodos u objetos definidos en ese fichero (esa clase), permiten ser utilizados en
el código de otra, símplemente escribiendo Mi_package::funcion en el código
donde se quiere hacer uso. O en el caso del método de un objeto
Mi_package->metodo.
Como parte de su sintaxis, incluye la jerarquia representada por "::", lo cual quiere
decir que procede de otro módulo (fichero distinto).
Al comienzo del código de los packages existe un array característico: el @ISA, en el
cual está la clase o las clases padres, de las que recibe su herencia.
Además de los packages, existen las denominadas bibliotecas, que normalmente
constan de un conjunto de definiciones y se identifican porque su código acaba con
un ”1”. Se usan mediante la instrucción "require biblioteca.pl”.
Sin embargo, los packages se diferencian de éstas últimas en que se ejecutan en
tiempo de compilación, no cuando se llega a la instrucción.
31
1.3-PDF::API2
1.3.1 Introducción
La API2 para PDF, es la segunda versión de la PDF::API original, su predecesora,
comenzada a construir en 1999 por Alfred Reibenschuh, austríaco, que trabaja para
Informations Technologie Gmbh de Austria, y es el actual mantenedor, liberador de
nuevas versiones y debugger de la misma.
Su definición es : “A Perl Module Chain to facilitate the Creation and Modification
of High-Quality Portable Document Format -PDF- Files”.
La PDF::API es un trabajo conjunto de varias personas, como Martin Hosken, Lester
Hightower, y que Alfred usó como base, mejorándolo y posteriormente creando el
resto de módulos.
Básicamente, la API se encarga de construir un archivo pdf, siguiendo las pautas de la
referencia PDF.
1.3.2 Licencia
La PDF::API2 tiene licencia GNU Lesser General Public License. La principal
diferencia entre la GPL y la LGPL es que la última puede enlazarse con un programa
no-GPL, que puede ser de software libre o propietario.
Los programas no-GPL o no-LGPL se pueden distribuir bajo cualquier condición
elegida si no se tratan de trabajos derivados “derivative work”. Si se trata de un
trabajo derivado entonces los terminos deben permitir modificación por parte del
usuario para uso propio y la utilización de técnicas de ingeniería inversa para
desarrollar dichas modificaciones.
Este tipo de licencia se aplica a cualquier programa o trabajo que contenga una nota
puesta por el propietario de los derechos de su obra, estableciendo que su trabajo
puede ser distribuido bajo los términos de esta "GPL General Public License". En
ellas el "Programa" se suele denominar al trabajo original, y el "trabajo basado en el
Programa" se refierea cualquier trabajo derivado del mismo bajo la ley de derechos de
autor: es decir, un trabajo que contenga el Programa o alguna porción de él, ya sea
íntegra o con modificaciones o traducciones a otros idiomas.
32
Por ejemplo, OpenOffice de Sun Microsystems emplea la LGPL, y hoy en día se está
cada vez popularizando más este tipo de licencia, ya que permite mayor versatilidad e
interconexión con otros programas.
1.3.3 Características
La PDF::API no es la única API creada para construir programas que creen o trabajen
con PDF. Hay muchos, empezando por los de la casa Adobe, cruzando toda la gama,
desde el software propietario, hasta el software libre. Ejemplos de algunos libres son:
Ghostscript
PDFLaTeX
Panda, también en Perl
ReportLab en Python
iText en Java
La API2 trabaja en Perl, lenguaje perfectamente compatible con cualquier S.O., lo
cual es una ventaja añadida, y es de los libres, quizá el más completo de todos.
La última versión es la PDF-API2-0.69 del 18 de Enero del 2008.
Principales características
� Puede trabajar con más de un fichero PDF a la vez (las anteriores no podían).
� Presenta una interfaz orientada a objetos al usuario.
� Modifica documentos PDF existentes.
� Puede importar páginas de documentos PDF existentes.
� Incluye las 14 fuentes básicas PDF.
� Incluye subsets de las fuentes PDF CJK (Chinese-Japanese-Korean) básicas.
� Incluye un subset de las Webfonts de Microsoft (no están incrustadas).
� Permite incluir fuentes Adobe Type1en ambos formatos (.pfa/pfb).
� Permite incluir fuentes Truetype (.ttf).
� Permite incluir fuentes Opentype con características Truetype (.ttf).
� Permite incluir fuentes Opentype con características Postcript (.otf).
� Permite incluir imágenes JPEG (.jpeg).
� Permite incluir imágenes PNG (.png).
� Permite incluir imágenes GIF (.gif).
� Permite incluir imágenes TIFF (.tiff)
� Permite incluir imágenes de mapa (.pbm/pgm/ppm).
33
1.3.4 Estructura de la PDF::API2
La API sigue los patrones estructurales de la PDF Reference de Adobe a la hora de
construir un PDF. De esta forma, y tal como hemos visto, se estructura a través de
objetos, en forma de bibliotecas “.pm”. (Ver página siguiente)
Figura 1.5: Estrucutra de la PDF::API2
Tal como se puede ver, existe un package principal (API.pm) que es la interfaz con el
usuario y posee las funciones a más alto nivel, sobre las que el usuario no tiene que
porqué preocuparse de su estructura interna.
Las operaciones básicas de creación de un fichero PDF, creación de texto, o añadir
fuentes y objetos gráficos se pueden gestionar mediante métodos simples, abstraidos a
partir de packages más complejos que están por debajo. Por ejemplo:
34
Figura 1.6: Algunas funciones básicas de la interfaz PDF::API2
En el ejemplo superior (extraido del PerlPod), podemos ver una serie de funciones
básicas de la API, como open, o corefont. La primera está definida dentro del
fichero que contiene la interfaz (API2.pm), pero la otra, es una abstracción de una
función mucho más compleja que está definida en otro package a más bajo nivel. Si
está definida en la API, es para que podamos llamarla desde ella, sin necesidad de
tener que escribir la sintaxis de acceso hasta el package que está en un nivel más
inferior.
Un ejemplo muy básico de
(Mostrar también algun ejemplo de creación de fichero con la API)
La API es la que construye toda la estructura del documento PDF, tal como la hemos
visto en las especificaciones PDF: El catálogo y la estructura en árbol.
Por debajo de ella, están los packages que construyen dicha estructura en árbol:
Vemos una serie de packages y unos directorios. Los packages, son abstracciones de
clases que se emplean en la interfaz primariamente, y otros que construyen las hojas
del árbol, como Page.
Los directorios son: (Fig. 1.2)
Resources: Directorio integrado por los recursos que emplea el documento PDF.
� Las fuentes: CIDFonts (Fuentes compuestas), y simples (bajo BaseFont).
Debajo de ellas están los objetos tipo fuente, que se construyen a partir de las 14
fuentes básicas PDF, o a partir de ficheros externos (.ttf o pfa/pfb para
Postcript). Sus objetos van a leer los valores de dichos ficheros y crear los
campos específicos, según el tipo de fuente, insertando el programa de glifos en
un stream en caso de que se incruste la fuente.
� Los objetos externos: Xobjets. Estos comprenden dibujos y gráficos.
Contents: Este directorio contiene los packages relativos a la creación de objetos de
texto y su gestión en forma de flujos de contenido.
Basic:Dentro de Basic hay dos directorios: Uno para fuentes Truetype TTF, donde
hay una gran cantidad de packages. Estos son necesarios debido a la dependencia de
las fuentes Truetype con el Sistema Operativo y a su mayor complejidad frente a las
Postcript.
El otro es PDF quizá el más importante de ellos, ya que aquí es donde están los
packages que sirven para la creación de todos los objetos básicos que existen en PDF,
35
y los métodos para escribir éstos en el fichero (a más bajo nivel), una vez ya está
conformada la estructura en árbol del documento PDF.
Existen packages para crear el fichero PDF en sí (su estructura), y luego los objetos
básicos que define la especificación PDF: numerales, matrices...y los más importantes
de todos: los diccionarios y los indicadores de objetos, que son los objetos que
referencian a los primeros (o a cualquier otro objeto).