Almanya’dan büyük PDF üretmek
(alexwlchan.net)- İ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
/UserUnitile temel birim olan 1/72 inç büyütülebiliyor ve Acrobat 7.0’daki azami75,000değeri15,000,000 inçüst sınırını oluşturuyor - Elle oluşturulan bir PDF;
%PDF-1.6, nesne listesi,xref,trailer,startxref,%%EOFbileşenlerinden oluşuyor ve sayfa boyutu/MediaBoxile/UserUnitbirleşimiyle belirleniyor - Acrobat,
/MediaBoxiçin 14,400 ya da/UserUnitiçin 75,000 sınırı aşılmış olsa bile 15,000,000 inç gösteriyor;/UserUnitsınır aşımı ise uyarı vermeden yok sayılıyor - macOS Preview.app,
/UserUnitdeğerini yok sayıyor ama/MediaBoxiç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,400birim, 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,
/UserUnitiçin azami75,000değ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
- Örnek:
- 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,xreftablosunun başlangıç konumunu gösterir- PDF okuyucu dosyanın sonundan
startxrefdeğerini bulupxreftablosuna gider
- PDF okuyucu dosyanın sonundan
- 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
Pagenesnesi - Nesne 3: birden çok sayfa bilgisini tutan
Pagesnesnesi - Nesne 4: belgenin ana yapısını sağlayan
Catalognesnesi
Pagenesnesi, sayfa içeriğini başka nesnelere referans vererek bağlar1 0 R, nesne numarası 1 ve jenerasyon numarası 0 olan nesneyi gösterir3 0 R, sayfa kümesini tutanPagesnesnesini gösterir
- PDF’yi elle yazarken nesne konumları her değiştiğinde
xreftablosundaki değerleri de yeniden ayarlamak gerektiği için bu süreç oldukça zahmetlidir - 16 Nisan 2025 güncellemesinde örnek koddaki
xref 0 4değ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
- Gerçek çapraz başvuru tablosunda 5 kayıt bulunduğundan doğru değer
/MediaBox ve /UserUnit ile sayfayı büyütmek
- PDF’de sayfa boyutu, her
Pagenesnesinde 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
/MediaBoxdeğeri600 600yapılırsa Acrobat sayfayı8.33 x 8.33 inolarak gösterir- Acrobat’ın izin verdiği azami
/MediaBoxdeğeri14400 14400, 200 × 200 inç olarak gösterilir- bu değer aşılırsa Acrobat uyarı verir
/UserUniteklendiğ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 2birlikte kullanılırsa Acrobat bunu400.00 x 400.00 inolarak gösterir
/UserUnit 75000uygulandığı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,
/MediaBoxya da/UserUnitdaha büyük ayarlansa bile sayfa boyutunu 15,000,000 inç olarak göstermeye devam eder /UserUnitdeğeri75000ü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- Stack Overflow yanıtı da bu değerin yaygın kullanılmadığını söylüyor
- çevrimiçi örnek bulmak zordu
- macOS Preview.app,
/UserUnitdesteği sunmuyor- tüm PDF’leri varsayılan 1/72 inç birimiyle işliyor
- Buna karşılık Preview.app, Acrobat’tan farklı olarak
/MediaBoxiçin katı bir üst sınır koymuyor1rakamı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
/MediaBoxdeğ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
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
https://www.nytimes.com/2009/07/18/technology/companies/18am...
Birçok kişi JavaScript çalıştırılmasından endişe ederken PDF dosyalarını pek sorun etmeden kullanıyor.
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.
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ü.
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.
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.
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
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.
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...
https://en.wikipedia.org/wiki/On_Exactitude_in_Science
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.
Sonuçta bir cetvel gerekiyormuş.
352777777777.78 cm, 3.527.777,7777778 km eder.
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
Tfile fontu kullanıpTdile konumu belirleyipTjile metni yazman yeterli.Metin örneği için de teşekkürler; denediğim şeye benziyor ama bir yerde hata yaptığım kesin.
Spesifikasyona göre gerekli gibi görünüyor.
Bu noktada Steven Wright’ın sözünü uyarlamak geliyor içimden
“Elimde Amerika Birleşik Devletleri’nin bir haritası var. Gerçek boyutta”
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
https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...
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
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
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