3 pontos por GN⁺ 2024-02-01 | 1 comentários | Compartilhar no WhatsApp
  • O valor que circula na internet, “tamanho máximo de PDF de 381 km × 381 km”, não é um limite do formato PDF em si, mas sim uma limitação de implementação do Adobe Acrobat 7.0
  • Desde o PDF 1.6, é possível ampliar a unidade básica de 1/72 de polegada com /UserUnit, e o valor máximo 75.000 no Acrobat 7.0 cria um limite superior de 15.000.000 de polegadas
  • Um PDF feito à mão é composto por %PDF-1.6, uma lista de objetos, xref, trailer, startxref e %%EOF, e o tamanho da página é determinado pela combinação de /MediaBox e /UserUnit
  • Mesmo que /MediaBox passe de 14.400 ou /UserUnit passe de 75.000, o Acrobat continua exibindo 15.000.000 de polegadas, e valores acima do limite de /UserUnit são ignorados sem aviso
  • O Preview.app do macOS ignora /UserUnit, mas não impõe ao /MediaBox o mesmo limite do Acrobat, então também é possível criar arquivos que aparecem como PDFs maiores que o universo

De onde veio o limite de 381 km

  • A afirmação de que o tamanho máximo de um documento PDF é 381 km × 381 km circula e se repete na internet há bastante tempo
  • Esse número não vem de um limite do formato PDF, mas de uma restrição de implementação do Adobe Acrobat
  • Segundo a especificação PDF 1.7, o limite de tamanho de página pode ser resumido assim
    • Antes do PDF 1.6, a unidade básica do espaço de usuário era fixa em 1/72 de polegada
    • Desde o Acrobat 5.0, o valor máximo padrão do tamanho de página é 14.400 × 14.400 unidades, ou seja, 200 × 200 polegadas
    • A partir do PDF 1.6, é possível definir o tamanho da unidade básica do espaço de usuário com /UserUnit no dicionário da página
    • O Acrobat 7.0 suporta o valor máximo de /UserUnit em 75.000, permitindo uma dimensão máxima de página de 15.000.000 de polegadas
  • 15.000.000 de polegadas equivalem a cerca de 381 km, e a expressão “PDF version 7” parece se referir não à versão do PDF, mas ao Adobe Acrobat 7.0

Estrutura básica de um PDF feito à mão

  • Um arquivo PDF tem um número de versão no início e um marcador de EOF no final
    • Exemplo: %PDF-1.6
    • Marcador final: %%EOF
  • Depois do número de versão vem uma lista de objetos que representa páginas, texto, gráficos etc.
  • xref é a tabela de referência cruzada que informa a posição dos objetos
    • O leitor de PDF verifica quantos bytes separam cada objeto do início do arquivo
  • trailer contém os metadados gerais do documento
    • número de páginas
    • uso ou não de criptografia
    • objeto raiz do documento
  • startxref aponta para a posição inicial da tabela xref
    • O leitor de PDF procura o valor de startxref no fim do arquivo e então vai até a tabela xref
  • Seguindo este guia para criar um arquivo PDF simples, dá para montar manualmente um PDF com um retângulo vermelho

Objetos e definição de páginas

  • O PDF de exemplo é composto por quatro objetos principais
    • Objeto 1: um objeto stream que desenha um retângulo vermelho
    • Objeto 2: um objeto Page que define uma única página
    • Objeto 3: um objeto Pages que contém informações sobre várias páginas
    • Objeto 4: um objeto Catalog que fornece a estrutura principal do documento
  • O objeto Page conecta o conteúdo da página por meio de referências a outros objetos
    • 1 0 R referencia o objeto número 1, geração 0
    • 3 0 R referencia o objeto Pages, que é o conjunto de páginas
  • Ao escrever um PDF manualmente, sempre que a posição dos objetos muda é preciso reajustar os valores da tabela xref, o que é bastante trabalhoso
  • Na atualização de 16 de abril de 2025, o xref 0 4 do código de exemplo foi corrigido por estar errado
    • Como a tabela de referência cruzada real tem 5 entradas, o correto é xref 0 5

Aumentando a página com /MediaBox e /UserUnit

  • O tamanho da página em um PDF é definido em cada objeto Page
  • /MediaBox [0 0 300 300] cria uma página com largura e altura de 300 unidades cada
    • A unidade padrão é 1/72 de polegada
    • 300 unidades correspondem a cerca de 4,17 polegadas
  • Se /MediaBox for alterado para 600 600, o Acrobat mostra a página como 8.33 x 8.33 in
  • O valor máximo de /MediaBox aceito pelo Acrobat, 14400 14400, é exibido como 200 × 200 polegadas
    • Acima disso, o Acrobat exibe um aviso
  • Ao adicionar /UserUnit, é possível ampliar a unidade básica do espaço de usuário
    • /UserUnit 2 dobra as duas dimensões da página
    • Usando /MediaBox [0 0 14400 14400] junto com /UserUnit 2, o Acrobat mostra 400.00 x 400.00 in
  • Com /UserUnit 75000, o Acrobat exibe a página como 15.000.000,00 × 15.000.000,00 polegadas
    • Isso equivale a cerca de 381 km × 381 km, em linha com a afirmação original
    • Arquivo de exemplo: biggest.pdf

Diferenças de comportamento entre Acrobat e Preview

  • O Acrobat continua exibindo o tamanho da página como 15.000.000 de polegadas mesmo que /MediaBox ou /UserUnit sejam configurados com valores maiores
  • Se o valor de /UserUnit for maior que 75000, ele é limitado sem aviso ou erro
  • Parece que /UserUnit não é muito usado na prática
  • O Preview.app do macOS não suporta /UserUnit
    • Ele trata todos os PDFs com a unidade padrão de 1/72 de polegada
  • Em compensação, ao contrário do Acrobat, o Preview.app não impõe um grande limite superior ao /MediaBox
    • Ele aceita uma largura com 12 zeros depois do 1
    • Essa largura é aproximadamente da ordem da distância entre a Terra e a Lua
  • Com valores ainda maiores de /MediaBox, também é possível criar arquivos que o Preview exibe como PDFs com cerca de 37 trilhões de anos-luz quadrados
    • Arquivo de exemplo: universe.pdf
    • A maior parte do documento é espaço vazio, com um aviso para não imprimir

1 comentários

 
GN⁺ 2024-02-01
Comentários do Hacker News
  • PDF é tecnicamente horrível de várias formas, mas o fato de ser um arquivo estático autocontido que posso guardar em minhas mãos é excelente em contraste com sites dinâmicos/SaaS hostis ao usuário que podem desaparecer a qualquer momento
    PDF/A é mais próximo de um PDF de verdade e remove a maior parte das tranqueiras perigosas
    Se você gosta de travessuras estranhas com PDF, existe um arquivo poliglota que é PDF/A, CSV e ao mesmo tempo uma trilha sonora mod do Amiga soundtracker: https://www.lab6.com/6

    • Quando a Amazon começa a recolher livros da sua conta, a parte de guardar em minhas mãos passa a importar
      https://www.nytimes.com/2009/07/18/technology/companies/18am...
    • PDF é um arquivo executável
      Muita gente se preocupa com execução de JavaScript, mas usa arquivos PDF sem maiores problemas
    • Até recentemente, não havia uma forma fácil de verificar se um arquivo era realmente PDF/A; agora existe o veraPDF, mas é um software bem complexo
      Para converter um PDF arbitrário em PDF/A com software de código aberto, parece que só há o caminho de passar por PostScript com o Ghostscript e depois voltar, mas o Ghostscript tem licença Affero, o que pode trazer vários problemas
      Também existe a versão antiga em GPL, e ela funciona com a maioria dos PDFs, mas é coisa de uns 15 anos atrás
      No meu emprego anterior eu precisei lidar com PDF/A, e não foi nada divertido
    • Por causa do sofrimento que passei em um projeto que fazia parsing de milhões de PDFs de várias fontes, é difícil perdoar a frase “PDF é um ótimo formato”
      Só reconstruir parágrafos já exigia um esforço enorme, sem falar no parsing de tabelas
      Para algo que é de fato um padrão, deveria ser melhor, e o manual de PDF também é realmente ruim
    • Do ponto de vista de quem trabalha na indústria gráfica, PDF de verdade é PDF/X
  • Para comparar, se você analisar PNG, a largura e a altura máximas são 2147483647, ou seja, 2^31 - 1
    A menor densidade que pode ser especificada pelo chunk pHYs é 1 pixel por metro, então 2 bilhões de metros é maior que o diâmetro do Sol, de 1,39 gigâmetro: https://en.wikipedia.org/wiki/Orders_of_magnitude_(length)#g...
    Como o chunk sCAL usa ponto flutuante em ASCII, ele pode representar tamanhos físicos ainda maiores

    • sCAL está mais relacionado ao tamanho do objeto que a imagem representa do que ao tamanho da imagem em si
      Um mapa-múndi em escala 1:10.000.000 teria menos de 10 m de largura segundo o pHYs, mas cerca de 40.000 km de largura segundo o sCAL
  • No momento em que você começa a medir a largura de um PDF em quilômetros, sabe que está lendo um bom texto técnico

    • Um cartão microSD pode armazenar milhões de milhas em um espaço minúsculo
  • Isso me lembrou um PDF que eu fiz há mais de 10 anos com uma implementação de PostScript do Game of Life
    Parece que ainda funciona, mas derruba o Preview do macOS: https://andrewcutler.net/docs/joke/life.pdf

    • No Sonoma, o Preview não trava
      Só que a animação não aparece e apenas o estado final é mostrado; no visualizador de PDF do Firefox aparece um pouco de animação
      O Skim também é parecido com o Preview, mas não mostra a grade
    • No Mac OS Monterey não trava e só mostra uma renderização estática do Game of Life
  • Este texto lembra as brincadeiras intelectuais de Umberto Eco
    Em 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...

  • O Preview, ao contrário do Acrobat, não parece ter limite superior para os valores aceitos na MediaBox e aceita até uma largura com 12 zeros depois do 1
    No inspetor de documento, o tamanho da página aparece como 352777777777.78 x 10.59 cm, e essa largura é mais ou menos a distância entre a Terra e a Lua
    Mesmo se você alinhar todos os planetas do Sistema Solar, eles cabem nesse documento com folga

    • Fazendo as contas, esse documento tem cerca de 373 km², então é bem menor que a Alemanha
      No fim das contas, era mesmo preciso uma régua
    • Tem um 7 a mais
      352777777777.78 cm são 3.527.777,7777778 km
    • Fiquei curioso sobre qual seria o tamanho do arquivo de um PDF desses se ele fosse preenchido com conteúdo real em vez de espaço em branco
  • Experimento divertido, alexwlchan
    Há dois pequenos erros no texto: nos trechos “15,000,000,000.00 in” e “o tamanho da página é de 15 bilhões de polegadas”, o correto é 15 milhões de polegadas
    Você disse que formatar texto era difícil, mas em um PDF de exemplo com apenas as duas palavras “Hello World”, basta definir o objeto da fonte, usar a fonte com Tf no stream, posicionar com Td e escrever o texto com Tj

    • Eu sabia que ia cometer algum erro numérico em algum ponto e devo corrigir isso em breve
      Obrigado também pelo exemplo de texto; parece parecido com o que eu estava tentando fazer, então com certeza eu estava errando em algum lugar
    • Fico pensando se o xref no fim do PDF é obrigatório
      Pela especificação, parece que sim
    • Alguém pode me ajudar a contar os zeros para entender por que “15,000,000,000.00 in” é 15 milhões e não 15 bilhões?
    • Se estiver escrito “não imprima”, como saber se dá para dobrar mais de 7 vezes?
  • Dá vontade de parafrasear Steven Wright neste ponto
    “Eu tenho um mapa dos Estados Unidos. Em tamanho real

    • Tenho um mapa dos Estados Unidos no celular, mas a navegação me confunde um pouco
      Não sei se a parte de cima do mapa é a direção para a qual estou me movendo ou o norte; nos mapas antigos, o norte ficava sempre para cima, mas no Google Maps não parece ser assim, e isso me confunde
      Quando viro 90 graus, o mapa gira junto, e eu já não sei se quem girou foi o mapa ou eu
      Se estou parado, o mapa não tem como saber para que lado estou indo, então parece que, para mostrar a direção, eu preciso começar a me mover primeiro
      Se eu seguro o smartphone na frente dos olhos, a parte de cima do mapa aponta para o céu, então nem sei se eu deveria olhar o mapa de cima para baixo
      Queria saber qual é o jeito certo de usar bem o Google Maps no celular
    • Umberto Eco também escreveu sobre o mesmo tema: “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...
    • Sempre gostei de uma piada relacionada: “Quero tatuar em todo o meu corpo uma imagem de mim mesmo. Só que 5 centímetros maior
      https://scomedy.com/quotes/10779
  • “Não imprima” soa como algo prestes a virar uma bomba de impressão
    Da última vez que usei uma impressora, no Windows era quase impossível cancelar um trabalho de impressão
    Eram tempos divertidos quando as impressoras Wi‑Fi ficavam abertas ou tinham segurança fraca

    • No Windows, cancelar um trabalho de impressão ainda é impossível
      O único jeito realmente confiável que encontrei é desligar a impressora e apagar o trabalho da fila
      Isso só funciona se a impressora estiver logo ao lado, e não faço ideia de por que isso é tão difícil
    • Um método um pouco mais garantido é tirar a impressora da tomada e jogar o computador pela janela
    • Minha primeira reação ao ler “Não imprima” foi: “Você não é minha mãe”
  • Há cerca de 30 anos, numa entrevista para estágio de verão na Microsoft, o entrevistador fez uma pergunta muito parecida sobre o Excel
    Esse tipo de assunto sempre é ótimo para ver a curiosidade da pessoa e sua capacidade de decompor problemas potenciais