Какой самый маленький допустимый PDF-файл?


144

Из простого любопытства, увидев самый маленький файл GIF , какой самый маленький допустимый файл PDF?


Зависит от того, как вы его создаете. Скорее всего, вы сами (в редакторе) сможете написать меньший вариант, чем тот, который генерирует приложение.
devnull

Попробуйте загрузить "showpage" (без кавычек) в ghostscript или ps2pdf.
devnull

Ответы:


201

Это интересная проблема. Взяв это за книгу, вы можете начать с этого:

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

Acrobat жалуется, но открывает его. Теперь у нас 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>>

Оказывается, вам не нужны все эти надоедливые элементы / Type в ваших словарях:

%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 этого не было. Встроенная функция чтения PDF в Google Chrome (FoxIt) не открывает его.

В качестве PostScript (HA! Видите, что я там сделал?), Если вы дадите согласие на «восстановление» файла в Acrobat, он увеличится до 3550 байт, большая часть из которых является дополнительными метаданными, но оставляет после себя ряд явных нарушений спецификации.


25
Также выясняется, что когда в спецификации сказано «должна быть косвенная ссылка» и требуется / Count, а заголовок «должен» быть% PDF-1.0, они вносят вольные предложения. Нет, это не пустые предложения, это требования к достоверности. Даже если некоторые программы просмотра PDF-файлов не применяют их, несоблюдение их подразумевает недействительность, и OP запросил действительный PDF-файл.
mkl

23
Принято, потому что ответ начинается с, minimum allowed by the specа затем идет дальше и дальше. Отличный ответ, спасибо! :)
meshy

1
Это спецификация. График объектов в PDF имеет циклы.
плинтус

5
Мне нужно было представление PDF в формате base64. Итак, если кому-то интересно, вот строка base64 138- JVBERi0xLjAKMSAwIG9iajw8L1BhZ2VzIDIgMCBSPj5lbmRvYmogMiAwIG9iajw8L0tpZHNbMyAw\nIFJdL0NvdW50IDE+PmVuZG9iaiAzIDAgb2JqPDwvTWVkaWFCb3hbMCAwIDMgM10+PmVuZG9iagp0\ncmFpbGVyPDwvUm9vdCAxIDAgUj4+Cg==
байтовой

4
... и вот версия base64 строка версии 67 байт:JVBERi0xLg10cmFpbGVyPDwvUm9vdDw8L1BhZ2VzPDwvS2lkc1s8PC9NZWRpYUJveFswIDAgMyAzXT4+XT4+Pj4+Pg==
MCattle

19

Я не мог открыть пример hello world.

Для небольшого файла с текстовым содержимым:

%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 - нет.
Деви

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

@yms У вас есть пример?
Джон Смит

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 в адресную строку (SO не позволит мне ссылаться на него, и он вообще не будет работать в других браузерах):

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

9
У меня не открывается в 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;
}

OP запросил как можно меньший допустимый файл PDF ; ваш недействителен согласно спецификации.
мкл,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.