Apakah PDF valid yang sekecil mungkin?


139

Karena penasaran, setelah melihat GIF terkecil , apa file PDF yang valid sekecil mungkin?


Tergantung bagaimana Anda membuatnya. Kemungkinannya adalah Anda akan dapat menulis sendiri yang lebih kecil (dalam editor) daripada yang dihasilkan aplikasi.
devnull

Coba beri makan "showpage" (tanpa tanda kutip) ke ghostscript atau ps2pdf.
devnull

Jawaban:


194

Ini masalah yang menarik. Mengambilnya dari buku, Anda bisa mulai dengan ini:

%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

yang merupakan 291 byte dari kegembiraan PDF. Acrobat membukanya, tetapi agak mengeluh. Ada satu halaman di dalamnya dan persegi 3/72 ", minimum yang diizinkan oleh spesifikasi.

Namun, Acrobat X bahkan tidak repot dengan tabel referensi silang lagi, jadi kita bisa menghilangkannya:

%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 mengeluh, tetapi membukanya. Sekarang kita berada di 178 byte. Ternyata Anda tidak membutuhkan itu / Ukuran di trailer. Sekarang kita berada di 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>>

Ternyata Anda tidak membutuhkan semua elemen sial / Ketik dalam kamus Anda:

%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>>

Sekarang kita berada di 138 byte.

Ternyata juga ketika spec mengatakan "akan menjadi referensi tidak langsung" dan / Count diperlukan, dan header "harus" adalah% PDF-1.0, mereka membuat saran yang longgar. Ini adalah yang terkecil yang bisa saya buat dan bisa dibuka di Acrobat X:

%PDF-1.
trailer<</Root<</Pages<</Kids[<</MediaBox[0 0 3 3]>>]>>>>>>

70 byte

Sekarang, editor saya menggunakan disiplin baris baru Windows, tetapi Acrobat menerima konvensi Windows, Mac, atau Unix, jadi dengan menggunakan hex editor, saya mengganti \ r \ n dengan \ r dan menghapus baris baru terakhir sama sekali, yang membuat saya dengan 67 byte

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 

Saya mencoba melepas kamus ujung terakhir (>>), tetapi Acrobat tidak akan memilikinya. Pembacaan PDF bawaan untuk Google Chrome (FoxIt) tidak akan membukanya.

Sebagai PostScript (HA! Lihat apa yang saya lakukan di sana?), Jika Anda menyetujui Acrobat "memperbaiki" file tersebut, ia menabrak hingga 3.550 byte, sebagian besar merupakan metadata opsional, tetapi meninggalkan sejumlah pelanggaran spesifikasi yang jelas.


25
Ternyata juga ketika spec mengatakan "akan menjadi referensi tidak langsung" dan / Count diperlukan, dan header "harus" adalah% PDF-1.0, mereka membuat saran yang longgar. Tidak, itu bukan saran yang longgar, itu adalah persyaratan untuk validitas. Bahkan jika beberapa pemirsa PDF tidak menegakkannya, tidak mengikutinya menyiratkan ketidakabsahan, dan OP meminta PDF yang valid.
mkl

23
Diterima karena jawaban dimulai dengan minimum allowed by the specdan kemudian berjalan di atas dan di luar. Jawaban yang bagus, terima kasih! :)
meshy

plith, itu jawaban yang luar biasa. Sekarang, bagaimana dengan pdf terkecil yang valid dengan sebaris teks di dalamnya, seperti "Hello World". Saya pikir ini akan sesederhana menambahkan {stream BT ("Hello World") ET endstream} tetapi sejauh ini tidak bisa membuat Acrobat bahagia.
neonzeon

1
Itu speknya. Grafik objek dalam PDF memiliki siklus.
alas

1
@towi Versi Anda yang dikodekan base64 telah \ntertanam di dalamnya, dan ketika base64-decoded tidak memberikan konten file yang benar.
Christopher Schultz

19

Saya tidak bisa mendapatkan contoh hello world untuk dibuka.

Untuk file kecil dengan konten teks:

%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
Ini tidak akan berfungsi, Anda perlu mendefinisikan sumber font dan memilihnya di dalam konten halaman untuk muncul teks.
yms

2
file ini sebenarnya terbuka di bawah Mac OS X El Capitan sedangkan jawaban dengan nilai tertinggi dengan PDF1.0 tidak.
Devy

12
Juga membuka di bawah chrome, Data: aplikasi / pdf; base64, JVBERi0xLjIgCjkgMCBvYmoKPDwKPj4Kc3RyZWFtCkJULyA5IFRmKFRlc3QpJyBFVAplbmRzdHJlYW0KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCA1IDAgUgovQ29udGVudHMgOSAwIFIKPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0tpZHMgWzQgMCBSIF0KL0NvdW50IDEKL1R5cGUgL1BhZ2VzCi9NZWRpYUJveCBbIDAgMCA5OSA5IF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1BhZ2VzIDUgMCBSCi9UeXBlIC9DYXRhbG9nCj4 + CmVuZG9iagp0cmFpbGVyCjw8Ci9Sb290IDMgMCBSCj4 + CiUlRU9G
Lukas Rehmann

8

Saya pikir saya akan membuat pdf terkecil yang menampilkan "Hello World". Teks ada di sudut kiri bawah. Maaf tentang font 9-point, yang lebih besar akan membutuhkan byte tambahan :)

172 byte untuk Adobe Reader X (jika disimpan dengan baris baru baris-saja dan tanpa baris tambahan atau nol-byte):

%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 byte untuk penampil PDF bawaan Chrome:

%PDF 1 0 obj<</Pages<</Kids[<</Contents<<>>stream
BT 9 Tf(Hello World)' ET endstream>>]>>>>endobj trailer<</Root 1 0 R>>

Untuk melihatnya dengan mudah di Chrome, rekatkan URI ini di bilah alamat (SO tidak akan membiarkan saya menautkannya, dan itu tidak akan berfungsi sama sekali di peramban lain):

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
Cukup kecil. ;) Namun tidak valid, sesuai dengan spesifikasi.
mkl

8
Tidak akan terbuka di bawah di Chrome untuk saya.
Luke Rehmann

0

Di Jawa, gunakan ini:

 private static String samplepdf = "255044462D312E0D747261696C65723C3C2F526F6F743C3C2F50616765733C3C2F4B6964735B3C3C2F4D65646961426F785B302030203320335D3E3E5D3E3E3E3E3E3E";

lalu

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 meminta file PDF yang valid sekecil mungkin ; milik Anda tidak valid sesuai dengan spesifikasi.
mkl
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.