Postavite skenirano izvješće od 80 MB iza poveznice, otvorite ga u pregledniku i gledajte što se događa: preglednik prikazuje prazan prozor sve dok ne stigne većina tih bajtova, a zatim odjednom iscrta prvu stranicu. Skočite na stranicu 40 i, na loše izrađenoj datoteci, cijelo preuzimanje može početi ispočetka. Frustrirajući dio je taj što je čitatelj želio samo prvu stranicu. Linearizacija je strukturni odgovor na taj problem. Ona reorganizira PDF tako da preglednik može iscrtati početnu stranicu iz malog uvodnog dijela datoteke i dohvatiti ostatak na zahtjev, zbog čega Adobe ovu značajku plasira pod nazivom 'Fast Web View'
Ništa od ovoga nije drugačiji format datoteke. Linearizirani PDF je običan PDF koji će usklađeni preglednik otvoriti bez ikakvog posebnog rukovanja. Trik je u potpunosti u tome kako su bajtovi raspoređeni i u dvije dodatne strukture koje datoteka nosi. Norma ISO 32000-1 specificira cijeli ovaj raspored u Aneksu F, a kada jednom vidite taj izgled, ponašanje prestaje izgledati kao magija i počinje izgledati kao namjerna razmjena redoslijeda datoteke za brže iscrtavanje prve stranice
Što linearizacija zapravo preraspoređuje
Uobičajeni PDF može raspršiti svoje objekte u gotovo bilo kojem redoslijedu. Tablica unakrsnih referenci (xref) na kraju datoteke je ono što to omogućuje: preglednik traži kraj datoteke, čita pokazivač startxref, učitava xref i odatle može locirati svaki objekt prema njegovom pomaku. Taj je dizajn izvrstan za lokalne datoteke, gdje traženje kraja ne košta ništa, a loš za datoteku koja se strujno prenosi (streamuje) preko mreže, gdje je kraj upravo onaj dio koji stiže zadnji. Za renderiranje prve stranice, konvencionalni preglednik treba objekt stranice, njegov tok sadržaja, fontove na koje upućuje i sve slike koje crta, a u neuređenoj datoteci oni mogu sjediti bilo gdje, uključujući i posljednji megabajt
Linearizacija popravlja redoslijed. Objekti potrebni za prikaz prve stranice okupljeni su u neprekinuti blok blizu početka datoteke, odmah nakon kratkog zaglavlja, tako da stižu rano u toku bajtova. Sve ostalo – preostale stranice i resursi koje dijele – slijedi u predvidljivom slijedu. Druga, potpuna tablica unakrsnih referenci i dalje se nalazi na kraju za preglednike koji ignoriraju ovu optimizaciju, ali linearizirana datoteka također postavlja unakrsnu referencu prve stranice i parametre koje strujni preglednik treba odmah na početak. Preglednik više ne mora doći do kraja datoteke prije nego što može bilo što nacrtati
Skup objekata prve stranice i rječnik parametara linearizacije
Prvi objekt u lineariziranoj datoteci, nakon zaglavlja %PDF, rječnik je parametara linearizacije. To je ono što strujni preglednik traži kako bi odlučio je li optimizacija prisutna i kako je koristiti. Rječnik bilježi duljinu cijele datoteke, pomak bajta na kojem počinje glavni dio unakrsnih referenci, broj objekta prve stranice te lokaciju i duljinu toka uputa (hint stream) koji slijedi. S tim brojevima preglednik zna, već iz samih početnih kilobajta, koliko mora dohvatiti da bi prikazao prvu stranicu i gdje tražiti indeks koji mu omogućuje skok na druga mjesta
Aneks F je strog oko toga što ovdje znači 'prva stranica'. Odjeljak prve stranice mora sadržavati sam objekt stranice, njegove tokove sadržaja i resurse na koje ti tokovi upućuju, tako da je stranica samostalna nakon što se taj uvodni dio preuzme. Zajednički resursi, poput fonta koji se koristi na svakoj stranici ili logotipa koji se ponavlja u zaglavlju, tretiraju se posebno: pojavljuju se dovoljno rano da posluže prvoj stranici, ali su označeni kao zajednički kako ih preglednik ne bi ponovno dohvaćao kada kasnije iscrtava stranicu 30. Ta razlika između privatnih objekata stranice i zajedničkih objekata je dio koji većina domaćih 'optimizatora' pogrešno izvede, a ta pogreška proizvodi datoteku koja tvrdi da je linearizirana, ali i dalje zastajkuje
Tokovi uputa (Hint streams): indeks koji skokove na stranice čini jeftinima
Brzi prikaz prve stranice samo je pola vrijednosti. Druga polovica je skakanje na bilo koju stranicu bez preuzimanja svega između njih, a to je ono što tokovi uputa (hint streams) pružaju. Linearizirana datoteka nosi tablicu uputa za pomak stranica (page offset hint table) i tablicu uputa za zajedničke objekte (shared object hint table), pohranjene kao tok na koji upućuje rječnik parametara. Tablica pomaka stranica bilježi, za svaku stranicu, gdje njezini objekti počinju u datoteci i koliko dugo traju. Tablica zajedničkih objekata čini isto za resurse koji se koriste na više stranica
S tim tablicama, preglednik koji želi stranicu 40 ne analizira datoteku sekvencijalno. On konzultira tablicu uputa kako bi saznao raspon bajtova koji stranica 40 zauzima, traži od poslužitelja točno taj raspon i iscrtava stranicu čim ti bajtovi stignu, povlačeći sve zajedničke resurse koje već ne posjeduje kroz isti mehanizam. Tok uputa je zapravo mapa za nasumičan pristup postavljena preko dokumenta, i to je razlog zašto dobro linearizirana datoteka od 500 stranica djeluje responzivno na sporoj vezi, dok neoptimizirana datoteka iste veličine to ne čini
Zašto poslužitelj mora surađivati
Linearizacija pretpostavlja da prijenosni sloj može isporučiti proizvoljne dijelove datoteke, a tu pretpostavku vrijedi provjeriti prije nego što format okrivite za loše rezultate. Mehanizam je HTTP byte-serving: preglednik šalje zahtjeve za raspon (range requests), a poslužitelj na njih odgovara s 206 Partial Content. Ako poslužitelj ne oglašava Accept-Ranges: bytes, ili ako proxy ili CDN ispred njega spoji zahtjeve za raspon u potpune prijenose, preglednik nema načina dohvatiti stranicu 40 izolirano i vraća se na preuzimanje cijele datoteke. Utvrđena struktura unutar PDF-a je tada savršeno točna i potpuno uzaludna
To je neuspjeh koji se najčešće pogrešno dijagnosticira kao 'linearizacija ne radi'. Datoteka je u redu; put isporuke nije. Prije nego što ponovno izgradite dokument, potvrdite uvjetnim zahtjevom da poslužitelj stvarno vraća djelomični sadržaj za URL koji preglednik pogađa. Mnogi statički poslužitelji to čine prema zadanim postavkama, dok mnogi loše konfigurirani aplikacijski poslužitelji i slojevi predmemorije ne čine
Inkrementalna ažuriranja potiho kvare linearizaciju
Evo ograničenja koje iznenađuje ljude koji ispravno generiraju linearizirane datoteke, a zatim se pitaju zašto optimizacija nestaje. Linearizacija ovisi o jedinstvenom, pažljivo uređenom rasporedu s indeksom na samom početku. Inkrementalno ažuriranje to krši po samom dizajnu. Kada alat doda potpis, ispuni polje obrasca ili doda bilješku kroz inkrementalno spremanje, on ne prepisuje datoteku. On dodaje promijenjene objekte, novi dio unakrsnih referenci i novi trailer na kraj, ostavljajući izvorne bajtove nedirnutima. To dodavanje je cijela svrha inkrementalnih ažuriranja: brzo je i čuva raniju reviziju za reviziju ili provjeru potpisa
Nuspojava je ta da datoteka sada ima svoje najnovije podatke o unakrsnim referencama na samom kraju, nakon pažljivo postavljenog bloka prve stranice, a rječnik parametara linearizacije na početku opisuje raspored koji više ne odgovara datoteci. Usklađeni preglednik detektira neslaganje i tretira dokument kao običan, nelinearizirani PDF. Fast Web View je nestao, iako izvorna linearizirana struktura i dalje sjedi u prvoj polovici datoteke. Ako dodate nekoliko ažuriranja, svako od njih slaže novu reviziju na kraj i jaz između zastarjelog prednjeg indeksa i stvarnog stanja se širi
Ako vaš tijek rada zahtijeva i uređivanje i Fast Web View, pravilo proizlazi izravno iz strukture: uređujte inkrementalno dok je dokument u izradi, a zatim ga ponovno linearizirajte na kraju. Potpuno prepisivanje je ono što obnavlja raspored. U terminima HotPDF-a, to znači da se uređivanje u tijeku odvija kroz BeginIncrementalUpdate i SaveIncrementalUpdate, koji dodaju deltu, dok korak završetka učitava cijeli dokument i serijalizira ga iznova s LoadFromFile nakon čega slijedi SaveLoadedDocument, što odbacuje akumulirane stare revizije i generira jedan čist raspored. Isti se kompromis pojavljuje i s tokovima objekata: omogućavanje UseObjectStreams zajedno s UseXRefStream komprimira unakrsne reference i pakira objekte tijesno, što pomaže veličini datoteke, ali se, kao i svaki strukturni izbor, mora primijeniti tijekom te konačne rekonstrukcije, a ne pripojiti na nadodanu reviziju
// In-flight edits: append a delta, keep prior revisions intact.
// This leaves the file NOT linearized.
Pdf.BeginIncrementalUpdate('report.pdf');
Pdf.AddPage;
Pdf.CurrentPage.TextOut(72, 760, 0, 'Addendum');
Pdf.SaveIncrementalUpdate('report.pdf');
// Finishing step: full re-serialization produces one clean layout,
// dropping the stacked revisions. Re-run your linearizer on the output.
Pdf.LoadFromFile('report.pdf');
Pdf.SaveLoadedDocument('report-final.pdf');
HotPDF ne izlaže uobičajenu 'linearize' rutinu, pa je praktični obrazac proizvesti čistu, potpuno prepisanu datoteku i pokrenuti namjenski optimizator nad njom. Alati naredbenog retka izravno upravljaju preraspodjelom. qpdf prepisuje datoteku u linearizirani oblik s jednom zastavicom:
qpdf --linearize report-final.pdf report-web.pdf
Kako prepoznati je li datoteka linearizirana
Ne vjerujte nazivu datoteke ili alatu koji tvrdi da ju je proizveo; provjerite bajtove. Najizravnija provjera je početak datoteke: otvorite je i potražite rječnik parametara linearizacije kao prvi objekt nakon zaglavlja, koji nosi ključ /Linearized. Prečac za korisnike je Acrobatov dijaloški okvir Document Properties, koji izvještava 'Fast Web View: Yes' samo kada je struktura stvarno prisutna i ažurna
Za automatizirane provjere, qpdf izvještava i o prisutnosti i o cjelovitosti strukture, što je važno jer datoteka može nositi rječnik linearizacije koji više ne odražava njezin raspored – upravo stanje koje inkrementalno ažuriranje ostavlja iza sebe:
# Reports "File is linearized" and validates hint tables against the layout
qpdf --check report-web.pdf
# Dumps the linearization parameters and hint data in detail
qpdf --show-linearization report-web.pdf
Korak provjere (validation) je onaj koji opravdava svoj trud. Prolaz koji samo potvrđuje postojanje rječnika rado će blagosloviti datoteku čiji indeks pokazuje na pogrešne pomake; provjera koja usklađuje tablice uputa sa stvarnim položajima objekata je ono što vam govori hoće li optimizacija izdržati zahtjeve za raspon stvarnog preglednika
Linearizaciju i dalje vrijedi primijeniti na svaki veliki dokument koji se poslužuje preko weba, posebno za mobilne čitatelje na nestabilnim vezama, a košta tek nekoliko postotaka veličine datoteke za indeks na početku. Dvije stvari koje treba razlikovati jesu da i struktura unutar PDF-a i posluživanje bajtova izvan njega moraju biti ispravni, te da svako uređivanje nakon toga poništava optimizaciju dok ponovno ne prepišete datoteku. Tretirajte ponovnu linearizaciju kao posljednji korak u cjevovodu, nakon što su sve ostale promjene riješene. Ponašanje unakrsnih referenci, toka objekata i inkrementalnog ažuriranja opisano ovdje dio je strukturnog modela koji implementira komponenta HotPDF za Delphi i C++Builder; za širu pozadinu rasporeda datoteka pogledajte kako je PDF strukturiran, a za tijek rada s inkrementalnim ažuriranjem i velikim datotekama u kodu pogledajte obradu velikih PDF-ova iz Delphija