Ingin mem-parsing PDF?
(eliot-jones.com)- Parsing PDF idealnya bekerja berdasarkan urutan dan struktur yang jelas, tetapi file nyata sering kali tidak mengikuti spesifikasi ini
- Berbagai error dan ketidaksesuaian muncul saat mencari pointer cross-reference (xref) dan offset
- Dalam praktiknya, banyak masalah muncul karena data yang tidak perlu sebelum header PDF atau posisi pointer dan offset yang salah
- Ada juga banyak kasus ketika tabel xref PDF itu sendiri tidak jelas atau salah format
- Karena itu, viewer utama menambahkan implementasi logika tambahan untuk mendukung file PDF nonstandar
Pendekatan ideal terhadap parsing PDF
- Secara teori, parsing PDF berjalan melalui langkah-langkah yang tetap
- Mencari komentar header versi di awal file
- Mencari pointer cross-reference (xref)
- Mengumpulkan semua offset objek
- Mencari dictionary trailer untuk mengakses keseluruhan struktur katalog
Pengenalan objek PDF
- Objek PDF adalah unit yang membungkus dan menyimpan berbagai elemen PDF seperti angka, string, dictionary, dan lain-lain
- Setiap objek berada di antara marker "
obj/endobj" - Objek saling terhubung melalui referensi tidak langsung (indirect reference, misalnya: "16 0 R")
- Cara objek dipisahkan di dalam file bersifat bebas, tetapi beberapa jenis objek wajib berupa referensi tidak langsung
Mencari offset cross-reference
- Dalam struktur PDF terdapat tabel cross-reference (xref), yang berfungsi sebagai indeks lokasi objek
- Di akhir file, posisi byte tertentu dinyatakan sebagai pointer melalui sintaks "startxref"
- Pointer ini menunjuk lokasi xref, tetapi ada perbedaan antara spesifikasi dan file nyata. Misalnya, marker "%EOF" seharusnya berada di baris terakhir, tetapi pada PDF dunia nyata bisa berada di mana saja dalam 1.024 byte terakhir
- Pada file nyata ditemukan berbagai variasi seperti kesalahan format pointer (
startrefdan sebagainya), tidak adanya line break, dan lain-lain
Mencari offset objek
- Tabel xref terdiri dari "xref", nomor awal objek, dan jumlah objek secara berurutan, lalu offset/generation number/status tiap objek (
natauf) dicatat per baris - Tabel xref bisa berjumlah lebih dari satu, atau saling terhubung melalui entri
/Prev
Menelusuri lokasi dictionary trailer
- Di atas marker startxref terdapat dictionary trailer, yang berisi metadata penting untuk menemukan objek root
- Berdasarkan objek root, interpretasi seluruh struktur dapat dimulai
Lingkungan nyata: masalah-masalah tak terduga
-
Banyak file yang tidak mematuhi spesifikasi PDF, sehingga sulit ditangani dengan parser umum
-
Kasus kegagalan yang umum saat menelusuri pointer cross-reference
- Pointer tidak berada di akhir file atau 1.024 byte terakhir
- Salah ketik (
startrefdan sebagainya) - Format yang tidak lazim
-
Dalam investigasi terhadap 3.977 sampel PDF nyata, sekitar 0,5% memiliki kesalahan deklarasi xref
Konten PDF dimulai pada offset yang bukan 0
- Jika ada data sampah (junk) sebelum header, semua offset byte akan bergeser sehingga posisi startxref menjadi meleset
- Offset harus dihitung ulang berdasarkan posisi header, dan kedua posisi perlu diperiksa
- Ini mencakup sekitar 50% dari seluruh error
Pointer xref menunjuk ke tengah tabel xref
- Offset yang ditentukan bisa saja bergeser ke tengah isi tabel xref
- Ditemukan pada sekitar 5 dari 3.977 sampel
Pointer berada di dekat xref
- Sering kali pointer tidak tepat, tetapi hanya meleset sebesar spasi atau karakter newline tepat sebelum atau sesudah xref
Pointer benar, tetapi offset xref salah
- Offset yang tercatat di tabel xref itu sendiri bisa salah
- Sebagian objek mungkin benar, sementara sisanya memiliki error offset
Pointer pertama normal, tetapi offset sebelumnya (/Prev) aneh
- Ada banyak kasus ketika pointer
/Prevyang dibuat saat PDF dimodifikasi menyimpan nilai yang salah (misalnya 0)
Format tabel xref tidak normal
- Ada berbagai kasus seperti
"xref"dan angka yang menempel tanpa line break, jumlah entri yang lebih banyak daripada objek yang dideklarasikan, atau data sampah di tengah tabel - Kasus-kasus seperti ini banyak dilaporkan sebagai issue di PdfPig dan lainnya
Kesimpulan
- Menurut spesifikasi, parsing PDF seharusnya diproses dalam urutan yang terstruktur, tetapi banyak file nyata tidak seperti itu sehingga berbagai masalah parsing pun muncul
- Viewer PDF untuk penggunaan nyata pada dasarnya menyertakan fitur untuk memperluas dukungan terhadap PDF nonstandar
- Ringkasan kali ini hanya membahas sebagian parsing yang termasuk dalam spesifikasi PDF (22 halaman dari total 1300 halaman)
Belum ada komentar.