Из простого любопытства, увидев самый маленький файл 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>>
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 байт, большая часть из которых является дополнительными метаданными, но оставляет после себя ряд явных нарушений спецификации.
minimum allowed by the spec
а затем идет дальше и дальше. Отличный ответ, спасибо! :)
JVBERi0xLjAKMSAwIG9iajw8L1BhZ2VzIDIgMCBSPj5lbmRvYmogMiAwIG9iajw8L0tpZHNbMyAw\nIFJdL0NvdW50IDE+PmVuZG9iaiAzIDAgb2JqPDwvTWVkaWFCb3hbMCAwIDMgM10+PmVuZG9iagp0\ncmFpbGVyPDwvUm9vdCAxIDAgUj4+Cg==
JVBERi0xLg10cmFpbGVyPDwvUm9vdDw8L1BhZ2VzPDwvS2lkc1s8PC9NZWRpYUJveFswIDAgMyAzXT4+XT4+Pj4+Pg==
Я не мог открыть пример 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
Я подумал, что сделаю самый маленький 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
В 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;
}