Por simple curiosidad, habiendo visto el GIF más pequeño , ¿cuál es el archivo PDF válido más pequeño posible?
Por simple curiosidad, habiendo visto el GIF más pequeño , ¿cuál es el archivo PDF válido más pequeño posible?
Respuestas:
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.
minimum allowed by the spec
y luego va más allá. Gran respuesta, gracias! :)
\n
incrustado en ella, y cuando decodificada en base64 no proporciona el contenido correcto del archivo.
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
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
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;
}