15 poin oleh GN⁺ 2025-08-04 | Belum ada komentar. | Bagikan ke WhatsApp
  • 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 (startref dan 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 (n atau f) 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 (startref dan 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 /Prev yang 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.

Belum ada komentar.