Artikel Teknis

Struktur File PDF: Cara Format Ini Sebenarnya Bekerja

Setiap orang yang pernah berurusan dengan PDF yang rusak, tanda tangan yang terputus, atau font yang hilang pada akhirnya menemukan hal yang sama: format ini bukan hierarki tag seperti HTML, dan bukan aliran byte berurutan seperti MP3. PDF adalah grafik objek bernomor yang terhubung melalui referensi, dan semua yang benar-benar penting tentang cara kerjanya berakar pada model tersebut

Pemahaman itu terbayar dalam praktik. Ini menjelaskan mengapa menambahkan anotasi tidak harus menulis ulang seluruh file, mengapa tanda tangan digital mencakup rentang byte tertentu alih-alih seluruh dokumen, mengapa pembaca dapat melompat ke halaman 500 tanpa memuat halaman 1 sampai 499, dan mengapa font kadang-kadang hilang bahkan ketika file tampak sempurna di layar penulis. Semuanya merupakan konsekuensi dari model objek yang sama

Semua yang ada dalam PDF adalah objek

Halaman, font, gambar, metadata, bookmark, anotasi, bidang formulir - semuanya direpresentasikan sebagai objek dalam file PDF. Objek dimulai dengan dua bilangan bulat dan kata kunci obj, menyimpan kontennya, dan ditutup dengan endobj. Bilangan bulat pertama adalah nomor objek; bilangan bulat kedua adalah nomor generasi, yang hampir selalu nol kecuali dalam file yang telah melewati banyak pengeditan

Yang membuat ini menjadi grafik adalah token referensi: 5 0 R berarti "objek 5, generasi 0, di mana pun ia berada dalam file." Tidak ada yang menyimpan konten secara langsung dalam induknya. Katalog dokumen menyimpan referensi ke pohon halaman; setiap node pohon halaman menyimpan referensi ke halaman-halamannya; setiap halaman menyimpan referensi ke sumber dayanya dan stream kontennya. Setiap bagian dapat diambil secara independen setelah Anda mengetahui di mana letaknya, dan di situlah tabel cross-reference masuk

Tabel cross-reference mengubah nomor objek menjadi posisi file

Tabel xref menyimpan offset byte untuk setiap objek, dihitung dari awal file. Pembaca tidak perlu memindai setiap byte untuk menemukan objek 47; ia mencari entri 47 di tabel, membaca offset, mencari ke posisi tersebut, dan memulai penguraian di sana. Itulah yang membuat navigasi acak menjadi cepat, yang pada gilirannya membuat format ini praktis untuk dokumen besar

Tabel xref sendiri ditemukan melalui trailer, yang merupakan hal terakhir dalam file sebelum %%EOF. Trailer menyimpan offset byte dari tabel xref, nomor objek katalog, dan beberapa bidang bookkeeping lainnya. Jadi urutan saat pembaca membuka file hampir terbalik dari urutan penulisan konten: baca dari akhir untuk menemukan trailer, ikuti trailer ke tabel xref, gunakan tabel untuk mengambil katalog, dan selesaikan pohon halaman dari sana

Pembaruan inkremental menambahkan ke file alih-alih menulis ulangnya

Karena setiap objek diidentifikasi oleh nomor dan ditemukan melalui tabel, file PDF dapat diperbarui tanpa menyentuh byte yang ada. Konten baru cukup ditambahkan di akhir: objek yang diperbarui, bagian xref baru yang mencakup hanya objek-objek yang berubah, dan trailer baru yang menunjuk ke bagian xref sebelumnya melalui entri /Prev

Hasilnya adalah rantai bagian xref yang berjalan mundur sepanjang file. Pembaca menggabungkannya, dengan entri terbaru untuk nomor objek manapun yang menang. Objek yang direvisi masih ada secara fisik di offset lamanya; ia hanya tidak dapat dijangkau lagi karena tabel yang lebih baru menunjuk ke penggantiannya

Mekanisme ini adalah alasan mengapa tanda tangan digital berfungsi pada PDF: tanda tangan mencakup rentang byte, dan pembaruan inkremental tidak pernah mengubah byte di rentang tersebut. Tanda tangan tetap valid terhadap snapshot aslinya sambil revisi selanjutnya hidup dalam bagian yang lebih baru

Font adalah objek, dan penyematan adalah semuanya

Font merupakan objek dalam grafik seperti yang lainnya. Sumber daya halaman menunjuk ke kamus font, yang menunjuk ke deskriptor font, yang dapat menunjuk ke data font aktual yang disematkan sebagai stream. Atau mungkin tidak: PDF memungkinkan font yang "tidak disematkan" yang hanya merekam nama dan metrik tetapi bukan kontur glif. Ketika font tidak disematkan, pembaca bergantung pada substitusi lokal, dan itulah sumber "teks yang tampak di mesin satu tetapi tidak terbaca di mesin lain."

Tidak ada yang ajaib tentang penyematan; ini hanya berarti data font aktual ada sebagai stream yang direferensikan dari kamus font. Alat yang menulis PDF dapat memilih untuk menyematkan seluruh font, sebagian darinya (subset yang berisi hanya glif yang benar-benar digunakan), atau tidak sama sekali. Subset sangat umum dalam file yang ditulis untuk cetak karena membuat file lebih kecil sambil masih menjamin rendering yang tepat

Format ini bertahan karena modelnya fleksibel

PDF telah diterbitkan sejak 1993 dan sekarang distandarkan sebagai ISO 32000. Nilainya yang bertahan bukan karena representasi halaman yang sempurna atau karena mengenkripsi teks dengan cara yang tidak dapat disalahgunakan, tetapi karena model objek yang cukup fleksibel untuk memuat anotasi, tanda tangan, formulir, multimedia, dan lapisan 3D dalam struktur yang sama. Setiap fitur tersebut merupakan kumpulan objek bernomor yang dihubungkan oleh referensi dan diindeks oleh tabel xref

Setiap perkakas yang menghasilkan atau membaca PDF pada akhirnya harus mengimplementasikan model yang sama: alokasikan nomor objek, tulis konten ke stream, perbarui tabel offset byte, dan bangun trailer yang menunjuk ke semuanya dengan benar. Perpustakaan seperti HotPDF Component untuk Delphi dan C++Builder menangani semua bookkeeping tersebut secara otomatis, sehingga kode aplikasi dapat berkonsentrasi pada konten apa yang harus ada di halaman daripada di mana masing-masing byte harus berada