Jaki jest najmniejszy możliwy prawidłowy plik PDF?

139

Z czystej ciekawości, po obejrzeniu najmniejszego GIF-a , jaki jest najmniejszy możliwy prawidłowy plik PDF?

siatkowaty
źródło
Zależy od tego, jak go utworzysz. Są szanse, że sam będziesz w stanie napisać mniejszy (w edytorze) niż to, co wygenerowałaby aplikacja.
devnull
Spróbuj przesłać „showpage” (bez cudzysłowów) do ghostscript lub ps2pdf.
devnull

Odpowiedzi:

194

To ciekawy problem. Biorąc to pod uwagę, możesz zacząć od tego:

%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

co daje 291 bajtów radości PDF. Acrobat go otwiera, ale trochę narzeka. Jest w nim jedna strona i ma kwadrat 3/72 cala, minimum dozwolone przez specyfikację.

Jednak Acrobat X nawet nie zawraca sobie głowy tabelą odniesień, więc możemy to usunąć:

%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 narzeka, ale go otwiera. Teraz mamy 178 bajtów. Okazuje się, że nie potrzebujesz tego / Rozmiar w przyczepie. Teraz mamy 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>>

Okazuje się, że nie potrzebujesz wszystkich tych nieznośnych elementów / Type w swoich słownikach:

%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>>

Teraz mamy 138 bajtów.

Okazuje się również, że kiedy specyfikacja mówi "będzie pośrednim odniesieniem" i / Count jest wymagane, a nagłówek "musi" mieć wartość% PDF-1.0, to robią luźne sugestie. To najmniejszy, jaki mogłem zrobić i który można otworzyć w programie Acrobat X:

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

70 bajtów.

Teraz mój edytor używa dyscypliny nowego wiersza systemu Windows, ale program Acrobat akceptuje konwencje systemu Windows, Mac lub Unix, więc używając edytora szesnastkowego zastąpiłem \ r \ n \ r i całkowicie usunąłem ostatnią nową linię, co daje mi 67 bajtów

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 

Próbowałem zdjąć ostatni słownik końca (>>), ale Acrobat nie miałby tego. Czytanie PDF wbudowane w Google Chrome (FoxIt) go nie otworzy.

Jako PostScript (HA! Widzisz, co tam zrobiłem?), Jeśli zgadzasz się na „naprawę” pliku przez program Acrobat, zwiększa on do 3550 bajtów, większość z nich to opcjonalne metadane, ale pozostawia kilka wyraźnych naruszeń specyfikacji.

cokół
źródło
25
Okazuje się również, że kiedy specyfikacja mówi "będzie pośrednim odniesieniem" i / Count jest wymagane, a nagłówek "musi" mieć wartość% PDF-1.0, to robią luźne sugestie. Nie, to nie są luźne sugestie, to są wymagania dotyczące ważności. Nawet jeśli niektóre przeglądarki PDF ich nie egzekwują, nieprzestrzeganie ich oznacza nieważność, a OP poprosił o ważny plik PDF.
mkl
23
Zaakceptowano, ponieważ odpowiedź zaczyna się od, minimum allowed by the speca następnie wykracza poza. Świetna odpowiedź, dziękuję! :)
meshy
plith, to niesamowita odpowiedź. A co powiesz na najmniejszy prawidłowy plik PDF zawierający wiersz tekstu, na przykład „Hello World”. Myślałem, że to będzie tak proste, jak dodanie {stream BT ("Hello World") ET endstream}, ale jak dotąd nie mogłem uszczęśliwić programu Acrobat.
neonzeon
1
Taka jest specyfikacja. Wykres obiektów w PDF ma cykle.
cokół
1
@towi Twoja wersja zakodowana w base64 \njest w nim osadzona, a kiedy dekodowana w base64 nie daje prawidłowej zawartości pliku.
Christopher Schultz
19

Nie mogłem otworzyć przykładu Hello World.

W przypadku małego pliku z zawartością tekstową:

%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
Alan Riddell
źródło
2
To nie zadziała, musisz zdefiniować zasób czcionki i wybrać go w treści strony, aby tekst się pojawił.
yms
2
ten plik faktycznie otwiera się w systemie Mac OS X El Capitan, podczas gdy najwyżej oceniana odpowiedź w formacie PDF1.0 nie.
Devy
12
Otwiera również pod chrom, danych: application / pdf; base64, JVBERi0xLjIgCjkgMCBvYmoKPDwKPj4Kc3RyZWFtCkJULyA5IFRmKFRlc3QpJyBFVAplbmRzdHJlYW0KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCA1IDAgUgovQ29udGVudHMgOSAwIFIKPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0tpZHMgWzQgMCBSIF0KL0NvdW50IDEKL1R5cGUgL1BhZ2VzCi9NZWRpYUJveCBbIDAgMCA5OSA5IF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1BhZ2VzIDUgMCBSCi9UeXBlIC9DYXRhbG9nCj4 + CmVuZG9iagp0cmFpbGVyCjw8Ci9Sb290IDMgMCBSCj4 + CiUlRU9G
Luke Rehmann
8

Pomyślałem, że utworzę najmniejszy plik PDF z napisem „Hello World”. Tekst znajduje się w lewym dolnym rogu. Przepraszamy za czcionkę 9-punktową, każda większa kosztowałaby dodatkowy bajt :)

172 bajty dla Adobe Reader X (jeśli zapisano z nowymi wierszami tylko do nowego wiersza i bez końcowego znaku nowego wiersza lub bajtu zerowego):

%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 bajtów dla wbudowanej przeglądarki PDF w Chrome:

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

Aby łatwo zobaczyć to w Chrome, wklej ten identyfikator URI w pasku adresu (SO nie pozwoli mi utworzyć linku do niego i nie będzie działać w innych przeglądarkach):

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
Hugh Allen
źródło
2
Całkiem małe. ;) Nieważne jednak zgodnie ze specyfikacją.
mkl
8
Nie otwiera się dla mnie w Chrome.
Luke Rehmann
0

W Javie użyj tego:

 private static String samplepdf = "255044462D312E0D747261696C65723C3C2F526F6F743C3C2F50616765733C3C2F4B6964735B3C3C2F4D65646961426F785B302030203320335D3E3E5D3E3E3E3E3E3E";

i wtedy

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;
}
Martin Šimon
źródło
PO poprosił o możliwie najmniejszy prawidłowy plik PDF ; Twój nie jest ważny zgodnie ze specyfikacją.
mkl