Basit meraktan, en küçük GIF'i gördükten sonra , mümkün olan en küçük geçerli PDF dosyası nedir?
Basit meraktan, en küçük GIF'i gördükten sonra , mümkün olan en küçük geçerli PDF dosyası nedir?
Yanıtlar:
Bu ilginç bir problem. Kitaptan alarak, bununla başlayabilirsiniz:
%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
bu da 291 baytlık PDF sevinci. Acrobat açar, ancak biraz şikayet eder. İçinde bir sayfa var ve bu özellik tarafından izin verilen minimum 3/72 inç karedir.
Ancak, Acrobat X artık çapraz referans tablosuyla bile uğraşmıyor, bu yüzden bunu çıkarabiliriz:
%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 şikayet eder, ancak açar. Şimdi 178 byte'dayız. Römorkta buna / Boyuta ihtiyacınız olmadığı ortaya çıkıyor. Şimdi 172'deyiz:
%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>>
Sözlüklerinizdeki tüm bu sinir bozucu / Tür öğelerine ihtiyacınız olmadığı ortaya çıktı:
%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>>
Şimdi 138 byte'dayız.
Ayrıca, spesifikasyon "dolaylı bir referans olacak" ve / Count gerekli olduğunda ve "PDF" 1.0 başlığının% PDF-1.0 olması gerektiğinde, gevşek önerilerde bulundukları ortaya çıkıyor. Acrobat X'te açabildiğim ve açabildiğim en küçük şey:
%PDF-1.
trailer<</Root<</Pages<</Kids[<</MediaBox[0 0 3 3]>>]>>>>>>
70 bayt.
Şimdi, editörüm Windows yeni satır disiplini kullanıyor, ancak Acrobat Windows, Mac veya Unix kurallarını kabul ediyor, bu yüzden onaltılık bir düzenleyici kullanarak \ r \ n yerine \ r yazdım ve son satırsonu tamamen kaldırdım, bu da beni 67 bayt bıraktı
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
Son uç sözlüğü çıkarmaya çalıştım (>>), ama Acrobat buna sahip değildi. Google Chrome'da (FoxIt) yerleşik PDF okuması açılmaz.
Bir PostScript olarak (HA! Ne yaptığımı gördünüz mü?), Acrobat'ın dosyayı "onarmasını" kabul ederseniz, çoğu isteğe bağlı meta veri olan 3550 bayta kadar çarpır, ancak bir dizi açık spesifikasyon ihlali bırakır.
minimum allowed by the spec
ve sonra yukarıda ve öteye gider. Harika cevap, teşekkürler! :)
\n
içine gömülüdür ve base64 kod çözme işlemi doğru dosya içeriğini vermediğinde.
Merhaba dünya örneğini açamadım.
Metin içeriğine sahip küçük bir dosya için:
%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
Ben "Merhaba Dünya" görüntüleyen en küçük bir pdf yapacağımı düşündüm. Metin sol alt köşede. 9 noktalı yazı tipi için üzgünüm, daha büyük bir ekstra bayta mal olur :)
Adobe Reader X için 172 bayt (yalnızca satır beslemeli yeni satırlarla kaydedilmiş ve sondaki yeni satır veya boş bayt yoksa):
%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>>>>
Chrome'un yerleşik PDF görüntüleyicisi için 120 bayt:
%PDF 1 0 obj<</Pages<</Kids[<</Contents<<>>stream
BT 9 Tf(Hello World)' ET endstream>>]>>>>endobj trailer<</Root 1 0 R>>
Bunu Chrome'da kolayca görmek için bu URI'yı adres çubuğuna yapıştırın (SO, bağlantı vermeme izin vermez ve diğer tarayıcılarda hiç çalışmaz):
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'da şunu kullanın:
private static String samplepdf = "255044462D312E0D747261696C65723C3C2F526F6F743C3C2F50616765733C3C2F4B6964735B3C3C2F4D65646961426F785B302030203320335D3E3E5D3E3E3E3E3E3E";
ve sonra
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;
}