3 poin oleh GN⁺ 2024-02-01 | 1 komentar | Bagikan ke WhatsApp
  • Angka “ukuran maksimum PDF 381 km × 381 km” yang beredar di internet berasal dari batas implementasi Adobe Acrobat 7.0, bukan batas format PDF itu sendiri
  • Sejak PDF 1.6, 1/72 inci sebagai satuan dasar bisa diperbesar dengan /UserUnit, dan nilai maksimum 75,000 di Acrobat 7.0 membentuk batas atas 15,000,000 inci
  • PDF yang dibuat manual terdiri dari %PDF-1.6, daftar objek, xref, trailer, startxref, dan %%EOF, sementara ukuran halaman ditentukan oleh kombinasi /MediaBox dan /UserUnit
  • Acrobat tetap menampilkan 15,000,000 inci meski /MediaBox melewati 14,400 atau /UserUnit melewati 75,000, dan nilai /UserUnit yang berlebih diabaikan tanpa peringatan
  • macOS Preview.app mengabaikan /UserUnit, tetapi tidak memberi batas atas /MediaBox seperti Acrobat, sehingga file yang tampak seperti PDF lebih besar dari alam semesta pun bisa dibuat

Dari mana batas 381 km berasal

  • Klaim bahwa ukuran maksimum dokumen PDF adalah 381 km × 381 km sudah lama berulang kali tersebar di internet
  • Angka ini bukan berasal dari batas format PDF, melainkan dari batas implementasi Adobe Acrobat
  • Menurut spesifikasi PDF 1.7, batas ukuran halaman dapat diringkas sebagai berikut
    • Sebelum PDF 1.6, satuan ruang pengguna dasar tetap di 1/72 inci
    • Sejak Acrobat 5.0, nilai maksimum ukuran halaman dasar adalah 14,400 × 14,400 satuan, yaitu 200 × 200 inci
    • Mulai PDF 1.6, ukuran satuan ruang pengguna dasar dapat diatur dengan /UserUnit di kamus halaman
    • Acrobat 7.0 mendukung nilai maksimum /UserUnit sebesar 75,000, sehingga dimensi halaman maksimum menjadi 15,000,000 inci
  • 15,000,000 inci kira-kira setara dengan 381 km, dan ungkapan “PDF version 7” tampaknya merujuk bukan pada versi PDF, melainkan pada Adobe Acrobat 7.0

Struktur dasar PDF buatan tangan

  • File PDF memiliki nomor versi di awal dan penanda EOF di akhir
    • Contoh: %PDF-1.6
    • Penanda akhir: %%EOF
  • Setelah nomor versi, ada daftar objek yang merepresentasikan halaman, teks, grafik, dan sebagainya
  • xref adalah tabel referensi silang yang menunjukkan posisi objek
    • Pembaca PDF memeriksa berapa byte jarak tiap objek dari awal file
  • trailer menyimpan metadata seluruh dokumen
    • jumlah halaman
    • apakah dokumen dienkripsi
    • objek root dokumen
  • startxref menunjuk ke posisi awal tabel xref
    • Pembaca PDF mencari nilai startxref dari bagian akhir file lalu berpindah ke tabel xref
  • Dengan merujuk pada artikel tentang membuat file PDF sederhana, kita bisa membuat PDF dengan persegi panjang merah secara manual

Objek dan definisi halaman

  • Contoh PDF terdiri dari empat objek inti
    • Objek 1: objek stream yang menggambar persegi panjang merah
    • Objek 2: objek Page yang mendefinisikan satu halaman
    • Objek 3: objek Pages yang menyimpan informasi banyak halaman
    • Objek 4: objek Catalog yang menyediakan struktur utama dokumen
  • Objek Page menghubungkan isi halaman melalui referensi ke objek lain
    • 1 0 R merujuk ke objek nomor 1, generasi nomor 0
    • 3 0 R merujuk ke objek Pages, yaitu kumpulan halaman
  • Saat menulis PDF secara manual, setiap kali posisi objek berubah, nilai dalam tabel xref harus disesuaikan ulang, sehingga sangat merepotkan
  • Pada pembaruan 16 April 2025, nilai xref 0 4 di kode contoh dikoreksi karena salah
    • Tabel referensi silang yang sebenarnya memiliki 5 entri, jadi yang benar adalah xref 0 5

Memperbesar halaman dengan /MediaBox dan /UserUnit

  • Ukuran halaman PDF diatur pada tiap objek Page
  • /MediaBox [0 0 300 300] membuat halaman dengan lebar dan tinggi masing-masing 300 satuan
    • Satuan dasarnya adalah 1/72 inci
    • 300 satuan kira-kira 4.17 inci
  • Jika /MediaBox diubah menjadi 600 600, Acrobat menampilkan halaman sebagai 8.33 x 8.33 in
  • Nilai maksimum /MediaBox yang diizinkan di Acrobat, yaitu 14400 14400, ditampilkan sebagai 200 × 200 inci
    • Jika melewati nilai ini, Acrobat akan menampilkan peringatan
  • Dengan menambahkan /UserUnit, ukuran satuan ruang pengguna dasar bisa diperbesar
    • /UserUnit 2 membuat kedua dimensi halaman menjadi dua kali lipat
    • Jika /MediaBox [0 0 14400 14400] dipakai bersama /UserUnit 2, Acrobat menampilkannya sebagai 400.00 x 400.00 in
  • Jika /UserUnit 75000 diterapkan, Acrobat menampilkan halaman sebagai 15,000,000.00 × 15,000,000.00 inci
    • Ini kira-kira setara dengan 381 km × 381 km, sesuai dengan klaim awal
    • File contoh: biggest.pdf

Perbedaan penanganan Acrobat dan Preview

  • Acrobat tetap menampilkan ukuran halaman sebagai 15,000,000 inci walaupun /MediaBox atau /UserUnit dibuat lebih besar
  • Jika nilai /UserUnit diatur lebih besar dari 75000, nilainya dibatasi tanpa peringatan atau error
  • /UserUnit tampaknya memang tidak banyak dipakai dalam praktik
    • Jawaban Stack Overflow juga menyebut nilai ini tidak digunakan secara luas
    • Sulit menemukan contohnya secara online
  • macOS Preview.app tidak mendukung /UserUnit
    • Semua PDF diproses dengan satuan dasar 1/72 inci
  • Namun, tidak seperti Acrobat, Preview.app tidak menetapkan batas atas besar untuk /MediaBox
    • Lebar dengan 12 angka nol setelah 1 pun masih diterima
    • Lebar ini kira-kira setara dengan jarak Bumi ke Bulan
  • Dengan memasukkan nilai /MediaBox yang lebih besar lagi, kita bahkan bisa membuat file yang ditampilkan Preview sebagai PDF berukuran sekitar 37 triliun tahun cahaya persegi
    • File contoh: universe.pdf
    • Sebagian besar dokumen hanyalah ruang kosong, dan ada peringatan agar tidak mencetaknya

1 komentar

 
GN⁺ 2024-02-01
Komentar Hacker News
  • PDF secara teknis buruk dalam banyak hal, tetapi fakta bahwa ia adalah berkas statis yang mandiri yang bisa kusimpan di tangan sendiri itu hebat, apalagi dibandingkan situs web dinamis/SaaS yang memusuhi pengguna dan bisa hilang kapan saja
    PDF/A lebih mendekati PDF yang sebenarnya, dan menyingkirkan sebagian besar sampah berbahaya
    Kalau suka keisengan PDF yang aneh, ada berkas polyglot yang merupakan PDF/A, sekaligus CSV, dan juga soundtrack Amiga soundtracker mod: https://www.lab6.com/6

    • Ketika Amazon mulai menarik kembali buku dari akun, bagian menyimpan di tangan sendiri menjadi penting
      https://www.nytimes.com/2009/07/18/technology/companies/18am...
    • PDF adalah berkas yang dapat dieksekusi
      Banyak orang mengkhawatirkan eksekusi JavaScript, tetapi memakai berkas PDF tanpa banyak masalah
    • Hingga baru-baru ini, tidak ada cara mudah untuk memastikan apakah sebuah berkas benar-benar PDF/A, dan sekarang ada veraPDF, tetapi itu perangkat lunak yang cukup kompleks
      Untuk mengubah PDF sembarang menjadi PDF/A dengan perangkat lunak open source, tampaknya satu-satunya cara adalah lewat PostScript dengan Ghostscript lalu kembali lagi, tetapi Ghostscript berlisensi Affero sehingga bisa membawa berbagai masalah
      Ada juga versi GPL lama, dan bekerja untuk kebanyakan PDF, tetapi usianya kira-kira 15 tahun
      Di tempat kerja dulu aku harus menangani PDF/A, dan itu sama sekali tidak menyenangkan
    • Karena penderitaan yang kualami saat mengerjakan proyek yang mem-parsing jutaan PDF dari berbagai sumber, sulit memaafkan klaim bahwa “PDF adalah format yang hebat”
      Sekadar merekonstruksi paragraf saja butuh usaha besar, apalagi parsing tabel
      Untuk sesuatu yang secara de facto menjadi standar, seharusnya bisa lebih baik, dan manual PDF juga benar-benar buruk
    • Dari sudut pandang orang yang bekerja di industri grafis, PDF yang sebenarnya adalah PDF/X
  • Sebagai perbandingan, kalau menganalisis PNG, lebar dan tinggi maksimumnya adalah 2147483647, yaitu 2^31 - 1
    Kepadatan terendah yang bisa ditentukan dengan chunk pHYs adalah 1 piksel per meter, jadi 2 miliar meter lebih besar daripada diameter Matahari yang 1,39 gigameter: https://en.wikipedia.org/wiki/Orders_of_magnitude_(length)#g...
    Karena chunk sCAL memakai bilangan floating-point ASCII, ukuran fisik yang jauh lebih besar pun bisa dinyatakan

    • sCAL lebih berkaitan dengan ukuran objek yang direpresentasikan gambar, bukan gambar itu sendiri
      Peta dunia berskala 1:10.000.000 lebarnya kurang dari 10 m menurut pHYs, tetapi menurut sCAL lebarnya sekitar 40.000 km
  • Begitu lebar PDF diukur dalam satuan kilometer, kita tahu sedang membaca tulisan teknis yang bagus

    • Kartu microSD bisa memuat jutaan mil dalam ruang yang sangat kecil
  • Aku jadi teringat PDF yang kubuat lebih dari 10 tahun lalu dari implementasi PostScript untuk Game of Life
    Sepertinya masih berjalan, tetapi membuat macOS Preview crash: https://andrewcutler.net/docs/joke/life.pdf

    • Di Sonoma, Preview tidak crash
      Namun animasinya tidak terlihat, hanya keadaan akhirnya yang terlihat, sedangkan di penampil PDF Firefox tampak sedikit animasi
      Skim juga mirip Preview, tetapi tidak menampilkan grid
    • Di Mac OS Monterey, tidak crash dan hanya menampilkan render Game of Life yang statis
  • Tulisan ini mengingatkanku pada permainan intelektual Umberto Eco
    Terutama “On the Impossibility of Drawing a Map of the Empire on a Scale of 1 to 1”: https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...

  • Berbeda dari Acrobat, Preview tidak punya batas atas untuk nilai yang bisa dimasukkan ke MediaBox, dan bahkan menerima lebar berupa angka 1 diikuti 12 nol
    Di pemeriksa dokumen, ukuran halaman ditampilkan sebagai 352777777777.78 x 10.59cm, dan lebar ini kira-kira setara jarak Bumi ke Bulan
    Bahkan semua planet di tata surya jika diletakkan berjajar pun bisa masuk dengan longgar ke dalam dokumen ini

    • Kalau dihitung, dokumen itu sekitar 373km², jadi jauh lebih kecil daripada Jerman
      Pada akhirnya memang perlu penggaris
    • Ada satu angka 7 yang terlalu banyak
      352777777777.78cm adalah 3.527.777,7777778km
    • Kalau diisi konten sungguhan alih-alih ruang kosong, jadi penasaran berapa ukuran berkas PDF seperti itu
  • Eksperimen yang menarik, alexwlchan
    Ada dua kesalahan kecil di tulisannya: bagian “15,000,000,000.00 in” dan “ukuran halaman 15 miliar inci” seharusnya 15 juta inci
    Disebutkan bahwa pemformatan teks sulit, tetapi untuk contoh PDF yang hanya berisi dua kata “Hello World”, cukup definisikan objek font, lalu di stream gunakan Tf untuk memakai font, Td untuk menentukan posisi, dan Tj untuk menulis teks

    • Aku memang menduga akan membuat kesalahan angka di suatu tempat, dan akan segera memperbaikinya
      Terima kasih juga untuk contoh teksnya; kelihatannya mirip dengan yang kucoba, tetapi pasti ada kesalahan di suatu tempat
    • Aku penasaran apakah xref di akhir PDF itu wajib
      Dari spesifikasinya, tampaknya memang diperlukan
    • Bisa bantu menghitung jumlah nol, kenapa “15,000,000,000.00 in” itu 15 juta dan bukan 15 miliar?
    • Kalau dibilang “jangan dicetak”, bagaimana kita tahu apakah bisa dilipat lebih dari 7 kali?
  • Pada titik ini rasanya ingin memparafrasakan Steven Wright
    “Saya punya peta Amerika Serikat. Ukurannya sebesar aslinya

    • Saya punya peta Amerika Serikat di ponsel, tapi petunjuk arahnya agak membingungkan
      Saya tidak tahu apakah bagian atas peta adalah arah saya bergerak atau utara; peta-peta lama dulu selalu menempatkan utara di atas, tetapi Google Maps sepertinya tidak begitu, jadi membingungkan
      Kalau saya berputar 90 derajat, petanya ikut berputar, tetapi saya juga bingung apakah yang berputar itu peta atau saya
      Kalau saya diam, peta tidak bisa tahu saya sedang menuju ke mana, jadi sepertinya saya harus bergerak dulu untuk mengetahui arah
      Kalau saya mengangkat smartphone di depan mata, bagian atas peta mengarah ke langit, dan saya juga tidak tahu apakah saya seharusnya melihat peta dari atas
      Saya penasaran apa kiat memakai Google Maps dengan baik di ponsel
    • Umberto Eco juga menulis tentang tema yang sama, “On the Impossibility of Drawing a Map of the Empire on a Scale of 1 to 1”
      https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...
    • Di antara lelucon terkait, saya selalu menyukai yang berbunyi, “Saya ingin menato seluruh tubuh saya dengan gambar diri saya sendiri. Tapi 2 inci lebih besar
      https://scomedy.com/quotes/10779
  • “Jangan dicetak” terdengar seperti kalimat yang siap menjadi bom cetak
    Terakhir kali saya memakai printer, membatalkan pekerjaan cetak di Windows hampir mustahil
    Masa ketika printer Wi-Fi masih terbuka atau keamanannya lemah itu menyenangkan

    • Membatalkan pekerjaan cetak di Windows masih saja mustahil
      Satu-satunya cara andal yang saya temukan adalah mematikan printer lalu menghapus pekerjaan cetak dari antrean
      Tidak bisa kalau printernya tidak persis di sebelah kita, dan saya tidak tahu kenapa ini begitu sulit
    • Cara yang sedikit lebih pasti adalah mencabut colokan printer dan melempar komputer ke luar jendela
    • Reaksi pertama saya begitu membaca “Jangan dicetak” adalah “Kamu bukan ibuku”
  • Sekitar 30 tahun lalu, dalam wawancara magang musim panas di Microsoft, pewawancara mengajukan pertanyaan yang sangat mirip tentang Excel
    Topik seperti ini selalu bagus untuk melihat rasa ingin tahu seseorang dan kemampuannya memecah potensi masalah