3 puntos por GN⁺ 2024-02-01 | 1 comentarios | Compartir por WhatsApp
  • La afirmación difundida en Internet de que el “tamaño máximo de un PDF es 381 km × 381 km” no proviene de un límite del formato PDF en sí, sino de una restricción de implementación de Adobe Acrobat 7.0
  • Desde PDF 1.6, /UserUnit permite aumentar la unidad base de 1/72 de pulgada, y el valor máximo 75,000 en Acrobat 7.0 crea un límite superior de 15,000,000 pulgadas
  • Un PDF hecho a mano se compone de %PDF-1.6, una lista de objetos, xref, trailer, startxref y %%EOF, y el tamaño de la página se determina con la combinación de /MediaBox y /UserUnit
  • Acrobat, aunque se excedan /MediaBox 14,400 o /UserUnit 75,000, sigue mostrando 15,000,000 pulgadas, y los valores por encima de /UserUnit se ignoran sin advertencia
  • Preview.app de macOS ignora /UserUnit, pero no impone al /MediaBox el mismo límite que Acrobat, así que incluso se pueden crear archivos que se muestran como si fueran PDF más grandes que el universo

¿De dónde salió el límite de 381 km?

  • La idea de que el tamaño máximo de un documento PDF es de 381 km × 381 km lleva mucho tiempo repitiéndose en Internet
  • Esa cifra no es un límite del formato PDF, sino una restricción de implementación de Adobe Acrobat
  • Según la especificación PDF 1.7, las limitaciones del tamaño de página se resumen así:
    • Antes de PDF 1.6, la unidad base del espacio de usuario estaba fija en 1/72 de pulgada
    • Desde Acrobat 5.0, el tamaño máximo de página base es de 14,400 × 14,400 unidades, es decir, 200 × 200 pulgadas
    • Desde PDF 1.6, el tamaño de la unidad base del espacio de usuario puede definirse con /UserUnit en el diccionario de página
    • Acrobat 7.0 admite un valor máximo de /UserUnit de 75,000, lo que permite una dimensión máxima de página de 15,000,000 pulgadas
  • 15,000,000 pulgadas son aproximadamente 381 km, y la expresión “PDF version 7” parece referirse no a la versión del PDF, sino a Adobe Acrobat 7.0

Estructura básica de un PDF hecho a mano

  • Un archivo PDF tiene un número de versión al inicio y una marca EOF al final
    • Ejemplo: %PDF-1.6
    • Marca final: %%EOF
  • Después del número de versión viene una lista de objetos que representa páginas, texto, gráficos, etc.
  • xref es una tabla de referencias cruzadas que indica la ubicación de los objetos
    • El lector de PDF verifica cuántos bytes separan cada objeto del inicio del archivo
  • trailer contiene los metadatos generales del documento
    • número de páginas
    • si está cifrado o no
    • objeto raíz del documento
  • startxref apunta a la posición inicial de la tabla xref
    • El lector de PDF busca el valor de startxref al final del archivo y salta a la tabla xref
  • Si tomas como referencia este artículo sobre cómo crear un archivo PDF simple, puedes hacer a mano un PDF con un rectángulo rojo

Objetos y definición de página

  • El PDF de ejemplo está compuesto por cuatro objetos clave
    • Objeto 1: un objeto stream que dibuja un rectángulo rojo
    • Objeto 2: un objeto Page que define una sola página
    • Objeto 3: un objeto Pages que contiene información de varias páginas
    • Objeto 4: un objeto Catalog que proporciona la estructura principal del documento
  • El objeto Page enlaza el contenido de la página mediante referencias a otros objetos
    • 1 0 R hace referencia al objeto número 1, generación 0
    • 3 0 R hace referencia al objeto Pages, que agrupa las páginas
  • Al escribir un PDF a mano, cada vez que cambia la posición de los objetos hay que volver a ajustar los valores de la tabla xref, lo que resulta muy engorroso
  • En la actualización del 16 de abril de 2025 se corrigió un valor erróneo del código de ejemplo: xref 0 4
    • Como la tabla de referencias cruzadas real tiene 5 entradas, el valor correcto es xref 0 5

Ampliar la página con /MediaBox y /UserUnit

  • El tamaño de página de un PDF se configura en cada objeto Page
  • /MediaBox [0 0 300 300] crea una página con 300 unidades de ancho y alto
    • La unidad base es 1/72 de pulgada
    • 300 unidades equivalen a unas 4.17 pulgadas
  • Si cambias /MediaBox a 600 600, Acrobat muestra la página como 8.33 x 8.33 in
  • El valor máximo de /MediaBox que acepta Acrobat, 14400 14400, se muestra como 200 × 200 pulgadas
    • Si se supera ese valor, Acrobat muestra una advertencia
  • Si agregas /UserUnit, puedes aumentar la unidad base del espacio de usuario
    • /UserUnit 2 duplica ambas dimensiones de la página
    • Si usas /MediaBox [0 0 14400 14400] junto con /UserUnit 2, Acrobat lo muestra como 400.00 x 400.00 in
  • Si aplicas /UserUnit 75000, Acrobat muestra la página como 15,000,000.00 × 15,000,000.00 pulgadas
    • Eso equivale aproximadamente a 381 km × 381 km y coincide con la afirmación original
    • Archivo de ejemplo: biggest.pdf

Diferencias entre Acrobat y Preview

  • Acrobat sigue mostrando el tamaño de página como 15,000,000 pulgadas aunque /MediaBox o /UserUnit se configuren con valores mayores
  • Si el valor de /UserUnit se establece por encima de 75000, se limita sin mostrar advertencia ni error
  • Parece que /UserUnit no tiene muchos casos de uso reales
  • Preview.app de macOS no soporta /UserUnit
    • Procesa todos los PDF con la unidad base de 1/72 de pulgada
  • En cambio, a diferencia de Acrobat, Preview.app no impone un límite alto similar en /MediaBox
    • Acepta incluso un ancho con 1 seguido de 12 ceros
    • Ese ancho equivale aproximadamente a la distancia entre la Tierra y la Luna
  • Si se introducen valores aún mayores en /MediaBox, también es posible crear archivos que Preview muestra como un PDF de aproximadamente 37 billones de años luz cuadrados
    • Archivo de ejemplo: universe.pdf
    • La mayor parte del documento es espacio vacío, y lleva una advertencia de no imprimirlo

1 comentarios

 
GN⁺ 2024-02-01
Opiniones en Hacker News
  • PDF es técnicamente terrible en muchos sentidos, pero el hecho de que sea un archivo estático autocontenido que puedo conservar en mis propias manos es excelente en contraste con los sitios web dinámicos/SaaS hostiles al usuario que pueden desaparecer en cualquier momento.
    PDF/A se acerca más a lo que debería ser un PDF de verdad y elimina la mayor parte de la basura peligrosa.
    Si te gustan las rarezas con PDF, existe un archivo políglota que es PDF/A, CSV y, al mismo tiempo, una banda sonora Amiga soundtracker mod: https://www.lab6.com/6

    • La parte de conservarlo en mis propias manos se vuelve importante cuando Amazon empieza a retirar libros de las cuentas.
      https://www.nytimes.com/2009/07/18/technology/companies/18am...
    • Un PDF es un archivo ejecutable.
      Mucha gente se preocupa por la ejecución de JavaScript, pero usa archivos PDF sin mayor problema.
    • Hasta hace poco, en PDF/A no había una forma fácil de comprobar si un archivo era realmente PDF/A, y ahora existe veraPDF, pero es un software bastante complejo.
      Para convertir un PDF arbitrario a PDF/A con software open source, parece que la única forma es pasarlo a PostScript con Ghostscript y luego volver, pero Ghostscript usa licencia Affero, lo que puede traer varios problemas.
      También hay una versión GPL antigua y funciona con la mayoría de los PDF, pero tiene unos 15 años.
      En un trabajo anterior tuve que lidiar con PDF/A y no fue nada agradable.
    • Por el sufrimiento que viví en un proyecto que parseaba millones de PDF de múltiples fuentes, me cuesta perdonar la frase “PDF es un gran formato”.
      Solo reconstruir párrafos ya requería un gran esfuerzo, ni hablar de parsear tablas.
      Para ser prácticamente un estándar, debería ser mejor, y el manual de PDF también es realmente malo.
    • Desde la perspectiva de alguien que trabaja en la industria gráfica, el verdadero PDF es PDF/X.
  • Como comparación, si analizamos PNG, el ancho y la altura máximos son 2147483647, es decir, 2^31 - 1.
    La densidad mínima que puede especificarse con el chunk pHYs es 1 píxel por metro, así que 2 mil millones de metros es más que el diámetro del Sol, 1.39 gigámetros: https://en.wikipedia.org/wiki/Orders_of_magnitude_(length)#g...
    El chunk sCAL usa punto flotante ASCII, así que puede representar tamaños físicos mucho más grandes.

    • sCAL tiene más que ver con el tamaño del objeto representado por la imagen que con la imagen en sí.
      Un mapamundi a escala 1:10,000,000 mide menos de 10 m de ancho según pHYs, pero alrededor de 40,000 km de ancho según sCAL.
  • En el momento en que mides el ancho de un PDF en kilómetros, sabes que estás leyendo un buen artículo técnico.

    • Una tarjeta microSD puede contener millones de millas en un espacio diminuto.
  • Esto me recuerda a un PDF que hice hace más de 10 años con una implementación en PostScript del Game of Life.
    Parece que todavía funciona, aunque hace crashear macOS Preview: https://andrewcutler.net/docs/joke/life.pdf

    • En Sonoma, Preview no crashea.
      Eso sí, no se ve la animación, solo el estado final; en el visor de PDF de Firefox se ve algo de animación.
      Skim es parecido a Preview, pero no muestra la cuadrícula.
    • En Mac OS Monterey no crashea y solo muestra un render estático del Game of Life.
  • Este artículo me recuerda los juegos intelectuales de Umberto Eco.
    En especial, “On the Impossibility of Drawing a Map of the Empire on a Scale of 1 to 1”: https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...

  • Preview no tiene, a diferencia de Acrobat, un límite superior para los valores que se pueden poner en MediaBox, y acepta incluso un ancho de un 1 seguido de 12 ceros.
    El inspector del documento muestra un tamaño de página de 352777777777.78 x 10.59 cm, y ese ancho es aproximadamente la distancia entre la Tierra y la Luna.
    Incluso si pones todos los planetas del sistema solar en fila, cabrían holgadamente dentro de este documento.

    • Haciendo el cálculo, ese documento tiene unos 373 km², así que es mucho más pequeño que Alemania.
      Al final sí hacía falta una regla.
    • Hay un 7 de más.
      352777777777.78 cm son 3,527,777.7777778 km.
    • Si se llenara con contenido real en lugar de espacio vacío, me pregunto cuál sería el tamaño de archivo de un PDF así.
  • Es un experimento divertido, alexwlchan.
    Hay dos pequeños errores en el artículo: donde dice “15,000,000,000.00 in” y “el tamaño de página es de 15 mil millones de pulgadas”, debería decir 15 millones de pulgadas.
    Dijiste que dar formato al texto era difícil, pero para un ejemplo de PDF con solo las dos palabras “Hello World” basta con definir un objeto de fuente y, en el stream, usar Tf para la fuente, Td para la posición y Tj para escribir el texto.

    • Sabía que en algún lado iba a cometer un error numérico, y lo voy a corregir pronto.
      Gracias también por el ejemplo de texto; se parece a lo que estaba intentando, pero seguro que tenía algún error en alguna parte.
    • Me pregunto si el xref al final del PDF es obligatorio.
      Según la especificación, parece que sí.
    • ¿Me ayudas a contar los ceros para entender por qué “15,000,000,000.00 in” son 15 millones y no 15 mil millones?
    • Si dices “no lo impriman”, ¿cómo podríamos saber si se puede doblar más de 7 veces?
  • A estas alturas dan ganas de parafrasear a Steven Wright:
    “Tengo un mapa de Estados Unidos. Es de tamaño real”.

    • Tengo un mapa de Estados Unidos en el celular, pero las indicaciones me confunden un poco.
      No sé si la parte de arriba del mapa es la dirección en la que me estoy moviendo o el norte; los mapas de antes siempre tenían el norte arriba, pero Google Maps no parece hacerlo así, y eso me confunde.
      Si giro 90 grados, el mapa gira conmigo, y tampoco sé si el que giró fue el mapa o yo.
      Si estoy detenido, el mapa no puede saber hacia dónde voy, así que parece que primero tengo que moverme para que me indique la dirección.
      Si sostengo el smartphone frente a mis ojos, la parte de arriba del mapa apunta al cielo, y no sé si se supone que debería mirar el mapa desde arriba.
      Me gustaría saber algunos trucos para usar bien Google Maps en el celular.
    • Umberto Eco también escribió sobre el mismo tema en “On the Impossibility of Drawing a Map of the Empire on a Scale of 1 to 1”.
      https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...
    • Entre los chistes relacionados, siempre me gustó este: “Quiero tatuarme a mí mismo en todo el cuerpo. Solo que 2 pulgadas más grande”.
      https://scomedy.com/quotes/10779
  • “No lo imprimas” suena como una frase lista para convertirse en una bomba de impresión.
    La última vez que usé una impresora, cancelar un trabajo de impresión en Windows era casi imposible.
    La época en que las impresoras Wi-Fi estaban abiertas o tenían poca seguridad era divertida.

    • Cancelar trabajos de impresión en Windows sigue siendo imposible.
      El único método confiable que encontré es apagar la impresora y borrar el trabajo de impresión de la cola.
      Tiene que ser una impresora que esté justo al lado; no entiendo por qué es tan difícil.
    • Un método un poco más seguro es desenchufar la impresora y tirar la computadora por la ventana.
    • Mi primera reacción al leer “No lo imprimas” fue: “Tú no eres mi mamá”.
  • Hace unos 30 años, en una entrevista para una pasantía de verano en Microsoft, el entrevistador me hizo una pregunta muy parecida sobre Excel.
    Este tipo de temas siempre sirve para ver la curiosidad de una persona y su capacidad para descomponer problemas potenciales.