İçeriğe geç
getnextpdf.com

Fast Web View: bir PDF, indirmesi bitmeden nasıl açılır

Spec: ISO 32000-2, Annex F

Linearize edilmiş bir PDF, ilk sayfa ve küçük bir gezinme dizini dosyanın en başında yer alacak biçimde yeniden düzenlenir. Bu nedenle bir görüntüleyici, belgenin geri kalanı hâlâ gelirken birinci sayfayı çizebilir ve önce 2’den 146’ya kadar olan sayfaları okumadan doğrudan 147. sayfaya atlayabilir.

Bu, çoğu okuyucunun samimi adıyla bildiği özelliktir: Fast Web View.

Tek çubuk sinyalli bir telefonda 200 sayfalık bir raporu gözünüzde canlandırın. Linearization olmadan, görüntüleyicinin çoğu zaman bir şey çizebilmeden önce dosyanın en sonuna ihtiyacı olur; çünkü her nesnenin nerede yaşadığını söyleyen ana dizin geleneksel olarak arkada durur. Böylece yalnızca ilk sayfayı okumak için, iki yüz sayfa inerken bir döner simgeyi izlersiniz.

Linearization ile dosya, “birinci sayfada ne var” sorusunun yanıtı kablodan çıkan ilk şey olacak biçimde düzenlenir. Okuyucu birinci sayfayı bir saniyede boyar ve geri kalanı yalnızca siz kaydırdıkça ya da atladıkça getirir. Hızlı bir bağlantıda bunu hiç fark etmeyebilirsiniz. Yavaş ya da kotalı bir bağlantıda ise bu, kullanılabilir bir belge ile terk edilmiş bir sekme arasındaki farktır.

  • Linearize edilmiş bir dosya öne yüklenir: ilk sayfa ve bir ipucu tablosu, gövdenin geri kalanından önce, en başa yerleştirilir.
  • İpucu tablosu bir aralıklar haritasıdır. Görüntüleyiciye hangi byte aralıklarının her sayfaya ve paylaşılan nesnelere ait olduğunu söyler; böylece görüntüleyici sunucudan yalnızca o dilimleri isteyebilir — ardından cross-reference table her nesne numarasını tam ofsetine çözer.
  • Bu, byte-range isteklerine dayanır — görüntüleyicinin dosyanın tamamını değil, dilimlerini talep üzerine getirmesi.
  • Byte’lar, normal bir PDF ile içerik olarak özdeştir. Linearization, sayfaların kendisini değil, sırayı ve dizini değiştirir.
  • NextPDF’de bu, açık ve anahtarlanabilir tek bir adımdır — en iyisini uman bir bayrak değil, gerçek bir üç geçişli yeniden inşa ile üretilir.

Her şeyin tam olarak ne kadar büyük olduğunu kesin biçimde bilmeden bir sayfayı öne yükleyemezsiniz; çünkü ipucu tablosu byte ofsetlerini kaydeder ve bir ofset ancak her nesnenin uzunluğu kesinleştiğinde doğrudur. İşte bu döngüsellik — ofsetler boyutlara, boyutlar düzene bağlıdır — bir linearizer’ın tek bir süpürmeyle değil, geçişler hâlinde çalışmasının nedenidir.

NextPDF bunu, deterministik bir üç geçişli yeniden inşa ile çözer. İlk geçiş ölçer, ikincisi yerleşime karar verir, üçüncüsü artık bilinen ofsetler içine işlenmiş hâlde gerçek byte’ları yazar.

  1. MEASURESerialise every object once to learn its exact byte length. Offsets are circular — they depend on sizes — so sizes are pinned first.
  2. PLACEDecide the order: first page and its dependencies up front, then the rest. Reserve space for the linearization parameter dictionary and the hint table.
  3. FILLWrite the final bytes. Each reserved field is filled with values computed after MEASURE and PLACE — the first-page length, the hint-table location, the main cross-reference offset — derived from the measured sizes and the chosen placement.
The three-pass linearization rebuild. MEASURE sizes every object so lengths are final; PLACE decides the front-loaded order and reserves the hint-table region; FILL writes the real bytes with the now-known offsets, so the first page and the hint table land at the front and the cross-reference data resolves on first fetch.

Çıktı, ilk nesnesi olarak bir linearization parameter dictionary ve sayfaları indeksleyen bir veya daha fazla hint table taşır; tam olarak standardın öngördüğü gibi (Spec: ISO 32000-2, Annex F). Bu hint table’lar, geleneksel bir cross-reference table ile yan yana çalışır — bir görüntüleyicinin getirmesi gereken byte aralıklarını ve konumları kaydederler, oysa cross-reference table her nesne numarasını tam byte ofsetine eşleyen dizindir. NextPDF’nin linearizer’ı klasik tablo biçimini üretir ve bu sırada her türlü cross-reference akışını tahliye eder; böylece bir dilim geldiğinde okuyucu bir nesneyi ofsetiyle doğrudan o tablodan çözer (Spec: ISO 32000-2, §7.5.4).

Yararlı bir zihinsel model: normal bir PDF, içindekiler tablosu arka kapağa yapıştırılmış bir kitaptır. Linearize edilmiş bir PDF, o içindekiler sayfasını öne taşır ve sayfa başına bir sayfa-numarası dizini ekler; böylece herhangi bir sayfayı doğrudan açabilirsiniz. Bölümler değişmemiştir. Yalnızca gezinme yer değiştirmiştir.

Linearization, açık ve anahtarlanabilir bir adımdır. Siz onu istersiniz; motor yeniden inşayı gerçekleştirir ve bir Fast-Web-View dosyası üretir.

<?php
declare(strict_types=1);
use NextPDF\Core\Document;
use NextPDF\Contracts\OutputDestination;
$document = Document::createStandalone();
$document->setTitle('Annual Report');
for ($page = 1; $page <= 200; $page++) {
$document->addPage();
$document->setFont('helvetica', '', 12);
$document->cell(0, 12, "Page {$page}", newLine: true);
}
// Linearization is requested explicitly — an operability choice, not a default.
// enableLinearization() takes no arguments; it is the on-switch. The engine
// runs the MEASURE -> PLACE -> FILL rebuild and emits a Fast-Web-View file
// with the first page and hint table at the front.
$document->enableLinearization();
$bytes = $document->output(dest: OutputDestination::String);

Sayfa içeriği, tam olarak sizin yazdığınız şeydir. Fark, aldığınız byte’ların dosya sırasındadır ve artık üst tarafa yakın oturan ipucu tablosundadır.

Sonucu, bir yabancının yapacağı gibi doğrularsınız — harici bir denetleyiciyle:

$ qpdf --check-linearization report.pdf
report.pdf: no linearization errors

qpdf --check-linearization yalnızca bir bayrak aramaz. Dosyanın iddia ettiği ofsetleri yeniden türetir ve bunların doğru olduğunu teyit eder: ilk sayfa nesnelerinin gerçekten linearization sözlüğünün söylediği yerde olduğunu, ipucu tablosunun doğru byte’ları işaret ettiğini ve yapının Annex F’ye uyduğunu. Kendi düzeni hakkında yalan söyleyen bir dosya, bir bakışta linearize edilmiş gibi görünse bile bu denetimde başarısız olur.

Sık görülen varsayım, linearization’ın dosyayı sıkıştırdığı ya da indirmeyi genel olarak hızlandırdığıdır. İkisini de yapmaz. Linearize edilmiş bir dosya, ek ipucu tabloları taşıdığı için çoğu zaman birkaç byte daha büyüktür. Belgenin tamamı için toplam aktarım süresi esasen değişmez.

Değişen şey, ilk yararlı pikselin ne zaman göründüğüdür. Linearization, toplam byte’ı değil ilk-sayfaya-kadar-geçen-süreyi en iyiler. Bu bir sıkıştırma özelliği değil, bir gecikme özelliğidir. Birinci sayfayı erken akıtmak ile dosyayı hızlıca indirmek farklı hedeflerdir ve linearization ilkine hizmet eder.

İkinci bir yanlış kanı, herhangi bir web sunucusunun linearize edilmiş bir dosyayı akıtacağıdır. Görüntüleyicinin byte aralıklarını getirmesi gerekir; bu da sunucunun HTTP aralık isteklerini onurlandırması gerektiği anlamına gelir. Çoğu onurlandırır, ama her zaman dosyanın tamamını döndüren bir sunucu, Fast Web View’i yeniden yavaş, tüm-dosya beklemesine çevirir — dosya akıtılmaya hazırdır, ama taşıma katmanı değil.

NextPDF, linearize edilmiş dosyalar üretmek için tam çekirdek desteğe sahiptir: parametre sözlüğünü ve ipucu tablolarını üreten ve harici bir Annex F denetimini geçen, üretim düzeyinde bir üç geçişli linearizer.

Fast Web View (linearization) output — edition availability
EditionAvailability
Core

Full support. NextPDF produces linearized (Fast Web View) output through a production three-pass MEASURE → PLACE → FILL rebuild, conforming to ISO 32000-2 Annex F.

ProNot in this edition
EnterpriseNot in this edition

Adlandırmaya değer iki hudut vardır. Birincisi, linearization tek bir revizyonun bir özelliğidir. Bir artımlı güncelleme — bir imza, bir form doldurma, bir düzenleme — eklediğiniz an, eklenen byte’lar sona gider ve dosya, yeniden inşa edilene kadar artık tam anlamıyla linearize edilmiş değildir. Bu, bir kusur değil, normal bir ödünleşmedir; eklemenin imzalı belgeler için neden doğru davranış olduğunu görmek için artımlı güncellemeler sayfasına bakın.

İkincisi, motor dosyayı kontrol eder. Ağı kontrol etmez. Fast Web View, sözünü yalnızca sunucu bağlantısı byte-range isteklerini onurlandırdığında yerine getirir; byte’lar kusursuzca linearize edilmiş olabilir ve yine de, sunucu dosyanın tamamını göndermekte ısrar ederse tek bir yavaş yığın hâlinde gelebilir.

  • Bir PDF dosyasının anatomisi — linearization’ın yeniden düzenlediği başlık, gövde, cross-reference table ve trailer. Neyin yeniden sıralandığını görmek için önce bunu okuyun.
  • Bellek ve akış — farklı bir eksen olan yazma tarafı akış: NextPDF, byte’ları üretirken belleği nasıl düz tutar, bir okuyucunun onları nasıl akıttığına karşılık.
  • Artımlı güncellemeler ve neden önemli oldukları — sonraki bir düzenlemenin neden sona eklendiği ve bunun linearize edilmiş bir dosyanın öne yüklenmiş düzeni için ne anlama geldiği.
  • Akışlar ve filtreler — ipucu tablosunun işaret ettiği gövde nesnelerinin içinde ne yaşadığı ve nasıl sıkıştırıldıkları.
  • Linearization — bir görüntüleyicinin tüm dosya gelmeden önce çizebilmesi ve gezinebilmesi için ilk sayfayı ve bir gezinme dizinini öne yükleyen yeniden inşa. Sonucun standarttaki adı.
  • Fast Web View — linearize edilmiş bir PDF’nin tüketiciye dönük adı; iki terim de aynı dosyayı tanımlar.
  • Hint table — linearize edilmiş bir dosyanın içinde her sayfanın ve paylaşılan nesnelerin byte aralıklarını ve konumlarını kaydeden yapı; böylece bir görüntüleyici hangi dilimleri isteyeceğini bilir; cross-reference table ise bir nesne numarasını tam byte ofsetine eşleyen şeydir.
  • Linearization parameter dictionary — linearize edilmiş bir dosyadaki ilk nesne; talep üzerine getirmeyi olanaklı kılan anahtar ofsetleri (ilk-sayfa uzunluğu, hint-table konumu, ana cross-reference konumu) bildirir.
  • Byte-range request — bir dosyanın tamamı yerine bir diliminin istenmesine yönelik bir HTTP isteği; Fast Web View’in dayandığı taşıma mekanizması.
  • İlk-sayfaya-kadar-geçen-süre — bir okuyucunun birinci sayfayı görmesine kadar geçen süre. Linearization’ın en iyilediği gecikme; toplam indirme süresinden ayrıdır.