Каков наименьший возможный допустимый PDF?


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

3   51   2013-06-24 19:52:05

3 ответа:

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

%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 радости. Акробат открывает его, но он немного жалуется. В нем есть одна страница, и это 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 newline, но 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) не откроет его.

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

Я думал, что сделаю самый маленький 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

Я не мог открыть пример 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