Español | English
rss facebook linkedin Twitter

My HelloWorld PDF

Antes de ver hasta dónde podemos llegar con las diferentes acciones que se pueden "programar" en el cuerpo de un PDF, y para hacerlo más práctico, necesitaremos un documento que podamos modificar a nuestro antojo. Si abrís un PDF cualquiera con un editor de texto veréis mil objetos y elementos que os pueden confundir un poco. Por ello, la idea es crear un documento PDF desde cero con un editor de texto, eliminando así todo lo innecesario.

Para ponernos manos a la obra necesitaremos saber cuáles son los campos y objetos sin los que no puede vivir un PDF. Ya vimos hace unas semanas la estructura lógica y física de un documento de este tipo, además de los objetos que nos podemos encontrar. Por esta razón únicamente iré nombrando lo que nos hará falta:
  • Cabecera del fichero: %PDF-1.5 (la versión a gusto del creador).
  • Cuerpo: debe incluir los objetos diccionario que especifican el catálogo, el nodo raíz del árbol de páginas y una página hija. Es decir necesitamos 3 objetos como mínimo, que podemos numerar consecutivamente, empezando a contar desde el 1. El orden en que coloquéis estos objetos no importa, ya que el quid de la cuestión es desde dónde se referencian y si están correctamente indexados en la tabla de referencias cruzadas. A continuación comento los campos obligatorios que debe tener cada objeto:
    • Catálogo: debe incluir un elemento /Type con el valor /Catalog, indicando el tipo de objeto de que se trata. Además tendremos que incluir una referencia indirecta al diccionario que define el nodo raíz del árbol de páginas del PDF (/Pages).
    • Nodo raíz del árbol de páginas: un elemento /Type con el valor /Pages es obligatorio, así como un objeto de tipo Array con nombre /Kids y que debe contener referencias indirectas a los nodos hijos, ya sean nodos intermedios o no. También tendremos que incluir un elemento /Count indicando los nodos hoja que descienden de este nodo, aunque por lo que he podido ver si el número no es correcto no importa demasiado.
    • Nodo hoja del árbol de páginas: se trata de un objeto página que, al igual que los anteriores, debe contener un elemento /Type, ésta vez con valor /Page. Adicionalmente deberemos especificar una referencia indirecta al objeto que define el nodo padre de este nodo (precedido por el nombre /Parent), un diccionario etiquetado con /Resources, y que debe estar vacío en caso de no ser necesario ningún recurso en la página. Si este elemento no se incluye se considera heredado de un nodo superior en el árbol. Por último será necesario también un objeto de tipo Array, precedido del nombre /MediaBox, conteniendo las coordenadas de la esquina inferior izquierda y superior derecha de un rectángulo, y que servirán para definir el espacio físico donde se mostrará el contenido del documento.
  • Tabla de referencias cruzadas: cada sección comienza con la palabra xref seguida de una o varias subsecciones. Cada subsección contiene una línea con dos números, el número del primer objeto de la subsección y el número de objetos de la subsección. Además de esta línea, cada subsección contendrá varias líneas con objetos consecutivos, además de objetos liberados, que estaban en uso pero ya no. Cada una de estas líneas contiene exactamente 20 bytes, formados por 10 dígitos describiendo el número de bytes desde el principio del documento al comienzo del objeto, 5 dígitos del número de generación, una letra indicando el estado del objeto (n cuando es nuevo y f si se ha liberado), y el fin de línea, que estará precedido por un espacio adicional en el caso de que sea un sólo carácter. Los distintos elementos se separan unos de otros mediante espacios. En nuestro caso, únicamente necesitaremos una sección y una subsección, una línea por cada objeto usado en el documento (3) y otra para un objeto liberado obligatorio.
  • Trailer: como ya se describió en el primer post, sólo es necesario añadir que el diccionario que sigue a la palabra trailer debe contener como mínimo el número de entradas de la tabla de referencias cruzadas (/Size) y una referencia indirecta al catálogo del documento (/Root).

Teniendo en cuenta todo esto ya podremos construir nuestro primer PDF, os dejo uno de prueba aquí. Seguramente habrá cosas que me habré dejado en el tintero, pero para un estudio más detallado os animo a consultar la documentación pertinente. No he dicho nada sobre escribir contenido en el PDF, ¿qué tal un “Hello World”? pero eso ya lo dejo para vuestra práctica personal;)


Jose Miguel Esparza
S21sec e-crime

(+34 902 222 521)


24 horas / 7 días a la semana



© Copyright S21sec 2013 - Todos los derechos reservados


login