Який найменший допустимий PDF-файл?


139

З простої цікавості, побачивши найменший GIF , який найменший можливий PDF-файл?


Залежить від того, як ви його створите. Швидше за все, ви зможете самостійно (у редакторі) написати менший розмір, ніж те, що створює програма.
devnull

Спробуйте подати "showpage" (без котирувань) на ghostscript або ps2pdf.
devnull

Відповіді:


194

Це цікава проблема. Взявши це за книгу, ви можете почати з цього:

%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 байт, більшість з них є необов'язковими метаданими, але це залишає після себе ряд чітких специфікаційних порушень.


25
Виявляється також, що коли специфікація говорить "має бути непрямою посиланням" та / Count потрібно, а заголовок "повинен" бути% PDF-1.0, вони роблять неприйнятні пропозиції. Ні, це не розпусні пропозиції, це вимоги до обгрунтованості. Навіть якщо деякі глядачі PDF не застосовують їх, недотримання їх означає недійсність, і ОП попросило дійсний PDF.
мкл

23
Приймається тому, що відповідь починається з, minimum allowed by the specа потім йде вище та далі. Чудова відповідь, дякую! :)
meshy

плиті, це приголомшлива відповідь. А тепер як щодо найменшого дійсного PDF-файлу з рядком тексту в ньому, як-от "Hello World". Я думав, що це буде так само просто, як додавання {stream BT ("Hello World") ET endstream}, але поки що не могло зробити Acrobat щасливим.
neonzeon

1
Це специфікація. Графік об’єктів у PDF має цикли.
плінтус

1
@towi Ваша версія, кодована base64, \nвбудована в неї, і коли base64-декодована не дає правильного вмісту файлу.
Крістофер Шульц

19

Мені не вдалося відкрити привіт привіт світу.

Для невеликого файла з текстовим вмістом:

%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
Це не спрацює, вам потрібно визначити ресурс шрифту та вибрати його всередині вмісту сторінки, щоб текст відображався.
yms

2
цей файл фактично відкривається під Mac OS X El Capitan, тоді як відповідь з найбільшою оцінкою у форматі PDF1.0 не відповів.
Devy

12
Також відкривається під хром, дані: додатки / PDF; base64, JVBERi0xLjIgCjkgMCBvYmoKPDwKPj4Kc3RyZWFtCkJULyA5IFRmKFRlc3QpJyBFVAplbmRzdHJlYW0KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCA1IDAgUgovQ29udGVudHMgOSAwIFIKPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0tpZHMgWzQgMCBSIF0KL0NvdW50IDEKL1R5cGUgL1BhZ2VzCi9NZWRpYUJveCBbIDAgMCA5OSA5IF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1BhZ2VzIDUgMCBSCi9UeXBlIC9DYXRhbG9nCj4 + CmVuZG9iagp0cmFpbGVyCjw8Ci9Sb290IDMgMCBSCj4 + CiUlRU9G
Люк Реман

8

Я подумав, що я зроблю найменший 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

2
Досить маленький. ;) Неправда, згідно з специфікацією.
mkl

8
Не відкриється в Chrome для мене.
Люк Реманн

0

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

ОП просила найменший можливий допустимий PDF-файл ; ваш не відповідає дійсним вимогам.
mkl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.