¿Cuál es el PDF válido más pequeño posible?


139

Por simple curiosidad, habiendo visto el GIF más pequeño , ¿cuál es el archivo PDF válido más pequeño posible?


Depende de cómo lo crees. Lo más probable es que usted mismo pueda escribir uno más pequeño (en un editor) de lo que generaría una aplicación.
devnull

Intente alimentar "showpage" (sin comillas) a ghostscript o ps2pdf.
devnull

Respuestas:


194

Este es un problema interesante. Tomándolo por el libro, puede comenzar con esto:

%PDF-1.0
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj 2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj 3 0 obj<</Type/Page/MediaBox[0 0 3 3]>>endobj
xref
0 4
0000000000 65535 f
0000000010 00000 n
0000000053 00000 n
0000000102 00000 n
trailer<</Size 4/Root 1 0 R>>
startxref
149
%EOF

que es 291 bytes de alegría PDF. Acrobat lo abre, pero se queja un poco. Hay una página y tiene un cuadrado de 3/72 ", el mínimo permitido por la especificación.

Sin embargo, Acrobat X ya ni siquiera se molesta con la tabla de referencias cruzadas, por lo que podemos sacar eso:

%PDF-1.0
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj 2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj 3 0 obj<</Type/Page/MediaBox[0 0 3 3]>>endobj
trailer<</Size 4/Root 1 0 R>>

Acrobat se queja, pero lo abre. Ahora estamos en 178 bytes. Resulta que no necesitas ese / Tamaño en el trailer. Ahora estamos en 172:

%PDF-1.0
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj 2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj 3 0 obj<</Type/Page/MediaBox[0 0 3 3]>>endobj
trailer<</Root 1 0 R>>

Resulta que no necesita todos esos elementos molestos / Tipo en sus diccionarios:

%PDF-1.0
1 0 obj<</Pages 2 0 R>>endobj 2 0 obj<</Kids[3 0 R]/Count 1>>endobj 3 0 obj<</MediaBox[0 0 3 3]>>endobj
trailer<</Root 1 0 R>>

Ahora estamos en 138 bytes.

También resulta que cuando la especificación dice "será una referencia indirecta" y se requiere / Count, y el encabezado "debe" ser% PDF-1.0, están haciendo sugerencias sueltas. Este es el más pequeño que pude hacer y lo puedo abrir en Acrobat X:

%PDF-1.
trailer<</Root<</Pages<</Kids[<</MediaBox[0 0 3 3]>>]>>>>>>

70 bytes.

Ahora, mi editor usa la disciplina de nueva línea de Windows, pero Acrobat acepta las convenciones de Windows, Mac o Unix, por lo que al usar un editor hexadecimal, reemplacé \ r \ n con \ r y eliminé la última línea nueva, lo que me deja con 67 bytes

25 50 44 46 2D 31 2E 0D 74 72 61 69 6C 65 72 3C 
3C 2F 52 6F 6F 74 3C 3C 2F 50 61 67 65 73 3C 3C 
2F 4B 69 64 73 5B 3C 3C 2F 4D 65 64 69 61 42 6F 
78 5B 30 20 30 20 33 20 33 5D 3E 3E 5D 3E 3E 3E 
3E 3E 3E 

Traté de quitar el último diccionario final (>>), pero Acrobat no tendría eso. La lectura de PDF integrada en Google Chrome (FoxIt) no lo abrirá.

Como PostScript (¡HA! ¿Ves lo que hice allí?), Si consientes que Acrobat "repare" el archivo, aumenta hasta 3550 bytes, la mayoría de ellos metadatos opcionales, pero deja atrás una serie de claras violaciones de especificaciones.


25
También resulta que cuando la especificación dice "será una referencia indirecta" y se requiere / Count, y el encabezado "debe" ser% PDF-1.0, están haciendo sugerencias sueltas. No, esas no son sugerencias sueltas, son requisitos de validez. Incluso si algunos lectores de PDF no los aplican, no seguirlos implica invalidez, y el OP solicitó un PDF válido.
mkl

23
Aceptado porque la respuesta comienza con minimum allowed by the specy luego va más allá. Gran respuesta, gracias! :)
meshy

plith, esa es una respuesta increíble. Ahora, ¿qué tal el pdf válido más pequeño con una línea de texto en él, como "Hello World". Pensé que sería tan simple como agregar {stream BT ("Hello World") ET endstream} pero hasta ahora no podía hacer feliz a Acrobat.
neonzeon

1
Esa es la especificación. El gráfico de objetos en PDF tiene ciclos.
zócalo

1
@towi Su versión codificada en base64 se ha \nincrustado en ella, y cuando decodificada en base64 no proporciona el contenido correcto del archivo.
Christopher Schultz

19

No pude abrir el ejemplo de hello world.

Para un archivo pequeño con contenido de texto:

%PDF-1.2 
9 0 obj
<<
>>
stream
BT/ 9 Tf(Test)' ET
endstream
endobj
4 0 obj
<<
/Type /Page
/Parent 5 0 R
/Contents 9 0 R
>>
endobj
5 0 obj
<<
/Kids [4 0 R ]
/Count 1
/Type /Pages
/MediaBox [ 0 0 99 9 ]
>>
endobj
3 0 obj
<<
/Pages 5 0 R
/Type /Catalog
>>
endobj
trailer
<<
/Root 3 0 R
>>
%%EOF

2
Esto no funcionará, debe definir un recurso de fuente y seleccionarlo dentro del contenido de la página para que aparezca el texto.
yms

2
este archivo en realidad se abre en Mac OS X El Capitan, mientras que la respuesta más calificada con PDF1.0 no.
Devy el

12
También se abre bajo cromo, datos: application / pdf; base64, JVBERi0xLjIgCjkgMCBvYmoKPDwKPj4Kc3RyZWFtCkJULyA5IFRmKFRlc3QpJyBFVAplbmRzdHJlYW0KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCA1IDAgUgovQ29udGVudHMgOSAwIFIKPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0tpZHMgWzQgMCBSIF0KL0NvdW50IDEKL1R5cGUgL1BhZ2VzCi9NZWRpYUJveCBbIDAgMCA5OSA5IF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1BhZ2VzIDUgMCBSCi9UeXBlIC9DYXRhbG9nCj4 + + CmVuZG9iagp0cmFpbGVyCjw8Ci9Sb290IDMgMCBSCj4 CiUlRU9G
Lucas Rehmann

8

Pensé que haría un pdf más pequeño que muestre "Hello World". El texto está en la esquina inferior izquierda. Perdón por la fuente de 9 puntos, cualquier tamaño mayor costaría un byte adicional :)

172 bytes para Adobe Reader X (si se guarda con saltos de línea de solo salto de línea y sin saltos de línea nueva o byte nulo):

%PDF-1.
1 0 obj<</Kids[<</Parent 1 0 R/Resources<<>>/Contents 2 0 R>>]>>endobj 2 0 obj<<>>stream
BT/ 9 Tf(Hello World)' ET
endstream
endobj trailer<</Root<</Pages 1 0 R>>>>

120 bytes para el visor de PDF incorporado de Chrome:

%PDF 1 0 obj<</Pages<</Kids[<</Contents<<>>stream
BT 9 Tf(Hello World)' ET endstream>>]>>>>endobj trailer<</Root 1 0 R>>

Para ver esto fácilmente en Chrome, pegue este URI en la barra de direcciones (SO no me permitirá vincularlo y no funcionará en absoluto en otros navegadores):

data:application/pdf,%25PDF%201%200%20obj%3C%3C%2FPages%3C%3C%2FKids%5B%3C%3C%2FContents%3C%3C%3E%3Estream%0ABT%209%20Tf(Hello%20World)'%20ET%20endstream%3E%3E%5D%3E%3E%3E%3Eendobj%20trailer%3C%3C%2FRoot%201%200%20R%3E%3E

2
Muy pequeña. ;) Sin embargo, no es válido según la especificación.
mkl

8
No se abrirá en Chrome para mí.
Luke Rehmann

0

En Java, use esto:

 private static String samplepdf = "255044462D312E0D747261696C65723C3C2F526F6F743C3C2F50616765733C3C2F4B6964735B3C3C2F4D65646961426F785B302030203320335D3E3E5D3E3E3E3E3E3E";

y entonces

byte[] bytes = hexStringToByteArray(samplepdf);

...

public byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                + Character.digit(s.charAt(i + 1), 16));
    }
    return data;
}

El OP solicitó el archivo PDF válido más pequeño posible ; el tuyo no es válido según las especificaciones.
mkl
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.