Per semplice curiosità, dopo aver visto la GIF più piccola , qual è il file PDF valido più piccolo possibile?
Per semplice curiosità, dopo aver visto la GIF più piccola , qual è il file PDF valido più piccolo possibile?
Risposte:
Questo è un problema interessante Prendendolo dal libro, puoi iniziare con questo:
%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
che è 291 byte di gioia PDF. Acrobat lo apre, ma si lamenta in qualche modo. C'è una pagina al suo interno ed è di 3/72 "quadrati, il minimo consentito dalle specifiche.
Tuttavia, Acrobat X non si preoccupa nemmeno più della tabella dei riferimenti incrociati, quindi possiamo eliminarlo:
%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 si lamenta, ma lo apre. Ora siamo a 178 byte. Si scopre che non è necessario che / Dimensione nel trailer. Ora siamo a 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>>
Si scopre che non hai bisogno di tutti quegli elementi fastidiosi / Type nei tuoi dizionari:
%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>>
Ora siamo a 138 byte.
Si scopre anche che quando la specifica dice "deve essere un riferimento indiretto" e / Count è richiesto, e l'intestazione "deve" essere% PDF-1.0, stanno dando suggerimenti vaghi. Questo è il più piccolo che ho potuto farlo e averlo apribile in Acrobat X:
%PDF-1.
trailer<</Root<</Pages<</Kids[<</MediaBox[0 0 3 3]>>]>>>>>>
70 byte.
Ora, il mio editor usa la disciplina newline di Windows, ma Acrobat accetta le convenzioni Windows, Mac o Unix, quindi usando un editor esadecimale, ho sostituito \ r \ n con \ r e rimosso del tutto l'ultima riga, che mi lascia 67 byte
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
Ho provato a togliermi l'ultimo dizionario finale (>>), ma Acrobat non lo avrebbe fatto. La lettura del PDF integrata in Google Chrome (FoxIt) non lo aprirà.
Come PostScript (HA! Vedi cosa ho fatto lì?), Se acconsenti ad Acrobat che "ripara" il file, aumenta fino a 3550 byte, la maggior parte dei metadati opzionali, ma lascia dietro di sé una serie di chiare violazioni delle specifiche.
minimum allowed by the spec
e poi va oltre. Ottima risposta, grazie! :)
\n
s incorporata in essa e quando decodificata base64 non fornisce il contenuto corretto del file.
Non sono riuscito ad aprire l'esempio ciao mondo.
Per un file di piccole dimensioni con contenuto di testo:
%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
Ho pensato di creare un pdf più piccolo con "Hello World". Il testo si trova nell'angolo in basso a sinistra. Mi dispiace per il carattere a 9 punti, qualsiasi più grande costerebbe un byte in più :)
172 byte per Adobe Reader X (se salvato con newline solo linefeed e senza newline o null-byte finali):
%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 byte per il visualizzatore PDF incorporato di Chrome:
%PDF 1 0 obj<</Pages<</Kids[<</Contents<<>>stream
BT 9 Tf(Hello World)' ET endstream>>]>>>>endobj trailer<</Root 1 0 R>>
Per vederlo facilmente in Chrome, incolla questo URI nella barra degli indirizzi (SO non mi consente di collegarlo ad esso e non funzionerà affatto in altri browser):
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
In Java, usa questo:
private static String samplepdf = "255044462D312E0D747261696C65723C3C2F526F6F743C3C2F50616765733C3C2F4B6964735B3C3C2F4D65646961426F785B302030203320335D3E3E5D3E3E3E3E3E3E";
e poi
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;
}