Bir PDF dosyasının anatomisi
Bir bakışta
“Bir bakışta” başlıklı bölümHerhangi bir PDF’yi düz bir metin düzenleyicide açın; ilk gördüğünüz şey güven vericidir:
bir %PDF-1.x ya da %PDF-2.0 başlığı. Son gördüğünüz şey %%EOF’tur.
Bu iki satır arasındaki her şey, nesneleri numarayla bulmaya yarayan düzenli, küçük bir makinedir.
Bu sayfa bir incelemedir. Dosyayı açıyor, her organına ad veriyor ve
bunların nasıl bağlandığını gösteriyoruz.
Bu, iki komşusunun yapısal tamamlayıcısıdır. PDF aslında nedir dosyayı bir nesne çizgesi olarak ele alır; artımlı güncellemeler dosyanın zaman içinde nasıl büyüdüğünü kapsar. Bu sayfa baytlara yakın durur — bir ayrıştırıcının üzerinde yürüdüğü fiziksel bölgeler, diskte durdukları sırayla.
Bunun önemi nedir
“Bunun önemi nedir” başlıklı bölümBir PDF’yi kullanmak için buna neredeyse hiç ihtiyacınız olmaz. Buna, bir tanesi ters gittiği gün ihtiyaç duyarsınız. Bir dosya bir görüntüleyicide açılırken bir başkasında açılmaz; bir doğrulayıcı “hasarlı çapraz başvuru tablosu” bildirir; imzalı bir belge birden doğrulanamaz olur. Anatomiyi okuyabildiğinizde bunların hiçbiri gizem değildir. Bunlar, artık bir konumla eşleşmeyen bir sayı, yanlış yerdeki bir bölge ya da hiçbir şeyi göstermeyen bir kuyruktur.
Düzeni bilmek, “PDF bozuk” ifadesini, üzerinde harekete geçebileceğiniz bir tanıya dönüştürür. Bu, bir kara kutuya omuz silkmek ile yalan söyleyen tam baytı işaret etmek arasındaki farktır.
Kısa özet
“Kısa özet” başlıklı bölümUyumlu bir PDF, şu dosya sırasıyla dört fiziksel bölümden oluşur (Spec: ISO 32000-2, §7.5.1ISO 32000-2 §7.5.1):
- Bir başlık — tek satır,
%PDF-2.0, sürümü belirtir. - Bir gövde — dosyanın büyük kısmı: numaralandırılmış dolaylı nesnelerden oluşan bir dizi.
- Bir çapraz başvuru bölümü — nesne numarasından, o nesnenin bulunduğu bayt uzaklığına giden bir dizin. Klasik PDF’ler bir metin tablosu kullanır; PDF 2.0 sıkıştırılmış bir xref akışı kullanır.
- Bir treyler — giriş noktasını belirten küçük bir sözlük; ardından
startxref, bir uzaklık ve%%EOFgelir.
İşin can alıcı yanı şu: bir okuyucu en üstten başlamaz. En alttan başlar,
dizini bulmak için startxref ifadesini okur ve o dizini kullanarak herhangi bir nesneye
doğrudan ulaşır. Dosya önden arkaya yazılır ama arkadan öne okunur.
NextPDF bu işe nasıl yaklaşır
“NextPDF bu işe nasıl yaklaşır” başlıklı bölümDört bölgeyi sırayla, baytlar önümüzdeyken gezelim.
Başlık tek satırdır. NextPDF %PDF-2.0 yazar ve geleneksel olarak yüksek bitli
baytlardan oluşan ikinci bir yorum satırı ekler; böylece basit aktarım araçları dosyayı
metin değil, ikili olarak işler. O ikinci satır, bir PDF düz metin olarak açıldığında
sürümün hemen ardından küçük bir karmaşa görünmesinin nedenidir.
Gövde, belgenin yaşadığı yerdir. Her dolaylı nesne bir numara,
bir üretim, obj anahtar sözcüğü, bir değer ve endobj’tan oluşur
(Spec: ISO 32000-2, §7.3.10ISO 32000-2 §7.3.10). Değer, birkaç biçimden biridir
— ancak yükün neredeyse tamamını ikisi taşır:
- Bir sözlük,
<< /Key value … >>, adlardan değerlere giden bir eşlemedir. Sayfa ağacı, katalog, font tanımlayıcıları: hepsi sözlüktür. - Bir akış, bir sözlüğün ardından
stream, keyfi baytlardan oluşan bir blok veendstream’dir. Sayfa içeriği, gömülü fontlar ve görüntüler birer akıştır, neredeyse her zaman sıkıştırılmış. (Filtreleri kendi başına bir hikâyedir, akışlar ve filtreler sayfasında anlatılır.)
Nesneler birbirini dolaylı başvuru yoluyla gösterir — 2 0 R, “2 numaralı nesne,
0 üretim” anlamına gelir. Düz bir nesne listesini bir çizgeye dönüştüren kablolama
işte budur.
Çapraz başvuru bölümü, çoğu insanın doğru biçimde hayal edemediği kısımdır.
Klasik biçimde düz metindir: xref anahtar sözcüğü, ardından sabit
genişlikli 20 baytlık satırlardan oluşan alt bölümler (Spec: ISO 32000-2, §7.5.4ISO 32000-2 §7.5.4). Her satır, on basamaklı bir bayt uzaklığı, beş basamaklı bir
üretim ve tek bir bayrak — kullanımda için n, serbest için f — içerir ve tam
yirmi bayta doldurulur; böylece bir okuyucu yalnızca aritmetikle herhangi bir girdiye
gidebilir. PDF 2.0 bunu bir çapraz başvuru akışı ile değiştirir: aynı dizin, ancak
/Type /XRef olarak işaretlenmiş bir akış nesnesinin içinde ikili ve sıkıştırılmış
(Spec: ISO 32000-2, §7.5.8ISO 32000-2 §7.5.8). Daha küçük ve nesne akışlarının
içine paketlenmiş nesneleri tanımlayabilir.
Treyler, dosyanın içindekiler tablosudur (Spec: ISO
32000-2, §7.5.5ISO
32000-2 §7.5.5). /Root ögesini — belge kataloğunu, geri kalan her şeyin
asıldığı tek nesneyi — ve nesne sayısı olan /Size ögesini belirtir. Ardından, geriye
doğru okumayı mümkün kılan tokalaşma gelir:
startxref, kendi satırında bir bayt uzaklığı ve %%EOF. Bir okuyucu dosyanın
sonuna gider, o uzaklığı okur, doğrudan çapraz başvuru bölümüne atlar ve yola
koyulur.
- HeaderOne line, %PDF-2.0, naming the version. A binary-marker comment usually follows.
- BodyNumbered indirect objects — dictionaries and streams — referenced by N G R.
- Cross-reference sectionA text table of 20-byte entries, or a compressed /Type /XRef stream in PDF 2.0.
- TrailerNames /Root and /Size, then startxref + offset + %%EOF.
- Read orderA reader starts at %%EOF, follows startxref to the index, then reaches each object directly.
Uzun ömürlü bir dosyanın büyüttüğü beşinci bir bölge vardır: bir artımlı güncelleme.
Bir değişiklik yerinde yazılmaz. Değişen nesneler, taze bir çapraz başvuru
bölümü ve yeni bir treyler, ilk %%EOF’tan sonra eklenir ve o
yeni treyler /Prev ögesini — önceki çapraz başvuru bölümünün uzaklığını —
taşır (Spec: ISO 32000-2, §7.5.6ISO 32000-2 §7.5.6). Bölümler geriye
doğru bir zincir oluşturur; herhangi bir nesne numarası için en yeni girdi kazanır.
Özgün baytlar hiç yerinden oynamadığı için, bir imzanın gerçekten kapsadığı bayt
aralığı üzerindeki kriptografik denetim bir güncellemeden sonra da geçerli kalır.
Sonraki bir artımlı güncelleme, bir doğrulayıcının belgenin bütünü hakkında
bildirdiklerini — imza sonrası değişikliklere izin verilip verilmediğini ve
imzanın neyi onayladığının kabul edildiğini — hâlâ değiştirebilir; ancak imzalı
baytların kendisini değiştiremez. Bu özellik, tümüyle artımlı
güncellemeler sayfasının konusudur.
Pratik örnek
“Pratik örnek” başlıklı bölümİşte bütün anatomi, en küçük bir dosyada. xref altındaki sayılar
bayt uzaklıklarıdır ve tam olarak doğru olmaları gerekir — bir nesnenin başladığı
yerden bir karakter ötesini gösterin, katı bir okuyucu pes eder.
%PDF-2.01 0 obj<< /Type /Catalog /Pages 2 0 R >>endobj2 0 obj<< /Type /Pages /Kids [3 0 R] /Count 1 >>endobj3 0 obj<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] >>endobjxref0 40000000000 65535 f0000000009 00000 n0000000058 00000 n0000000115 00000 ntrailer<< /Size 4 /Root 1 0 R >>startxref186%%EOFOnu bir ayrıştırıcının okuduğu gibi okuyun. Son satır: %%EOF. Üstündeki: startxref 186,
yani 186. bayta gidin; orada xref başlar. Tablo, 1 numaralı nesnenin
9. baytta yaşadığını söyler. Treylerin /Root 1 0 R ögesi oraya — kataloğa — işaret eder ve
katalogdan /Pages ögesini izleyerek sayfa ağacına gider ve tek sayfayı bulursunuz. 0 numaralı nesne
her zaman 65535 üretimine sahip serbest liste başıdır; biçimin ilk tasarımından kalma,
her okuyucunun hâlâ görmeyi beklediği bir fosildir.
Yaygın yanlış anlama
“Yaygın yanlış anlama” başlıklı bölümTuzak, bir PDF’yi bir öykü gibi okumaktır — yukarıdan aşağıya, sırayla. Bir
öykü değildir; geriye doğru işaret eden bir dizindir. Nesne numaralarının dosyada
ardışık olması gerekmez, nesneler herhangi bir fiziksel sırada görünebilir ve bir okuyucu
asla konumlarına güvenmez. Tek yetkili harita,
çapraz başvuru bölümüdür ve o haritayı bulmanın tek yolu, dosyanın en
sonundaki startxref uzaklığıdır.
Sonucu insanları şaşırtır. Kusursuz bir gövdeye ve startxref içinde tek bir yanlış
basamağa sahip bir PDF okunamaz — okuyucu dizini bulamaz. Nesneleri
karışık sırada ama çapraz başvuru bölümü doğru olan bir PDF
ise sorunsuzdur. Fiziksel konum hiçbir anlam taşımaz. Kaydedilmiş konum
her şeyi taşır.
Sınırlar ve kapsam
“Sınırlar ve kapsam” başlıklı bölümBu sayfa fiziksel yapıyı anlatır, sayfa içeriğini değil. İşaretlerin bir sayfaya nasıl
indiği — içerik akışı işleçleri, metin gösterimi, grafik durumu — ayrı bir
konudur. Ayrıca iyi biçimli bir dosyayı anlatır. Gerçek dünyadaki PDF’ler
çoğunlukla biraz bozuktur ve yalnızca, hoşgörülü görüntüleyiciler obj anahtar
sözcüklerini tarayarak çapraz başvuru tablosunu yeniden kurduğu için ayakta kalır. O kurtarma,
bir görüntüleyici davranışıdır, biçimin garanti ettiği bir şey değil.
| Edition | Availability |
|---|---|
| Core | NextPDF bir yazıcıdır. Her uzaklığı, her nesne yazıldığı anda çıkış arabelleğinden kaydeder; böylece ürettiği dosyaların çapraz başvuru bölümü, kuruluş gereği gövdeyle eşleşir. |
| Pro | NextPDF’in yazmadığı bir dosyadaki hasarlı bir çapraz başvuru tablosunu ayrıştırmak, yeniden kurmak ya da onarmak her sürümde kapsam dışıdır. |
| Enterprise | Var olan bir dosyanın yapısını incelemek için, ona özel bir ayrıştırıcı ya da doğrulayıcı kullanın; NextPDF, yazdığı şey için doğruluk garanti eder, okuduğu şey için değil. |
Mini SSS
“Mini SSS” başlıklı bölümBir PDF’nin başlıktan sonra neden bir ikili-işaretçi satırı vardır? Bazı eski aktarım araçları, düz metin sandıkları bir dosyayı bozardı. Yüksek bitli yorum, dosyayı kesinkes ikili gösterir; böylece yolculuktan değişmeden çıkar.
Xref akışı yalnızca daha küçük bir tablo mudur? Çoğunlukla öyle, fakat bir ek gücü vardır. Sıkıştırılmış olmasının ötesinde, bir xref akışı nesne akışlarının içinde depolanan nesneleri tanımlayabilir — klasik 20 baytlık metin tablosunun ifade edemeyeceği girdileri.
Tek bir dosyada hem bir tablo hem bir akış bulundurabilir miyim? Tek bir revizyon, birini ya da ötekini kullanır. Ancak melez bir dosya, eski okuyucular için klasik bir tabloyu, yeni okuyucular için bir çapraz başvuru akışıyla eşleştirebilir; böylece her tür okuyucu anladığı bir dizin bulur.
İlgili belgeler
“İlgili belgeler” başlıklı bölüm- PDF aslında nedir — aynı dört bölüm, fiziksel bir düzen yerine bir nesne çizgesi olarak görülür.
- Artımlı güncellemeler ve neden önemli oldukları — eklenen beşinci bölgenin bir dosyayı nasıl büyüttüğü ve imzaları nasıl koruduğu.
- Akışlar ve filtreler — gövdenin akış nesnelerinin içinde ne olduğu ve nasıl sıkıştırıldıkları.
- PDF 2.0: neler değişti — çapraz başvuru akışının neden NextPDF’in yazdığı varsayılan yapı olduğu.
Sözlük
“Sözlük” başlıklı bölüm- Başlık — ilk satır,
%PDF-2.0, sürümü belirtir; genellikle ardından bir ikili-işaretçi yorumu gelir. - Dolaylı nesne — gövdedeki numaralandırılmış bir nesne;
N G obj … endobjbiçiminde yazılır; buradaNnesne numarası,Gise üretimdir. - Sözlük — adlardan değerlere giden bir
<< /Key value … >>eşlemesi; en yaygın nesne biçimi. - Akış — bir sözlük artı
streamileendstreamarasındaki bir bayt bloğu; içerik, font ve görüntüler için kullanılır. - Çapraz başvuru tablosu (xref) — nesne numarasından bayt uzaklığına giden
dizin; klasik olarak girdi başına 20 baytlık bir metin tablosu, PDF 2.0’da
bir
/Type /XRefakışı. - Treyler —
/Rootve/Sizeögelerini belirten sözlük; dosyanın sonundakistartxrefuzaklığı aracılığıyla bulunur. - Artımlı güncelleme —
%%EOF’tan sonra eklenen değişmiş nesneler, yeni bir çapraz başvuru bölümü ve yeni bir treyler;/Prevögesi önceki bölüme geriye doğru zincirlenir.