Z czystej ciekawości, po obejrzeniu najmniejszego GIF-a , jaki jest najmniejszy możliwy prawidłowy plik PDF?
Z czystej ciekawości, po obejrzeniu najmniejszego GIF-a , jaki jest najmniejszy możliwy prawidłowy plik PDF?
Odpowiedzi:
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.
minimum allowed by the spec
a następnie wykracza poza. Świetna odpowiedź, dziękuję! :)
\n
jest w nim osadzona, a kiedy dekodowana w base64 nie daje prawidłowej zawartości pliku.
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
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
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;
}