Criando um PDF maior que a Alemanha
(alexwlchan.net)- 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áximo75.000no Acrobat 7.0 cria um limite superior de15.000.000 de polegadas - Um PDF feito à mão é composto por
%PDF-1.6, uma lista de objetos,xref,trailer,startxrefe%%EOF, e o tamanho da página é determinado pela combinação de/MediaBoxe/UserUnit - Mesmo que
/MediaBoxpasse de 14.400 ou/UserUnitpasse de 75.000, o Acrobat continua exibindo 15.000.000 de polegadas, e valores acima do limite de/UserUnitsão ignorados sem aviso - O Preview.app do macOS ignora
/UserUnit, mas não impõe ao/MediaBoxo 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.400unidades, 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
/UserUnitno dicionário da página - O Acrobat 7.0 suporta o valor máximo de
/UserUnitem75.000, permitindo uma dimensão máxima de página de 15.000.000 de polegadas
15.000.000 de polegadasequivalem 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
- Exemplo:
- 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
trailercontém os metadados gerais do documento- número de páginas
- uso ou não de criptografia
- objeto raiz do documento
startxrefaponta para a posição inicial da tabelaxref- O leitor de PDF procura o valor de
startxrefno fim do arquivo e então vai até a tabelaxref
- O leitor de PDF procura o valor de
- 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
Pageque define uma única página - Objeto 3: um objeto
Pagesque contém informações sobre várias páginas - Objeto 4: um objeto
Catalogque fornece a estrutura principal do documento
- O objeto
Pageconecta o conteúdo da página por meio de referências a outros objetos1 0 Rreferencia o objeto número 1, geração 03 0 Rreferencia o objetoPages, 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 4do 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
- Como a tabela de referência cruzada real tem 5 entradas, o correto é
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
/MediaBoxfor alterado para600 600, o Acrobat mostra a página como8.33 x 8.33 in - O valor máximo de
/MediaBoxaceito 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 2dobra as duas dimensões da página- Usando
/MediaBox [0 0 14400 14400]junto com/UserUnit 2, o Acrobat mostra400.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
/MediaBoxou/UserUnitsejam configurados com valores maiores - Se o valor de
/UserUnitfor maior que75000, ele é limitado sem aviso ou erro - Parece que
/UserUnitnão é muito usado na prática- Uma resposta no Stack Overflow também diz que esse valor não é amplamente utilizado
- Foi difícil encontrar exemplos online
- 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
- Ele aceita uma largura com 12 zeros depois do
- 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
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
https://www.nytimes.com/2009/07/18/technology/companies/18am...
Muita gente se preocupa com execução de JavaScript, mas usa arquivos PDF sem maiores problemas
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
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
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
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
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
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
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...
https://en.wikipedia.org/wiki/On_Exactitude_in_Science
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
No fim das contas, era mesmo preciso uma régua
352777777777.78 cm são 3.527.777,7777778 km
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
Tfno stream, posicionar comTde escrever o texto comTjObrigado 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
Pela especificação, parece que sim
Dá vontade de parafrasear Steven Wright neste ponto
“Eu tenho um mapa dos Estados Unidos. Em tamanho real”
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
https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...
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
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
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