Подтвердить что ты не робот

Каков минимально возможный PDF?

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

4b9b3361

Ответ 1

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

%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 newline, но Acrobat принимает соглашения Windows, Mac или Unix, поэтому, используя hex-редактор, я заменил \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 байт, большинство из которых являются дополнительными метаданными, но оставляет за собой ряд четких спецификаций нарушения.

Ответ 2

Я думал, что создаю маленький 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 байт для встроенного в Google просмотра PDF:

%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

Ответ 3

Я не смог открыть приветственный пример мира.

Для маленького файла с текстовым контентом:

%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