Karena penasaran, setelah melihat GIF terkecil , apa file PDF yang valid sekecil mungkin?
Karena penasaran, setelah melihat GIF terkecil , apa file PDF yang valid sekecil mungkin?
Jawaban:
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.
minimum allowed by the spec
dan kemudian berjalan di atas dan di luar. Jawaban yang bagus, terima kasih! :)
\n
tertanam di dalamnya, dan ketika base64-decoded tidak memberikan konten file yang benar.
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
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
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;
}