Qual è il PDF valido più piccolo possibile?


139

Per semplice curiosità, dopo aver visto la GIF più piccola , qual è il file PDF valido più piccolo possibile?


Dipende da come lo crei. È probabile che sarai in grado di scriverne uno più piccolo (in un editor) rispetto a quello che un'applicazione genererebbe.
devnull,

Prova a inserire "showpage" (senza virgolette) in ghostscript o ps2pdf.
devnull,

Risposte:


195

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.


25
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. No, quelli non sono suggerimenti vaghi, quelli sono requisiti per la validità. Anche se alcuni visualizzatori di PDF non li applicano, non seguirli implica invalidità e l'OP ha richiesto un PDF valido.
mkl

23
Accettato perché la risposta inizia con il minimum allowed by the spece poi va oltre. Ottima risposta, grazie! :)
meshy,

Per favore, questa è una risposta fantastica. Ora, che ne dici del più piccolo pdf valido con una riga di testo, come "Hello World". Ho pensato che sarebbe stato semplice come aggiungere {stream BT ("Hello World") ET endstream} ma finora non è stato possibile rendere felice Acrobat.
Neonzeon,

1
Questa è la specifica. Il grafico degli oggetti in PDF ha dei cicli.
plinto

1
@towi La tua versione con codifica base64 ha \ns incorporata in essa e quando decodificata base64 non fornisce il contenuto corretto del file.
Christopher Schultz,

19

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

2
Questo non funzionerà, è necessario definire una risorsa carattere e selezionarla all'interno del contenuto della pagina affinché il testo venga visualizzato.
yms

2
questo file si apre in realtà su Mac OS X El Capitan, mentre la risposta più votata con PDF1.0 no.
Devy,

12
Apre anche in cromo, dati: application / pdf; Base64, JVBERi0xLjIgCjkgMCBvYmoKPDwKPj4Kc3RyZWFtCkJULyA5IFRmKFRlc3QpJyBFVAplbmRzdHJlYW0KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCA1IDAgUgovQ29udGVudHMgOSAwIFIKPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0tpZHMgWzQgMCBSIF0KL0NvdW50IDEKL1R5cGUgL1BhZ2VzCi9NZWRpYUJveCBbIDAgMCA5OSA5IF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1BhZ2VzIDUgMCBSCi9UeXBlIC9DYXRhbG9nCj4 + CmVuZG9iagp0cmFpbGVyCjw8Ci9Sb290IDMgMCBSCj4 + CiUlRU9G
Luca Rehmann

8

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

2
Piuttosto piccolo. ;) Non valido, tuttavia, secondo le specifiche.
mkl

8
Non si aprirà sotto in Chrome per me.
Luke Rehmann,

0

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;
}

L'OP ha richiesto il file PDF valido più piccolo possibile ; il tuo non è valido secondo le specifiche.
mkl
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.