Przejdź do głównej zawartości
getnextpdf.com

Szybki podgląd w sieci: jak PDF otwiera się, zanim skończy się pobierać

Spec: ISO 32000-2, Annex F

Zlinearyzowany PDF jest tak przeorganizowany, że pierwsza strona i niewielki indeks nawigacyjny znajdują się na samym początku pliku. Czytnik może więc narysować pierwszą stronę, gdy reszta dokumentu wciąż jeszcze nadchodzi, oraz przeskoczyć prosto do strony 147 bez wcześniejszego czytania stron od 2 do 146.

To funkcja, którą większość czytelników zna pod jej przyjazną nazwą: szybki podgląd w sieci (Fast Web View).

Wyobraź sobie 200-stronicowy raport na telefonie z jedną kreską zasięgu. Bez linearyzacji czytnik często potrzebuje samego końca pliku, zanim zdoła cokolwiek narysować, ponieważ główny indeks mówiący, gdzie mieszka każdy obiekt, tradycyjnie znajduje się na końcu. Patrzysz więc na obracające się kółko, gdy pobiera się dwieście stron, tylko po to, by przeczytać pierwszą.

Przy linearyzacji plik jest ułożony tak, że odpowiedź na pytanie „co jest na pierwszej stronie” to pierwsza rzecz, jaka schodzi z łącza. Czytelnik maluje pierwszą stronę w sekundę, a resztę pobiera dopiero w miarę przewijania lub przeskakiwania. Na szybkim połączeniu możesz tego nigdy nie zauważyć. Na wolnym lub taryfowym to różnica między dokumentem nadającym się do użytku a porzuconą kartą.

  • Zlinearyzowany plik jest załadowany od przodu: pierwsza strona i tablica wskazówek są umieszczone jako pierwsze, przed resztą treści.
  • Tablica wskazówek to mapa zakresów. Mówi czytnikowi, które zakresy bajtów należą do każdej strony i do obiektów współdzielonych, dzięki czemu czytnik może poprosić serwer o dokładnie te wycinki — następnie tablica odwołań krzyżowych rozwiązuje każdy numer obiektu do jego dokładnego przesunięcia.
  • Polega to na żądaniach zakresu bajtów — czytnik pobiera wycinki pliku na żądanie, a nie całość.
  • Bajty mają zawartość identyczną z normalnym PDF. Linearyzacja zmienia kolejność i indeks, a nie same strony.
  • To jeden jawny, przełączalny krok w NextPDF — wytworzony przez prawdziwą trzyprzebiegową odbudowę, a nie flaga, która liczy na najlepsze.

Nie da się załadować strony na przód, dopóki nie wiesz dokładnie, jak duże jest wszystko, ponieważ tablica wskazówek zapisuje przesunięcia bajtowe, a przesunięcie jest poprawne dopiero wtedy, gdy długość każdego obiektu jest ostateczna. Ta cykliczność — przesunięcia zależą od rozmiarów, rozmiary zależą od układu — to powód, dla którego linearyzator działa w przebiegach, a nie w jednym przejściu.

NextPDF rozwiązuje to deterministyczną trzyprzebiegową odbudową. Pierwszy przebieg mierzy, drugi decyduje o rozmieszczeniu, trzeci zapisuje rzeczywiste bajty z wbudowanymi już znanymi przesunięciami.

  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.
Trzyprzebiegowa odbudowa linearyzacji. MEASURE wymiaruje każdy obiekt, aby długości były ostateczne; PLACE decyduje o ładowanej od przodu kolejności i rezerwuje obszar tablicy wskazówek; FILL zapisuje rzeczywiste bajty ze znanymi już przesunięciami, dzięki czemu pierwsza strona i tablica wskazówek lądują na początku, a dane odwołań krzyżowych rozwiązują się przy pierwszym pobraniu.

Wynik niesie słownik parametrów linearyzacji jako swój pierwszy obiekt oraz jedną lub więcej tablic wskazówek, które indeksują strony, dokładnie tak, jak nakazuje standard (Spec: ISO 32000-2, Annex F). Te tablice wskazówek działają równolegle z tradycyjną tablicą odwołań krzyżowych — zapisują zakresy bajtów i lokalizacje, które czytnik musi pobrać, podczas gdy tablica odwołań krzyżowych to indeks odwzorowujący każdy numer obiektu na jego dokładne przesunięcie bajtowe. Linearyzator NextPDF wytwarza klasyczną postać tablicy i po drodze usuwa wszelki strumień odwołań krzyżowych, więc gdy wycinek dotrze, czytelnik rozwiązuje obiekt po jego przesunięciu wprost z tej tablicy (Spec: ISO 32000-2, §7.5.4).

Przydatny model myślowy: normalny PDF to książka, której spis treści jest przyklejony do tylnej okładki. Zlinearyzowany PDF przenosi tę stronę spisu na początek i dodaje indeks numerów stron dla każdej strony, dzięki czemu możesz otworzyć dowolną stronę bezpośrednio. Rozdziały są niezmienione. Przeniosła się tylko nawigacja.

Linearyzacja to jawny, przełączalny krok. Prosisz o nią; silnik wykonuje odbudowę i wytwarza plik z szybkim podglądem w sieci (Fast Web View).

<?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);

Zawartość strony to dokładnie to, co napisałeś. Różnica tkwi w kolejności w pliku otrzymywanych bajtów oraz w tablicy wskazówek, która teraz znajduje się blisko góry.

Wynik weryfikujesz tak, jak zrobiłby to obcy — za pomocą zewnętrznego sprawdzaczki:

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

qpdf --check-linearization nie szuka po prostu flagi. Wyprowadza ponownie przesunięcia, które plik deklaruje, i potwierdza, że są prawdziwe: że obiekty pierwszej strony naprawdę znajdują się tam, gdzie mówi słownik linearyzacji, że tablica wskazówek wskazuje na właściwe bajty oraz że struktura jest zgodna z Annex F. Plik, który kłamie o własnym układzie, nie przechodzi tej kontroli, nawet jeśli na pierwszy rzut oka wygląda na zlinearyzowany.

Częste założenie jest takie, że linearyzacja kompresuje plik lub przyspiesza pobieranie jako całość. Nie robi ani jednego, ani drugiego. Zlinearyzowany plik jest często o kilka bajtów większy, ponieważ niesie dodatkowe tablice wskazówek. Całkowity czas transferu całego dokumentu pozostaje w istocie niezmieniony.

Zmienia się to, kiedy pojawia się pierwszy użyteczny piksel. Linearyzacja optymalizuje czas do pierwszej strony, a nie całkowitą liczbę bajtów. To funkcja związana z opóźnieniem, a nie z kompresją. Strumieniowe wczesne pokazanie pierwszej strony i szybkie pobranie pliku to różne cele, a linearyzacja służy pierwszemu z nich.

Drugie nieporozumienie to przekonanie, że dowolny serwer WWW będzie strumieniować zlinearyzowany plik. Czytnik musi pobierać zakresy bajtów, co oznacza, że serwer musi honorować żądania zakresu HTTP. Większość to robi, ale serwer, który zawsze zwraca cały plik, zamienia szybki podgląd w sieci z powrotem w wolne czekanie na cały plik — plik jest gotowy do strumieniowania, ale transport nie.

NextPDF ma pełne podstawowe wsparcie dla wytwarzania zlinearyzowanych plików: produkcyjny trzyprzebiegowy linearyzator, który wytwarza słownik parametrów i tablice wskazówek oraz przechodzi zewnętrzną kontrolę Annex F.

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

Warto nazwać dwie granice. Po pierwsze, linearyzacja jest właściwością jednej rewizji. W chwili, gdy dołączysz aktualizację przyrostową — podpis, wypełnienie formularza, edycję — dołączone bajty trafiają na koniec, a plik nie jest już ściśle zlinearyzowany, dopóki nie zostanie odbudowany. To normalny kompromis, a nie wada; zobacz aktualizacje przyrostowe, aby dowiedzieć się, dlaczego dołączanie to właściwe zachowanie dla podpisanych dokumentów.

Po drugie, silnik steruje plikiem. Nie steruje siecią. Szybki podgląd w sieci spełnia swoją obietnicę tylko wtedy, gdy serwujące połączenie honoruje żądania zakresu bajtów; bajty mogą być doskonale zlinearyzowane, a mimo to nadejść jednym wolnym blokiem, jeśli serwer upiera się przy wysyłaniu całego pliku.

  • Anatomia pliku PDF — nagłówek, treść, tablica odwołań krzyżowych i trailer, które linearyzacja przestawia. Przeczytaj to najpierw, aby zobaczyć, co jest porządkowane na nowo.
  • Pamięć i strumieniowanie — strumieniowanie po stronie zapisu, inna oś: jak NextPDF utrzymuje płaskie zużycie pamięci podczas wytwarzania bajtów, w przeciwieństwie do tego, jak czytnik strumieniuje je w trakcie odczytu.
  • Aktualizacje przyrostowe i dlaczego mają znaczenie — dlaczego późniejsza edycja dołącza się na koniec i co to oznacza dla ładowanego od przodu układu zlinearyzowanego pliku.
  • Strumienie i filtry — co znajduje się wewnątrz obiektów treści, na które wskazuje tablica wskazówek, i jak są kompresowane.
  • Linearyzacja — odbudowa, która ładuje na przód pierwszą stronę i indeks nawigacyjny, dzięki czemu czytnik może renderować i nawigować, zanim dotrze cały plik. Nazwa, jaką standard nadaje wynikowi.
  • Szybki podgląd w sieci (Fast Web View) — nazwa zlinearyzowanego PDF od strony konsumenta; oba terminy opisują ten sam plik.
  • Tablica wskazówek — struktura wewnątrz zlinearyzowanego pliku, która zapisuje zakresy i lokalizacje bajtów każdej strony oraz obiektów współdzielonych, dzięki czemu czytnik wie, o które wycinki poprosić; tablica odwołań krzyżowych to to, co następnie odwzorowuje numer obiektu na jego dokładne przesunięcie bajtowe.
  • Słownik parametrów linearyzacji — pierwszy obiekt w zlinearyzowanym pliku; deklaruje kluczowe przesunięcia (długość pierwszej strony, lokalizację tablicy wskazówek, główne położenie odwołań krzyżowych), które umożliwiają pobieranie na żądanie.
  • Żądanie zakresu bajtów — żądanie HTTP o wycinek pliku zamiast o całość; mechanizm transportu, na którym opiera się szybki podgląd w sieci.
  • Czas do pierwszej strony — jak długo trwa, zanim czytelnik zobaczy pierwszą stronę. Opóźnienie, które optymalizuje linearyzacja, odrębne od całkowitego czasu pobierania.