Artikel Teknis

Bentuk Pohon Halaman PDF: Fan-Out, Perataan, dan Integritas /Count

Penjelasan pendamping kami mengenai pengurutan halaman PDF mencakup aturan dasar: urutan tampilan berasal dari penelusuran dari akar ke daun (depth-first), kiri ke kanan dari larik /Kids di pohon /Pages, bukan dari nomor objek. Artikel ini melihat pohon tersebut dari sudut yang berbeda — bentuknya. Mengapa pembuat PDF yang matang memancarkan hierarki simpul menengah padahal larik datar tunggal akan sah sepenuhnya? Apa yang sebenarnya berubah saat alat meratakan atau membangun ulang pohon? Dan apa yang terjadi saat pembukuan /Count yang membuat seluruh struktur berjalan cepat berhenti mengatakan kebenaran

Fan-out adalah keputusan kinerja

Tidak ada yang memaksa pembuat untuk membuat sarang. Dokumen 10.000 halaman dengan satu simpul /Pages akar dan referensi 10.000 daun dalam larik /Kids tunggal mematuhi spesifikasi. Namun demikian, Referensi PDF merekomendasikan pohon berimbang untuk dokumen besar, dan generator utama mengikuti saran itu dengan perluasan (fan-out) moderat, biasanya beberapa lusin anak per simpul menengah

Alasannya adalah apa yang harus dibaca penampil sebelum ia dapat menampilkan apa pun. Pertimbangkan lompatan langsung ke halaman 8.214 dari file 10.000 halaman itu. Dengan pohon datar, penampil terlebih dahulu harus mengurai simpul akar, dan simpul akar itu adalah satu larik yang sangat besar: pada kira-kira delapan bita per referensi tidak langsung, objek 80 KB yang harus ditokenisasi dari ujung ke ujung sebelum entri 8.213 dapat diselesaikan. Dengan pohon berimbang dari perluasan 32, lompatan yang sama membaca akar, membandingkan total berjalannya /Count untuk mengambil anak yang benar, dan turun — tiga atau empat kamus kecil secara total, masing-masing beberapa ratus bita. Itulah akses acak O(log n) yang dirancang untuk disediakan oleh pohon tersebut, dan itu adalah seluruh alasan /Count ada di simpul menengah: itu memungkinkan pembaca melompati seluruh sub-pohon tanpa membuka satu objek pun di dalamnya

Bentuk pohon juga mengatur biaya pengeditan. Pembaruan bertahap yang menyisipkan satu halaman harus menulis ulang setiap simpul yang /Kids atau /Count-nya berubah, yang berarti jalur dari induk daun baru ke atas hingga akar. Di pohon berimbang, jalur itu adalah segelintir kamus kecil yang ditambahkan ke file. Di pohon datar "jalur" itu adalah satu larik akar raksasa, disalin sepenuhnya pada setiap revisi. Kontrak yang melewati tiga puluh siklus peninjauan-dan-penandaan (review-and-annotate) dapat berakhir menyeret tiga puluh salinan yang diganti dari larik 80 KB yang sama dalam aliran bitanya

Simpul interior membawa atribut turunan

Simpul menengah bukan hanya perutean. Empat atribut halaman turunan — /Resources, /MediaBox, /CropBox, dan /Rotate — dapat dinaikkan ke simpul /Pages mana pun, tempat atribut-atribut itu berlaku untuk setiap daun di bawahnya kecuali jika ada keturunan yang mengesampingkannya. Penulis yang menghasilkan laporan dengan lampiran lanskap dapat menyatakan tata letak itu di pohon itu sendiri:

5 0 obj   % document root
<< /Type /Pages /Count 6 /Kids [6 0 R  7 0 R] >>
endobj

6 0 obj   % report body: portrait A4, body font
<< /Type /Pages /Parent 5 0 R /Count 3
   /Kids [30 0 R  31 0 R  32 0 R]
   /MediaBox [0 0 595 842]
   /Resources << /Font << /F1 8 0 R >> >> >>
endobj

7 0 obj   % appendix: landscape A4, rotated, its own font
<< /Type /Pages /Parent 5 0 R /Count 3
   /Kids [40 0 R  41 0 R  42 0 R]
   /MediaBox [0 0 842 595] /Rotate 90
   /Resources << /Font << /F2 9 0 R >> >> >>
endobj

40 0 obj  % appendix page: inherits size, rotation, fonts
<< /Type /Page /Parent 7 0 R /Contents 43 0 R >>
endobj

Objek 40 hingga 42 hampir kosong. Ukuran halamannya, perputaran, dan sumber daya huruf semuanya tiba lewat warisan dari simpul 7, yang membuat file ringkas dan bisa dipelihara sendiri: tambahkan halaman keempat di bawah simpul apendiks dan halamannya muncul lanskap dengan sendirinya

Mekanisme yang sama menciptakan bahaya pemindahan-halaman yang klasik. Misalkan alat memindahkan objek 40 ke dalam badan laporan dengan mengedit dua larik /Kids dan menunjuk ulang /Parent ke simpul 6. Kepindahannya sah secara terstruktur, namun objek 40 sekarang mewarisi potret /MediaBox, tanpa rotasi, dan huruf /F1 — sementara aliran isinya masih memilih /F2, yang tak lagi menyelesaikan. Halaman mengecil, tidak-berputar, dan kehilangan teksnya dalam sekali edit. Kode pengurutan ulang yang tangguh oleh karena itu mewujudkan nilai-nilai yang terselesaikan dari semua empat perlengkapan pewarisan ke dalam kamus halaman sebelum merubah indukknya. Jika Anda pernah menyeret sebuah halaman di editor dan menyaksikannya ganti dimensi atau arah, inilah mekanik yang Anda lihat

Perataan: sah, biasa, kadang memakan biaya

Banyak perkakas yang pergi sebaliknya. Pembuat sederhana melahirkan susunan satu tingkat dikarenakan ia sederhana, dan cukup banyak utilitas pisah gabung menyusun kembali apa saja susunan pohon yang dilahap kedalam larik datar /Kids, karena menghasilkan struktur yang berimbang itu tugas ekstra dan hasil keluaran datar selalu mematuhi pedoman. Sebuah pembangunan ulang yang semestinya, wajib menyelesaikan pewarisan bersamaan saat itu juga: semua bagian-bagian di mana daun memperoleh kewarisannya diharuskan untuk disalin ke daun yang dituju, atau digerek ke atas menuju akar yang baru jika itu sepadan ke seantero dokumen — jikalau tidak bentuk keluaran geometris dari perpindahan halaman berubah mengikuti alurnya

Bagi kebanyakan dokumen awam meratakan susunan pohon biasanya tidak berbahaya. Masalah merugikan hadir manakala berhadapan pada skala besar, di dua jalan yang telah digambarkan sebelumnya: sekumpulan obyek inti berubah besar ukurannya yang setiap jengkal pembukaan halaman wajib melahap ke seantero akar sepenuhnya, serta tiap pembaharuan struktur menulis ulang semua keseluruhan pohon itu. Namun perataan susunan tidak serta-merta merobohkan pembagian tautan melalui rujukan menyilang — pada jalinan susunan datar yang berisikan sekumpulan 10.000 lembar masih tertaut terhadap sebuah pustaka rujukan /Resources tetap dijamin kerampingannya. Satu-satunya kerugian hanya tertutupnya pilihan yang merelakan perwujudan entri halaman disematkan serta menyuguhkan penelusuran pada akar di tingkat puncaknya

Saat /Count Berbohong

/Count merupakan murni pembukuan: ia harus sama dengan jumlah halaman-daun (leaf pages) di dalam sub-pohon (subtree) simpul itu, dan tiada suatu apa pun pada susunan pedoman berkas tersebut yang memaksakannya. Dua corak kerusakan merupakan penyebab terbanyak dari perhitungan tipu yang ditemui di dunia nyata

Yang pertama, itu adalah jumlah tertinggal yang tak mutakhir disebabkan pembaruan bertahap (incremental update). Sebuah penyunting menyisipkan halaman, lalu mengubah-tulis induk terdekat beserta susunan /Kids baru dengan menaikkan nilai terkini dari hitungan /Count, serta mencangkokan kedua rupa pada naskah — dan luput memoles rentetan perindukannya:

% Original revision
12 0 obj
<< /Type /Pages /Count 9 /Kids [13 0 R  14 0 R  15 0 R] >>
endobj

14 0 obj
<< /Type /Pages /Parent 12 0 R /Count 3
   /Kids [50 0 R  51 0 R  52 0 R] >>
endobj

% Appended revision: one page inserted into the middle branch.
% Object 14 is superseded; object 12 is never rewritten
14 0 obj
<< /Type /Pages /Parent 12 0 R /Count 4
   /Kids [50 0 R  51 0 R  90 0 R  52 0 R] >>
endobj

Kini dahan induk pohon itu berisikan sepuluh helai daun, tetapi pada akar susunannya menyatakan ada sembilan lembaran daun. Sebuah alat bantu penglihatan memercayai total sembilan lembar pada mesin pencacah halamannya. Bagi penyunting yang menggunakan indeks pencarian hitungan beruntun bakal menghasilkan rentang halaman keliru seusai selipan itu diletakkan. Pada runtutan penjelusuran merata ditemukan segenapnya sepuluh helai daun. Dari berkas tunggal yang serupa, memperoleh corak bermacam tiga jawaban

Pola kerusakan kedua perhitungannya tiada masuk akal: menoreh angka nol, nilai merosot di ranah berpenghuni, atau pun besaran nilai raksasa yang absurd. Kealpaan ini timbul dikarenakan hantaman kerusakan, jejas lintasan penyaluran, serta sewaktu-waktu kepincangan rumus mesin hitung sewaktu menyunting dokumen. Kepincangan serupa cukup beresiko besar buat barisan rakitan mesin telusur yang memercayai /Count untuk pra-taksiran ukurannya — pada rentang taksiran muat berskala /Count bernominal -3 yang meluapkan eror berlipat layaknya lonjakan angka berjumlah hingga dua milyar yang mana menjadi pemicu macetnya sumber-sumber tenaga perangkat memori. Angka-angkanya ibarat rincian masukan meragukan yang melongsor bersama sekelumit kekacauan digit lainnya pada naskah itu

Oleh sebab keruwetan semacam itu perakit mesin pelahap naskah pecah dalam menilainya menjadi dua sekutu. Pengamat beraliran taat — piranti pemeriksaan awal (preflight tools), laras penyempurna PDF/A, pengarsipan salinan pipa — menimbang susunan /Count berlandaskan runtutan jumlah pencarian dan kemudian menangkal maupun memberinya cap pengenal di dalam naskah itu. Pada penampil halaman bergerak secara nyaris selalu menatapnya menuruti batas toleransi: mereka melahap penjelajahan, menjaring nomer urut sejatinya, dan mengesampingkan pencatatan di dalam kamusnya secara tertutup-tutup, dan dengan corak kepatutan ini dokumen beserta jumlah usang yang mencemarkannya bakal bisa lalu lalang dan bertahan ke ranah khalayak sekian windu tanpa adanya gugatan penyingkiran sehinggalah tersandung pada penyaring pengurai cermat (parser) yang tertata buat rangkaian otomatis. Pertahanan pertengahan bagi ranah pedoman pustakanya adalah memperlakukan /Count layaknya tanda jejak — memanfaatkannya pada penyisihan alokasi pendahuluan taksiran prapengukuran ruang berjejak sub-pohon demi mempercepat lewat jikalau keotentikannya tervalidasi dengan baik — sejalan bersama kebersandaran hasil perolehan runut merayap bagi satu-satunya pembawa suluh penerangan

Guna pelacakan rentetan merayap (traversal) itu tersendiri, susunan kelokan nilai warisan, berserta urut telusur penjaluran dari buku ke dedaun (catalog-to-leaf), singgahlah mula-mula dari paparan pengurutan halaman. Menyoroti dampak kerusakan semacam ini yang menerpa langsung menuju laras rangkaian terwujud untuk pemakaian komersial pengguna awam yang terjamah ke ranah khalayak umum bacalah perihal reka telisik masalah penyelarasan deretan cetak halaman berseri, merangkum kegaduhan kejadian laras jejak yang semrawut dimulai hulu pertandanya ketibaan pangkal akarnya

Komponen HotPDF membereskan hal ihwal tersebut di lapisan dalamnya secara jeli: menjamah deretan perantara jalinan anak yang bersarang ke semua tingkat celah terdalam mana saja, membabar perolehan pembawa peninggalan perlengkapan yang menjangkiti (inherited attributes) masa-masa pencaplokan duplikasi halamannya atau perpindahannya, dan mengotentikasi sah /Count bermuara ketepatan rentetan daun purna terhitung menanggalkan kepercayaan rincian kusam usang yang tercatat semata-mata, oleh karenanya bilangan deret penunjuk di rute pintas antar mukanya (API) selalu menterjemahkan ke ranah nalar yang wajar (logical pages)