З простої цікавості, побачивши найменший GIF , який найменший можливий PDF-файл?
З простої цікавості, побачивши найменший GIF , який найменший можливий PDF-файл?
Відповіді:
Це цікава проблема. Взявши це за книгу, ви можете почати з цього:
%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
що становить 291 байт PDF-радості. Acrobat відкриває його, але дещо скаржиться. На ній є одна сторінка, і це 3/72 "квадрат, мінімально дозволений специфікацією.
Однак Acrobat X навіть більше не переймається таблицею перехресних посилань, тому ми можемо це зробити:
%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>>
Акробат скаржиться, але відкриває його. Зараз ми на рівні 178 байт. Виявляється, вам не потрібен той / Розмір у трейлері. Зараз ми в 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>>
Виявляється, вам не потрібні всі ті примхливі / Тип елементів у ваших словниках:
%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>>
Зараз ми на 138 байтах.
Виявляється також, що коли специфікація говорить "має бути непрямою посиланням" та / Count потрібно, а заголовок "повинен" бути% PDF-1.0, вони роблять неприйнятні пропозиції. Це найменший, що я міг зробити це, і щоб він відкривався в Acrobat X:
%PDF-1.
trailer<</Root<</Pages<</Kids[<</MediaBox[0 0 3 3]>>]>>>>>>
70 байт.
Тепер мій редактор використовує дисципліну для нового рядка Windows, але Acrobat приймає конвенції Windows, Mac або Unix, тому, використовуючи шестигранний редактор, я замінив \ r \ n на \ r і видалив останню нову рядок взагалі, що залишає мені 67 байт
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
Я спробував зняти словник останнього кінця (>>), але Acrobat цього не мав би. Вбудований в Google Chrome (FoxIt) зчитування PDF не відкриє його.
Як PostScript (HA! Подивіться, що я там робив?), Якщо ви погоджуєтесь Acrobat "ремонтувати" файл, він стикається до 3550 байт, більшість з них є необов'язковими метаданими, але це залишає після себе ряд чітких специфікаційних порушень.
minimum allowed by the spec
а потім йде вище та далі. Чудова відповідь, дякую! :)
\n
вбудована в неї, і коли base64-декодована не дає правильного вмісту файлу.
Мені не вдалося відкрити привіт привіт світу.
Для невеликого файла з текстовим вмістом:
%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
Я подумав, що я зроблю найменший pdf-файл із відображенням "Hello World". Текст знаходиться у лівому нижньому куті. Вибачте за 9-кратний шрифт, будь-який більший коштуватиме додатковий байт :)
172 байти для Adobe Reader X (якщо збережено з новими рядками, призначеними лише для підводного рядка, і немає останнього рядка чи нуля байта):
%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 байт для вбудованого переглядача PDF в Chrome:
%PDF 1 0 obj<</Pages<</Kids[<</Contents<<>>stream
BT 9 Tf(Hello World)' ET endstream>>]>>>>endobj trailer<</Root 1 0 R>>
Щоб легко побачити це в Chrome, вставте цей URI в адресний рядок (ТАК не дозволяє мені посилатися на нього, і він взагалі не працюватиме в інших браузерах):
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
На Java використовуйте це:
private static String samplepdf = "255044462D312E0D747261696C65723C3C2F526F6F743C3C2F50616765733C3C2F4B6964735B3C3C2F4D65646961426F785B302030203320335D3E3E5D3E3E3E3E3E3E";
і потім
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;
}