Mümkün olan en küçük geçerli PDF nedir?


139

Basit meraktan, en küçük GIF'i gördükten sonra , mümkün olan en küçük geçerli PDF dosyası nedir?


Nasıl yarattığınıza bağlıdır. Şansınız, bir uygulamanın oluşturacağından daha küçük bir tanesini (bir düzenleyicide) yazabilmenizdir.
devnull

"Showpage" i (tırnak işaretleri olmadan) ghostscript veya ps2pdf dosyasına beslemeyi deneyin.
devnull

Yanıtlar:


195

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.


25
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. Hayır, bunlar gevşek öneri değil, geçerlilik şartıdır. Bazı PDF görüntüleyenler onları zorlamasalar bile, onları takip etmemek geçersizlik anlamına gelir ve OP geçerli bir PDF istedi.
mkl

23
Kabul, çünkü cevap ile başlar minimum allowed by the specve sonra yukarıda ve öteye gider. Harika cevap, teşekkürler! :)
ağustos

plith, bu harika bir cevap. Şimdi, içinde "Hello World" gibi bir metin satırı bulunan en küçük geçerli pdf'ye ne dersiniz? {Stream BT ("Hello World") ET endstream} eklemesi kadar basit olacağını düşündüm, ancak şu ana kadar Acrobat'ı mutlu edemedim.
neonzeon

1
Bu özellik. PDF'deki nesnelerin grafiğinde döngüler vardır.
kaide

1
@towi base64 ile kodlanmış sürümünüzün \niçine gömülüdür ve base64 kod çözme işlemi doğru dosya içeriğini vermediğinde.
Christopher Schultz

19

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

2
Bu işe yaramaz, bir yazı tipi kaynağı tanımlamanız ve metnin görünmesi için onu sayfa içeriğinden seçmeniz gerekir.
yms

2
bu dosya aslında Mac OS X El Capitan altında açılırken, PDF1.0 ile en çok puan alan cevap vermedi.
Devy

12
Ayrıca krom, veri altında açılır: uygulama / pdf; base64, JVBERi0xLjIgCjkgMCBvYmoKPDwKPj4Kc3RyZWFtCkJULyA5IFRmKFRlc3QpJyBFVAplbmRzdHJlYW0KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCA1IDAgUgovQ29udGVudHMgOSAwIFIKPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0tpZHMgWzQgMCBSIF0KL0NvdW50IDEKL1R5cGUgL1BhZ2VzCi9NZWRpYUJveCBbIDAgMCA5OSA5IF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1BhZ2VzIDUgMCBSCi9UeXBlIC9DYXRhbG9nCj4 + CmVuZG9iagp0cmFpbGVyCjw8Ci9Sb290IDMgMCBSCj4 + CiUlRU9G
Luke Rehmann

8

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

2
Oldukça küçük. ;) Ancak, spesifikasyonlara göre geçerli değildir.
mkl

8
Chrome'da benim için açılmayacak.
Luke Rehmann

0

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;
}

OP mümkün olan en küçük geçerli PDF dosyasını istedi ; sizinki spesifikasyonlara göre geçerli değil.
mkl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.