Cara Kerja File PDF: Apa Isi di Dalam PDF dan Kenapa Itu Penting
Penjelasan sederhana tentang format PDF: halaman, font, gambar, teks, formulir, dan metadata. Memahami strukturnya menjelaskan kenapa PDF berperilaku seperti itu.
NewKitApp 9 menit baca
Mungkin Anda membuka belasan PDF setiap minggu tanpa pernah memikirkan apa sebenarnya file itu. Lalu suatu hari Anda mencoba menyalin satu paragraf dan yang keluar malah huruf acak, atau formulir tiga halaman ukurannya 15 MB, atau file gabungan kehilangan isian formulirnya, dan format ini tiba-tiba terasa misterius.
Sebenarnya tidak misterius. PDF mengikuti beberapa gagasan sederhana yang diterbitkan Adobe pada 1993 dan menjadi standar ISO terbuka (ISO 32000) pada 2008. Setelah memahami gagasan itu, perilaku aneh PDF mulai masuk akal, dan Anda bisa memilih tool yang tepat untuk setiap pekerjaan. Artikel ini menelusuri format PDF dari luar ke dalam, tanpa mengandaikan pengetahuan pemrograman.
Tujuannya: halaman yang tampil sama di mana pun
Sebelum ada PDF, mengirim dokumen berarti mengirim file Word, WordPerfect, atau format editor lain. Penerima butuh program yang sama, versi yang sama, dan font yang sama. Kalau tidak, tata letak bergeser: baris terpotong di tempat berbeda, halaman pindah di tempat baru, font yang tidak ada diganti dengan font lain.
PDF memecahkan masalah itu dengan menggambarkan halaman yang sudah jadi, bukan dokumen yang bisa diedit. File Word berkata "ini judul, ini paragraf, lipat sesuai lebar halaman". PDF berkata "gambar karakter-karakter ini di koordinat persis ini dengan font persis ini". Tidak ada pelipatan yang perlu dihitung ulang, jadi halaman tampil sama di ponsel, Mac, PC Windows, maupun printer.
Satu keputusan desain itu menjelaskan sebagian besar isi artikel ini. PDF sangat bagus untuk menjaga tata letak tetap, dan canggung untuk apa pun yang mengharuskan tata letak berubah.
Struktur dasar
Buka PDF di editor teks biasa dan Anda akan melihat campuran kata kunci yang bisa dibaca dan data biner acak. Di bawahnya, file itu punya empat bagian:
- Header, baris pertama seperti
%PDF-1.7, menyebut versinya. - Body berisi objek-objek bernomor: halaman, font, gambar, aliran teks, kolom formulir.
- Tabel cross-reference yang mencatat di mana setiap objek dimulai di dalam file, sehingga pembaca bisa langsung melompat ke halaman 400 tanpa membaca halaman 1 sampai 399.
- Trailer yang menunjuk ke objek akar dokumen dan tabel cross-reference.
Objek-objek saling merujuk lewat nomor. Akar menunjuk ke pohon halaman, pohon halaman menunjuk ke setiap halaman, setiap halaman menunjuk ke isi dan sumber dayanya. Bayangkan sebagai basis data kecil berisi komponen.
Struktur inilah yang membuat sebagian pekerjaan murah. Memutar halaman cukup mengubah satu angka di satu objek. Menghapus halaman cukup mengeluarkannya dari pohon halaman. Menggabungkan berarti menyalin objek dari beberapa file ke satu file lalu membangun pohon halaman baru. Tidak satu pun butuh pemahaman tentang apa yang tercetak di halaman.
Halaman dan content stream
Setiap objek halaman punya ukuran ("media box", dalam poin; 72 poin sama dengan satu inci), rotasi opsional, dan content stream. Content stream adalah daftar operator gambar, kira-kira seperti ini:
BT /F1 12 Tf 72 720 Td (Halo, dunia) Tj ET
0.8 0.1 0.1 rg 72 600 200 50 re f
Dalam bahasa biasa: mulai teks, pakai font F1 ukuran 12 poin, pindah ke posisi (72, 720), tampilkan "Halo, dunia", akhiri teks. Lalu atur warna isi menjadi merah, gambar persegi panjang 200 × 50 di (72, 600), dan isi warnanya.
Itu saja. Halaman adalah program yang menggambar dirinya sendiri. Koordinat dimulai dari sudut kiri bawah, itu sebabnya sebagian tool PDF tampak menaruh sesuatu terbalik jika tidak memperhitungkannya.
Dua hal mengikuti dari sini:
- Warna ada di dalam instruksi. Mengubah dokumen jadi hitam putih berarti menulis ulang setiap operator warna. Begitulah cara PDF Hitam Putih mempertahankan teks sebagai teks sambil menghapus warna.
- Rotasi adalah pengaturan terpisah. Halaman dengan
/Rotate 90punya content stream yang sama dengan halaman yang tidak diputar; pembaca PDF memutarnya saat menampilkan. Itu sebabnya Putar PDF instan dan tanpa penurunan kualitas.
Teks: kenapa menyalin kadang gagal
Lihat lagi content stream di atas. "Halo, dunia" digambar sebagai satu string di satu posisi. Tapi pembuat PDF sering memecah teks jauh lebih halus: satu kata per potong, bahkan satu huruf per potong saat mengatur jarak antarhuruf. Paragraf rata kiri-kanan bisa terdiri dari ratusan string kecil, masing-masing di koordinat persis.
Tidak ada paragraf di dalam PDF, dan sering tidak ada spasi. Saat Anda melihat spasi di antara dua kata, bisa jadi itu hanya celah di antara dua string. Saat Anda menyalin teks, pembaca PDF harus menebak di mana kata, baris, dan paragraf dimulai dengan melihat posisi. Biasanya tebakannya bagus. Kadang, terutama pada tata letak dua kolom, tabel, dan teks rata kiri-kanan, tebakannya meleset, dan Anda mendapat kata yang menempel, baris yang urutannya salah, atau tanda hubung di tengah kata.
PDF ke Teks menyusun ulang urutan baca dengan mengelompokkan potongan teks pada garis dasar yang sama menjadi baris, mengurutkan baris dari atas ke bawah, dan menambahkan spasi di mana celah antarpotongan cukup lebar. Hasilnya lebih baik dari salin-tempel biasa, tapi tetap rekonstruksi, bukan membaca paragraf yang tersimpan.
Font dan masalah "huruf acak"
PDF menggambar teks memakai kode glyph, bukan huruf. Font di dalam file memetakan kode ke bentuk huruf. Untuk menyalin teks, pembaca juga butuh peta dari kode kembali ke karakter Unicode (tabel "ToUnicode"). Kebanyakan pembuat PDF menyertakannya. Sebagian tidak, terutama software lama atau khusus, dan sebagian sengaja mengacaknya. Tanpa peta itu, pembaca bisa menggambar huruf dengan sempurna tapi tidak tahu huruf apa itu. Saat disalin, keluarlah simbol aneh. Tidak ada tool ekstraksi yang bisa memperbaikinya dengan andal, karena informasinya memang tidak ada di file.
Halaman hasil scan tidak berisi teks sama sekali
Halaman hasil scan adalah satu gambar. Tidak ada operator teks, hanya "gambar foto ini di seluruh halaman". Tidak ada yang bisa disalin. Untuk mengambil teks dari scan, Anda butuh OCR (optical character recognition), yang menganalisis gambar dan menebak hurufnya.
Gambar
Gambar disimpan sebagai objek terpisah, biasanya dikompres JPEG (DCTDecode dalam istilah PDF) untuk foto atau dengan kompresi Flate tanpa kehilangan data untuk tangkapan layar dan grafis. Content stream halaman berkata "gambar Im1 di posisi dan ukuran ini".
Resolusi gambar yang disimpan dan ukuran tampilannya tidak saling terikat. Foto selebar 4000 piksel bisa digambar di kotak 5 cm. Itu sebabnya PDF bisa berat: file menyimpan setiap piksel, meskipun halaman hanya menampilkan gambarnya kecil. Tool kompresi seperti Kompres PDF bekerja dengan mengecilkan gambar-gambar ini ke resolusi yang masuk akal lalu mengenkodenya ulang, tanpa menyentuh teks.
Karena satu objek gambar bisa digambar di banyak halaman, logo yang muncul di setiap halaman laporan hanya disimpan sekali. Itu juga sebabnya memisahkan dokumen kadang menghasilkan bagian yang masing-masing hampir sebesar keseluruhannya: jika setiap halaman memakai gambar latar besar yang sama, setiap bagian butuh salinannya.
Font
PDF menyematkan font agar dokumen tampil sama di komputer yang tidak punya font itu. Menyematkan font utuh bisa menambah ratusan kilobyte, jadi kebanyakan software hanya menyematkan subset berisi karakter yang dipakai. Kadang Anda melihat nama font seperti ABCDEF+Calibri di properti dokumen; awalan acak itu menandai subset.
Jika font tidak disematkan, pembaca menggantinya dengan font yang mirip. Teks bisa bergeser sedikit di barisnya, atau tampil salah untuk aksara yang tidak umum. Percetakan biasanya meminta "semua font tersemat" karena alasan ini.
Ada 14 font "standar", seperti Helvetica, Times, dan Courier, yang dijamin ada di setiap pembaca PDF dan tidak perlu disematkan. Font-font ini hanya mencakup karakter Eropa Barat (termasuk huruf yang dipakai bahasa Indonesia), itu sebabnya tool yang membuat PDF dengan font ini, seperti Markdown ke PDF, tidak bisa mencetak emoji atau aksara non-Latin.
Formulir
Formulir interaktif adalah lapisan di atas halaman. Setiap kolom (kotak teks, kotak centang, dropdown) adalah objek "anotasi" dengan posisi, nilai, dan appearance stream yang memberi tahu pembaca cara menggambar kolom itu dengan nilainya saat ini.
Karena kolom berada di lapisan terpisah:
- Sebagian aplikasi menampilkan kolom secara berbeda atau tidak sama sekali.
- Menggabungkan dokumen bisa menghilangkan kolom, karena formulir adalah milik dokumen, bukan milik halaman.
- Siapa pun yang menerima formulir terisi bisa mengubah jawabannya.
Flatten menyelesaikan ketiganya. Flatten PDF menggambar tampilan setiap kolom saat ini ke isi halaman lalu menghapus objek kolomnya. Jawaban menjadi isi halaman biasa.
Anotasi
Komentar, sorotan, catatan tempel, cap, dan tautan juga merupakan anotasi yang berlapis di atas halaman. Pembaca PDF menampilkannya; Anda bisa menyembunyikan atau menghapusnya tanpa menyentuh halamannya. Tautan adalah anotasi yang punya aksi: "pergi ke halaman 12" atau "buka URL ini".
Metadata
Setiap PDF bisa membawa informasi tentang dirinya: judul, penulis, subjek, kata kunci, aplikasi yang membuatnya, software yang menghasilkan PDF, serta tanggal dibuat dan diubah. Informasi ini tersimpan di dua tempat: kamus "document information" yang lama dan aliran metadata XMP yang lebih baru dalam bentuk XML.
Metadata mudah terlupakan tapi ternyata cukup terlihat. Browser menampilkan kolom Judul sebagai nama tab. Mesin pencari memakainya sebagai judul PDF di hasil pencarian. Kolom Penulis sering berisi nama akun pengguna komputer, yang bisa mengungkap lebih dari yang Anda maksud. Anda bisa memeriksa dan mengubahnya dengan Edit Metadata PDF, atau menghapusnya sama sekali dengan Bersihkan PDF.
Enkripsi
PDF yang dikunci kata sandi punya content stream dan string yang dienkripsi, dengan kunci yang diturunkan dari kata sandi. PDF modern memakai AES-256. Ada dua kata sandi:
- Kata sandi pengguna untuk membuka dokumen.
- Kata sandi pemilik untuk mengatur izin seperti mencetak, menyalin, dan mengedit.
Izin adalah penanda yang diharapkan dipatuhi oleh aplikasi pembaca. Izin bukan penghalang kriptografis: setelah dokumen terbuka, pengguna yang gigih dengan software yang tepat bisa mengabaikannya. Kata sandi pembuka adalah perlindungan yang sesungguhnya. Kunci PDF dan Buka Kunci PDF menangani kedua arah.
Pembaruan bertahap dan riwayat tersembunyi
Saat Anda mengedit lalu menyimpan PDF di sebagian aplikasi, aplikasi itu tidak menulis ulang seluruh file. Perubahan ditambahkan di akhir file, bersama tabel cross-reference baru yang menunjuk ke versi baru dari objek yang berubah. Objek lama tetap ada di file, tidak dirujuk tapi masih ada.
Fitur "incremental update" ini membuat penyimpanan cepat dan dibutuhkan untuk tanda tangan digital (byte yang ditandatangani tidak boleh berubah). Tapi itu juga berarti sebuah file bisa berisi versi lama dari isinya. Tool yang menyalin halaman ke dokumen baru, seperti tool gabung dan ambil halaman, meninggalkan riwayat itu.
Versi dan jenis PDF
Anda akan melihat nomor versi dari 1.3 sampai 2.0. Versi baru menambahkan fitur: transparansi (1.4), kompresi lebih baik (1.5), enkripsi AES (1.6, 1.7), dan spesifikasi yang dirapikan (2.0). Hampir semua pembaca PDF saat ini menangani semuanya.
Ada juga profil khusus:
- PDF/A untuk arsip jangka panjang: font wajib tersemat, tanpa enkripsi, tanpa ketergantungan eksternal. Sebagian instansi dan perpustakaan kampus meminta skripsi atau dokumen arsip dalam PDF/A.
- PDF/X untuk percetakan profesional: penanganan warna yang ketat dan definisi bleed.
- PDF/UA untuk aksesibilitas: struktur bertag agar pembaca layar bisa mengikuti urutan baca.
Untuk keperluan sehari-hari, PDF biasa sudah cukup.
Cara mengintip isi PDF sendiri
Anda tidak butuh software khusus untuk melihat struktur ini. Buka PDF kecil di editor teks seperti Notepad atau TextEdit. Gulir melewati bagian biner dan Anda akan menemukan potongan yang terbaca: /Type /Page, /MediaBox [0 0 595 842] (halaman A4 dalam poin), /Font, /Producer (Microsoft Word). Angka sebelum obj adalah ID objek, dan 12 0 R berarti "lihat objek 12". Sebagian besar isi terlihat acak karena dikompres, tapi kerangkanya terlihat.
Pembaca PDF menampilkan tampilan yang lebih ramah. Di Adobe Acrobat Reader, Chrome, atau Firefox, buka properti dokumen untuk melihat metadata, ukuran halaman, versi PDF, dan font. Sering itu sudah cukup untuk mendiagnosis masalah, misalnya file besar karena belasan font tersemat, atau judul kosong yang membuat tab browser menampilkan nama file.
Artinya dalam praktik
Memahami struktur membantu memilih tool yang tepat:
- Untuk menyatukan atau memotong dokumen, bekerjalah di tingkat halaman: gabung, pisah, ambil. Cepat dan tanpa penurunan kualitas karena memindahkan objek halaman utuh.
- Untuk mengubah tampilan halaman (rotasi, potong), ubah pengaturan halaman, bukan isinya.
- Untuk menambahkan sesuatu (watermark, nomor halaman, tanda tangan), tambahkan instruksi gambar ke halaman.
- Untuk memperkecil file, sasar gambar, bukan teks.
- Untuk mengambil teks, ingat bahwa itu rekonstruksi, dan scan butuh OCR.
- Untuk mengunci jawaban formulir, flatten.
- Untuk berbagi dengan aman, periksa metadata, lampiran, dan lapisan tersembunyi.
Pertanyaan yang sering muncul
Kenapa PDF tidak bisa diedit seperti Word? Karena PDF menyimpan halaman jadi, bukan struktur paragraf. Mengedit berarti menebak ulang strukturnya; lihat panduan PDF ke Word.
Apakah PDF aman dari virus? PDF bisa berisi JavaScript yang berbahaya bagi pembaca yang belum diperbarui. Selalu perbarui pembaca PDF Anda, dan bersihkan skrip dari file yang tidak Anda percaya.
Kenapa ukuran PDF saya besar padahal isinya sedikit? Biasanya karena gambar beresolusi tinggi atau banyak font tersemat.
Penutup
PDF dibuat untuk menjaga halaman yang sudah jadi tetap seperti itu. Tool yang menghormati desain ini, yaitu memindahkan halaman dan menambah lapisan alih-alih mencoba menata ulang isi, memberi hasil bersih. Tool yang melawannya, seperti konverter yang mencoba membangun file Word yang bisa diedit dari teks berposisi, selalu melibatkan tebakan. Dengan pemahaman itu, Anda tahu apa yang bisa diharapkan sebelum menekan tombol.