3 puan yazan GN⁺ 2024-02-01 | 1 yorum | WhatsApp'ta paylaş
  • İnternette dolaşan “PDF’nin azami boyutu 381 km × 381 km” iddiası, PDF biçiminin kendi sınırı değil, Adobe Acrobat 7.0’ın uygulama kısıtından kaynaklanıyor
  • PDF 1.6’dan itibaren /UserUnit ile temel birim olan 1/72 inç büyütülebiliyor ve Acrobat 7.0’daki azami 75,000 değeri 15,000,000 inç üst sınırını oluşturuyor
  • Elle oluşturulan bir PDF; %PDF-1.6, nesne listesi, xref, trailer, startxref, %%EOF bileşenlerinden oluşuyor ve sayfa boyutu /MediaBox ile /UserUnit birleşimiyle belirleniyor
  • Acrobat, /MediaBox için 14,400 ya da /UserUnit için 75,000 sınırı aşılmış olsa bile 15,000,000 inç gösteriyor; /UserUnit sınır aşımı ise uyarı vermeden yok sayılıyor
  • macOS Preview.app, /UserUnit değerini yok sayıyor ama /MediaBox için Acrobat benzeri bir üst sınır koymadığından, evrenden büyük bir PDF gibi görünen dosyalar da üretilebiliyor

381 km sınırı nereden çıktı?

  • PDF belgelerinin azami boyutunun 381 km × 381 km olduğu iddiası, uzun zamandır internette tekrar tekrar dolaşıyor
  • Bu sayı, PDF biçiminin sınırından değil, Adobe Acrobat’ın uygulama kısıtından geliyor
  • PDF 1.7 spesifikasyonuna göre sayfa boyutu sınırları şöyle özetlenebilir
    • PDF 1.6 öncesinde temel kullanıcı alanı birimi 1/72 inç olarak sabitti
    • Acrobat 5.0’dan sonra varsayılan azami sayfa boyutu 14,400 × 14,400 birim, yani 200 × 200 inç oldu
    • PDF 1.6 ile birlikte sayfa sözlüğündeki /UserUnit, temel kullanıcı alanı biriminin boyutunu ayarlayabilir hale geldi
    • Acrobat 7.0, /UserUnit için azami 75,000 değerini destekleyerek 15,000,000 inç azami sayfa ölçüsüne ulaşabiliyor
  • 15,000,000 inç yaklaşık 381 km ediyor; dolayısıyla “PDF version 7” ifadesi, PDF sürümünden değil Adobe Acrobat 7.0’dan geliyor gibi görünüyor

Elle yapılan bir PDF’nin temel yapısı

  • PDF dosyası, başta bir sürüm numarası ve sonda EOF işareti içerir
    • Örnek: %PDF-1.6
    • Bitiş işareti: %%EOF
  • Sürüm numarasından sonra sayfa, metin, grafik vb. öğeleri temsil eden nesne listesi gelir
  • xref, nesnelerin konumunu gösteren çapraz başvuru tablosudur
    • PDF okuyucu, her nesnenin dosya başlangıcından kaç bayt uzakta olduğunu buradan bulur
  • trailer, belgenin genel metaverisini içerir
    • sayfa sayısı
    • şifreleme durumu
    • belgenin kök nesnesi
  • startxref, xref tablosunun başlangıç konumunu gösterir
    • PDF okuyucu dosyanın sonundan startxref değerini bulup xref tablosuna gider
  • Basit bir PDF dosyası oluşturma yazısı referans alınarak kırmızı dikdörtgen içeren bir PDF elle yapılabiliyor

Nesneler ve sayfa tanımı

  • Örnek PDF, dört temel nesneden oluşuyor
    • Nesne 1: kırmızı bir dikdörtgen çizen stream nesnesi
    • Nesne 2: tek bir sayfayı tanımlayan Page nesnesi
    • Nesne 3: birden çok sayfa bilgisini tutan Pages nesnesi
    • Nesne 4: belgenin ana yapısını sağlayan Catalog nesnesi
  • Page nesnesi, sayfa içeriğini başka nesnelere referans vererek bağlar
    • 1 0 R, nesne numarası 1 ve jenerasyon numarası 0 olan nesneyi gösterir
    • 3 0 R, sayfa kümesini tutan Pages nesnesini gösterir
  • PDF’yi elle yazarken nesne konumları her değiştiğinde xref tablosundaki değerleri de yeniden ayarlamak gerektiği için bu süreç oldukça zahmetlidir
  • 16 Nisan 2025 güncellemesinde örnek koddaki xref 0 4 değeri hatalı olduğu için düzeltildi
    • Gerçek çapraz başvuru tablosunda 5 kayıt bulunduğundan doğru değer xref 0 5

/MediaBox ve /UserUnit ile sayfayı büyütmek

  • PDF’de sayfa boyutu, her Page nesnesinde ayarlanır
  • /MediaBox [0 0 300 300], genişliği ve yüksekliği 300 birim olan bir sayfa oluşturur
    • varsayılan birim 1/72 inçtir
    • 300 birim yaklaşık 4,17 inç eder
  • /MediaBox değeri 600 600 yapılırsa Acrobat sayfayı 8.33 x 8.33 in olarak gösterir
  • Acrobat’ın izin verdiği azami /MediaBox değeri 14400 14400, 200 × 200 inç olarak gösterilir
    • bu değer aşılırsa Acrobat uyarı verir
  • /UserUnit eklendiğinde temel kullanıcı alanı birimi büyütülebilir
    • /UserUnit 2, sayfanın her iki boyutunu iki katına çıkarır
    • /MediaBox [0 0 14400 14400] ile /UserUnit 2 birlikte kullanılırsa Acrobat bunu 400.00 x 400.00 in olarak gösterir
  • /UserUnit 75000 uygulandığında Acrobat sayfayı 15,000,000.00 × 15,000,000.00 inç olarak gösterir
    • bu da yaklaşık 381 km × 381 km’dir ve ilk iddiayla örtüşür
    • örnek dosya: biggest.pdf

Acrobat ve Preview arasındaki işleme farkı

  • Acrobat, /MediaBox ya da /UserUnit daha büyük ayarlansa bile sayfa boyutunu 15,000,000 inç olarak göstermeye devam eder
  • /UserUnit değeri 75000 üzerine çıkarılırsa, herhangi bir uyarı ya da hata olmadan değer sınırlandırılır
  • /UserUnit, pratikte çok yaygın kullanılan bir özellik gibi görünmüyor
  • macOS Preview.app, /UserUnit desteği sunmuyor
    • tüm PDF’leri varsayılan 1/72 inç birimiyle işliyor
  • Buna karşılık Preview.app, Acrobat’tan farklı olarak /MediaBox için katı bir üst sınır koymuyor
    • 1 rakamının ardından 12 sıfır gelen bir genişliği bile kabul ediyor
    • bu genişlik kabaca Dünya ile Ay arasındaki mesafe düzeyinde
  • Daha da büyük /MediaBox değerleri verilirse, Preview’ın yaklaşık 37 trilyon ışık yılı kare boyutunda bir PDF gibi gösterdiği dosyalar üretmek de mümkün
    • örnek dosya: universe.pdf
    • belgenin büyük bölümü boş alandan oluşuyor ve yazdırılmaması yönünde bir uyarı içeriyor

1 yorum

 
GN⁺ 2024-02-01
Hacker News yorumları
  • PDF, teknik olarak pek çok açıdan korkunç olsa da, elimde saklayabileceğim kendi kendine yeterli statik bir dosya olması; her an ortadan kaybolabilecek, kullanıcı düşmanı dinamik/SaaS web sitelerine kıyasla harika bir özellik.
    PDF/A gerçek PDF’ye daha yakın ve tehlikeli ıvır zıvırın çoğunu ortadan kaldırıyor.
    Garip PDF numaralarını seviyorsanız, hem PDF/A hem CSV hem de Amiga soundtracker mod soundtrack’i olan bir polyglot dosya var: https://www.lab6.com/6

    • Amazon hesabınızdan kitapları geri almaya başladığında elimde saklamak kısmı önem kazanıyor.
      https://www.nytimes.com/2009/07/18/technology/companies/18am...
    • PDF çalıştırılabilir bir dosyadır.
      Birçok kişi JavaScript çalıştırılmasından endişe ederken PDF dosyalarını pek sorun etmeden kullanıyor.
    • Yakın zamana kadar bir dosyanın gerçekten PDF/A olup olmadığını kolayca kontrol etmenin bir yolu yoktu; artık veraPDF var ama oldukça karmaşık bir yazılım.
      Rastgele bir PDF’yi açık kaynak yazılımla PDF/A’ya dönüştürmek için tek yol Ghostscript ile PostScript’e gidip geri dönmek gibi görünüyor; Ghostscript ise Affero lisanslı olduğundan beraberinde çeşitli sorunlar getirebilir.
      Eski GPL sürümü de var ve çoğu PDF’de çalışıyor, ama yaklaşık 15 yıllık bir şey.
      Önceki iş yerimde PDF/A ile uğraşmam gerekmişti; hiç keyifli değildi.
    • Çeşitli kaynaklardan gelen milyonlarca PDF’yi parse eden bir projede yaşadığım acılar yüzünden “PDF harika bir formattır” sözünü affetmek zor.
      Sadece paragrafları yeniden kurmak bile büyük çaba gerektiriyordu; tablo parse etmeyi ise hiç söylemiyorum.
      Fiili standart sayılmasına rağmen daha iyi olmalı; PDF kılavuzu da gerçekten çok kötü.
    • Grafik sektöründe çalışan biri olarak gerçek PDF’nin PDF/X olduğunu düşünüyorum.
  • Karşılaştırma için PNG’yi incelersek, maksimum genişlik ve yükseklik 2147483647, yani 2^31 - 1.
    pHYs chunk’ı ile belirtilebilen en düşük yoğunluk metre başına 1 piksel olduğundan, 2 milyar metre Güneş’in 1,39 gigametrelik çapından büyüktür: https://en.wikipedia.org/wiki/Orders_of_magnitude_(length)#g...
    sCAL chunk’ı ASCII kayan nokta kullandığı için çok daha büyük fiziksel boyutları da ifade edebilir.

    • sCAL, görüntünün kendisinden çok görüntünün temsil ettiği nesnenin boyutuyla ilgilidir.
      1:10.000.000 ölçekli bir dünya haritası pHYs’e göre 10 m’den daha dar olurken, sCAL’e göre yaklaşık 40.000 km genişliğinde olur.
  • PDF genişliğini kilometre cinsinden ölçmeye başladığınız anda iyi bir teknik yazı okuduğunuzu anlarsınız.

    • microSD kart çok küçük bir alana milyonlarca mili sığdırabilir.
  • 10 yıldan da fazla önce Game of Life’ın PostScript uygulamasıyla yaptığım PDF aklıma geldi.
    Hâlâ çalışıyor gibi görünüyor ama macOS Preview’ı çökertiyor: https://andrewcutler.net/docs/joke/life.pdf

    • Sonoma’da Preview çökmüyor.
      Ancak animasyon görünmüyor, yalnızca son durum gösteriliyor; Firefox’un PDF görüntüleyicisinde ise biraz animasyon görünüyor.
      Skim de Preview’a benziyor ama ızgarayı göstermiyor.
    • Monterey’de Mac OS’te çökmüyor; yalnızca statik bir Game of Life render’ı görünüyor.
  • Bu yazı Umberto Eco’nun entelektüel oyunlarını hatırlatıyor.
    Özellikle “On the Impossibility of Drawing a Map of the Empire on a Scale of 1 to 1” aklıma geldi: https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...

  • Preview’da MediaBox’a konabilecek değer için Acrobat’takinden farklı olarak bir üst sınır yok; 1’in yanına 12 sıfır eklenmiş bir genişliği bile kabul ediyor.
    Belge denetleyicisinde sayfa boyutu 352777777777.78 x 10.59 cm olarak görünüyor; bu genişlik kabaca Dünya ile Ay arasındaki mesafe kadar.
    Güneş sistemindeki tüm gezegenleri yan yana koysanız bile bu belgenin içine rahatça sığar.

    • Hesaplayınca bu belge yaklaşık 373 km² ediyor; yani Almanya’dan çok daha küçük.
      Sonuçta bir cetvel gerekiyormuş.
    • Bir tane 7 fazla.
      352777777777.78 cm, 3.527.777,7777778 km eder.
    • Boş alan değil de gerçek içerikle doldurulsa böyle bir PDF’nin dosya boyutunun ne kadar olacağını merak ediyorum.
  • Eğlenceli bir deney, alexwlchan.
    Yazıda iki küçük hata var: “15,000,000,000.00 in” ve “sayfa boyutu 15 milyar inç” dediğin yerler aslında 15 milyon inç olmalı.
    Metin biçimlendirmesinin zor olduğunu söylemişsin; yalnızca “Hello World” iki kelimesini içeren PDF örneği için font nesnesi tanımlayıp, stream içinde Tf ile fontu kullanıp Td ile konumu belirleyip Tj ile metni yazman yeterli.

    • Bir yerde sayı hatası yapacağımı biliyordum; yakında düzelteceğim.
      Metin örneği için de teşekkürler; denediğim şeye benziyor ama bir yerde hata yaptığım kesin.
    • PDF sonundaki xref’in zorunlu olup olmadığını merak ediyorum.
      Spesifikasyona göre gerekli gibi görünüyor.
    • “15,000,000,000.00 in”in neden 15 milyar değil de 15 milyon olduğunu anlamak için sıfırları saymama yardım edebilir misin?
    • “Yazdırmayın” derseniz, 7 defadan daha fazla katlanıp katlanamayacağını nasıl bileceğiz?
  • Bu noktada Steven Wright’ın sözünü uyarlamak geliyor içimden
    “Elimde Amerika Birleşik Devletleri’nin bir haritası var. Gerçek boyutta

    • Telefonumda ABD haritası var ama yol tarifi biraz kafa karıştırıyor
      Haritanın üst tarafı hareket ettiğim yön mü, kuzey mi bilmiyorum; eski haritalarda kuzey hep üstte olurdu ama Google Maps’te öyle değilmiş gibi göründüğü için kafam karışıyor
      90 derece dönünce harita da dönüyor; dönen harita mı ben miyim, o da karışıyor
      Durduğumda harita nereye gittiğimi bilemeyeceği için, yönü anlamak adına önce hareket etmem gerekiyormuş gibi geliyor
      Akıllı telefonu gözümün önünde tuttuğumda haritanın üst tarafı gökyüzüne bakıyor; haritaya yukarıdan aşağı mı bakmam gerektiğini de bilmiyorum
      Telefonda Google Maps’i iyi kullanmanın püf noktalarını merak ediyorum
    • Umberto Eco da aynı konu üzerine “On the Impossibility of Drawing a Map of the Empire on a Scale of 1 to 1”i yazmıştı
      https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...
    • İlgili şakalardan “Tüm vücuduma kendimin dövmesini yaptırmak istiyorum. Ama 2 inç daha büyük” olanını hep sevmişimdir
      https://scomedy.com/quotes/10779
  • “Yazdırmayın” sözü, print bomb olmaya hazır bir ifade gibi geliyor
    En son yazıcı kullandığımda Windows’ta yazdırma işini iptal etmek neredeyse imkânsızdı
    Wi-Fi yazıcıların açık olduğu ya da güvenliğinin zayıf olduğu dönemler eğlenceliydi

    • Windows’ta yazdırma işini iptal etmek hâlâ imkânsız
      Bulduğum tek güvenilir yöntem yazıcıyı kapatıp kuyruktaki yazdırma işini silmek
      Yazıcı hemen yanınızda değilse olmuyor; bunun neden bu kadar zor olduğunu anlamıyorum
    • Biraz daha kesin yöntem, yazıcının fişini çekip bilgisayarı pencereden dışarı atmaktır
    • “Yazdırmayın”ı okur okumaz ilk tepkim “Sen benim annem değilsin ki” oldu
  • Yaklaşık 30 yıl önce Microsoft yaz stajı mülakatında, görüşmeci Excel üzerinden buna çok benzer bir soru sormuştu
    Bu tür konular, bir insanın merakını ve olası sorunları parçalara ayırma becerisini görmek için her zaman iyi bir malzeme