Przejdź do głównej zawartości

PDF 2.0: co się zmieniło

Evidence: Standard-backed

PDF 2.0 to ISO 32000-2. To pierwsza specyfikacja PDF w całości należąca do ISO, a nie do Adobe. To przede wszystkim konsolidacja i uporządkowanie 1.7, nie radykalne przeprojektowanie. Ta strona opisuje, co faktycznie się zmieniło, które zmiany odczuwa się w praktyce oraz jak NextPDF domyślnie obiera bazę 2.0 za cel, a mimo to potrafi zapisać starszą strukturę pliku, gdy wymaga tego profil.

„PDF 2.0” brzmi tak, jakby oznaczał inny format. Tak nie jest. Plik 2.0 korzysta z tego samego modelu obiektów, tablicy xref i przyczepki co 1.7, przez co łatwo nie docenić rzeczywistych zmian. Problemy powodują nie najbardziej nagłaśniane funkcje, lecz zaostrzenia: reguły, które w 1.7 były opcjonalne, a teraz są oczekiwane, oraz funkcje, które po cichu usunięto. Dokument, który był całkowicie poprawnym plikiem 1.7, może być niezgodny z 2.0 bez żadnej widocznej różnicy.

Drugi powód, dla którego to ma znaczenie, to kierunek rozwoju. NextPDF to silnik PDF 2.0. Gdy wiesz, czego oczekuje 2.0 i w których miejscach celowo odbiega od 1.7, łatwiej zrozumieć, dlaczego silnik odmawia pewnych rzeczy, rygorystyczniej osadza czcionki i domyślnie używa strumienia odsyłaczy zamiast tablicy.

  • PDF 2.0 = ISO 32000-2; należy do ISO i rozwija (a nie zastępuje) 1.7.
  • Nagłówek staje się %PDF-2.0; zgodny program zapisujący deklaruje wersję 2.0 w nagłówku lub w katalogu /Version.
  • Większość struktury pliku jest bez zmian — te same obiekty pośrednie, ta sama przyczepka, ta sama dyscyplina startxref/%%EOF.
  • Naturalnym mechanizmem domyślnym 2.0 jest strumień odsyłaczy; klasyczna 20-bajtowa tablica nadal jest dozwolona i nadal wymagana przez niektóre profile PDF/A.
  • 2.0 dodaje elementy (na przykład bogatszą strukturę plików powiązanych i części dokumentu, silniejsze szyfrowanie dzięki rozszerzeniu AES-256-GCM) i usuwa elementy (część znaczników struktury; zaostrzone oczekiwania dotyczące osadzania czcionek; wycofane kolekcje znaków CJK).
  • NextPDF domyślnie celuje w 2.0 i potrafi serializować strukturę 1.7/1.4, gdy wymaga tego profil zgodności.

Wersja to decyzja wyrażona w jednym miejscu: w strategii serializacji.

Pdf20StreamStrategy (src/Writer/Pdf20StreamStrategy.php) zapisuje nagłówek %PDF-2.0, deklaruje /2.0 jako wersję katalogu i emituje skompresowany strumień odsyłaczy. Przenosi też wprost zaostrzenie dotyczące czcionek z 2.0. W profilu 2.0 może potraktować nieosadzoną standardową czcionkę Type 1 jako błąd, a nie tylko o niej ostrzegać, ponieważ standard oczekuje teraz osadzenia tych czcionek. Dwie strategie tablicowe (Pdf17TableStrategy, Pdf14TableStrategy) istnieją właśnie dlatego, że niektóre profile potrzebują starszego kształtu. PDF/A-2/-3 nakazują tradycyjną tablicę odsyłaczy, a PDF/A-1 dodatkowo zakazuje strumieni obiektów i odsyłaczy. Wszystkie trzy strategie implementują jeden interfejs PdfSerializationStrategy, więc program zapisujący jest identyczny po obu stronach tej granicy. Zmienia się tylko kształt trailer/xref.

Silniejsze szyfrowanie jest wpięte w ten sam przemyślany sposób. PdfXrefWriter (src/Writer/PdfXrefWriter.php) propaguje włączenie AES-256-GCM (rozszerzenie ISO/TS 32003 do 2.0) do słownika szyfrowania, tak aby emitowana wersja procedury obsługi i wpisy trybu szyfru odpowiadały faktycznie wytworzonym bajtom. Silnik nie deklaruje jednego szyfru, zapisując inny.

Ogólna zasada projektu jest prosta. 2.0 jest domyślne. Starszą strukturę można osiągnąć celowo, nigdy przypadkiem. A tam, gdzie 2.0 zaostrza regułę, NextPDF potrafi tę regułę utrzymać, zamiast po cichu ją rozluźniać.

  1. Step 1 of 3: ISO 32000-1 PDF 1.7 — the Adobe-authored base, adopted by ISO
  2. Step 2 of 3: ISO 32000-2 PDF 2.0 — ISO-owned consolidation, tightening, and additions
  3. Step 3 of 3: ISO/TS 32003 AES-256-GCM (AESV4) — an encryption extension to PDF 2.0
Linia rozwoju wersji PDF, którą uwzględnia NextPDF: PDF 1.7 stał się bazą ISO, ISO 32000-2 to PDF 2.0, a ISO/TS 32003 rozszerza 2.0 o szyfrowanie AES-256-GCM.

Deklaracja wersji jest normatywna. Spec: ISO 32000-2, §7.5.2 stanowi, że procesor zapisujący zgodny plik musi wskazać wersję 2.0 — albo w nagłówku, albo jako wpis katalogu /Version — oraz że nagłówek to %PDF-1.n lub %PDF-2.n, po którym następuje pojedynczy znacznik końca wiersza. Spec: ISO 32000-2, §7.7.2 dodaje, że wpis katalogu /Version nadpisuje wcześniejszą wersję z nagłówka, co jest dokładnie tym, co umożliwia przyrostowe podniesienie wersji. Evidence: Standard-backed

To, że 2.0 jest konsolidacją, a nie przepisaniem od nowa, widać w tym, co zachowuje: strumień odsyłaczy (/Type /XRef) to ten sam mechanizm wprowadzony w PDF 1.5 i przeniesiony jako wartość domyślna 2.0 ( Spec: ISO 32000-2, §7.5.8 ). Struktura obiektów pośrednich, przyczepki i startxref jest niezmieniona względem opisu z poprzedniej strony.

Zmiany, które mają znaczenie, to usunięcia i zaostrzenia. Standard wskazuje, że sześć standardowych elementów struktury obecnych w standardowej przestrzeni nazw struktury PDF 1.7 nie jest częścią przestrzeni nazw PDF 2.0 — Art, BlockQuote, TOC, Reference, BibEntry i Code ( Spec: ISO 32000-2, Annex L.3 , przy czym różnice w przestrzeni nazw są zdefiniowane zgodnie z Spec: ISO 32000-2, §14.8.6 ). Zaostrza też czternaście standardowych czcionek Type 1: tam, gdzie 1.0–1.7 pozwalały ich słownikom pomijać wpisy metryk, 2.0 zamyka to pozwolenie ( Spec: ISO 32000-2, §9.6.2.1 ). Rewiduje też predefiniowane kolekcje znaków CJK. Na przykład Adobe-Korea1 jest wycofana w 2.0. Adobe-KR jest dodana. Żadna z tych zmian nie wpływa na to, jak istniejąca strona wygląda. Wszystkie mogą zmienić to, czy jest zgodna.

KategoriaPrzykłady (2.0 względem 1.7)Czy zmienia wygląd?Dlaczego to ma znaczenie
Bez zmianObiekty pośrednie, przyczepka, startxref/%%EOF, strumienie xref2.0 to ten sam model obiektów; większość narzędzi nadal działa
DodaneBogatsza struktura plików powiązanych / części dokumentu; szyfrowanie AES-256-GCM (ISO/TS 32003)NieNowa funkcja, którą się włącza; starsze czytniki mogą ją bezpiecznie zignorować
ZaostrzoneOczekuje się osadzenia czcionek Standard-14; metryk nie można już pominąćNiePoprawny plik 1.7 może być niezgodny z 2.0
UsunięteSześć elementów struktury z przestrzeni nazw 1.7 (Art, BlockQuote, TOC, Reference, BibEntry, Code); wycofane kolekcje CJK (na przykład Adobe-Korea1)NiePo cichu: nic widocznego nie sygnalizuje utraty zgodności

Zmiany w PDF 2.0, które mają znaczenie, są w większości niewidoczne: dodatki, które się włącza, oraz zaostrzenia i usunięcia, które zmieniają zgodność bez zmiany ani jednego renderowanego piksela.

Jedyną widoczną różnicą między plikiem 2.0 a plikiem 1.7 są często dwa wiersze — nagłówek i wersja w katalogu — choć stojące za nimi reguły zgodności różnią się znacząco.

%PDF-2.0 % was %PDF-1.7
...
1 0 obj
<< /Type /Catalog /Version /2.0 % catalog states 2.0; overrides header if later
/Pages 2 0 R >>
endobj
...
% Cross-reference STREAM is the 2.0 default (was often a 20-byte table)
99 0 obj
<< /Type /XRef /Size 100 /W [1 2 2] /Filter /FlateDecode /Root 1 0 R >>
stream
<binary xref entries>
endstream
endobj
startxref
12345
%%EOF

Czytnik widzi %PDF-2.0 oraz /Version /2.0. Tym, czego nie widzi — a co widzi narzędzie sprawdzające zgodność — jest fakt, że od tego pliku oczekuje się teraz osadzenia standardowych czcionek oraz że nie może używać znaczników struktury usuniętych w 2.0. Różniących się bajtów jest niewiele. Różniących się reguł — nie.

Pułapką jest przekonanie: „generujemy PDF 2.0, więc mamy lepszą zgodność niż wcześniej.” Zapis %PDF-2.0 to deklaracja, a nie gwarancja. Plik może mieć nagłówek 2.0 i mimo to naruszać 2.0 — odwołując się do nieosadzonej standardowej czcionki lub używając funkcji usuniętej w 2.0 — dokładnie w sposób tolerowany w 1.7. Znacznik wersji podnosi poprzeczkę, względem której plik jest mierzony. Nie przenosi pliku ponad nią. Odwrotnym błędem jest założenie, że plik 1.7 działa jako 2.0 po zmianie nagłówka: zwykle renderuje się identycznie i nie przechodzi kontroli zgodności, ponieważ zaostrzenia są rzeczywiste, choć niewidoczne.

Celowanie w bazę 2.0 oznacza, że NextPDF domyślnie używa struktury pliku 2.0 i potrafi egzekwować zaostrzone reguły 2.0. Nie oznacza to, że każda opcjonalna funkcja 2.0 jest zaimplementowana, ani że emisja nagłówka 2.0 poświadcza dokument względem PDF/A, PDF/UA lub jakiegokolwiek innego profilu. To odrębne, surowsze cele zgodności nałożone na specyfikację bazową, każdy z własną walidacją.

Ta strona to praktyczne wprowadzenie do różnic między wersjami, a nie wyczerpujący rejestr zmian ISO 32000-2 względem 32000-1. Tam, gdzie konkretna funkcja lub wycofanie z 2.0 wpływa na zachowanie silnika, to zachowanie jest zakotwiczone we własnym punkcie normy. Ta strona pokazuje ogólny krajobraz, zamiast wyliczać każdą różnicę na poziomie pojedynczego punktu normy.

Czy PDF 2.0 jest wstecznie zgodny z czytnikami 1.7? W dużej mierze tak, jeśli chodzi o niezmienioną strukturę. Nowe funkcje 2.0 są zwykle projektowane tak, aby starszy czytnik mógł zignorować to, czego nie rozumie. Ale funkcja dostępna tylko w 2.0 nie będzie obsłużona przez czytnik 1.7.

Co wygrywa: nagłówek czy katalog /Version? Katalog /Version ma pierwszeństwo, gdy wskazuje późniejszą wersję niż nagłówek. To właśnie pozwala aktualizacji przyrostowej podnieść wersję pliku bez przepisywania nagłówka.

Dlaczego NextPDF domyślnie używa strumienia odsyłaczy, a nie tablicy? Strumień odsyłaczy to naturalny mechanizm PDF 2.0 — zwarty i zdolny do indeksowania obiektów skompresowanych. 20-bajtowa tablica jest nadal zapisywana, gdy wymaga tego profil (zwłaszcza niektóre poziomy PDF/A).

  • PDF 2.0 — specyfikacja PDF znormalizowana jako ISO 32000-2, pierwsze wydanie należące do ISO, a nie do Adobe.
  • ISO 32000-1 — normalizacja ISO formatu PDF 1.7 firmy Adobe; baza, na której opiera się PDF 2.0.
  • ISO/TS 32003 — specyfikacja techniczna rozszerzająca PDF 2.0 o szyfrowanie AES-256-GCM (AESV4).
  • Katalog /Version — wpis katalogu dokumentu podający wersję PDF; nadpisuje nagłówek, gdy wskazuje późniejszą wersję.
  • Strumień odsyłaczy — mechanizm odsyłaczy PDF 1.5+ / 2.0 (/Type /XRef); wartość domyślna NextPDF, z klasyczną tablicą nadal dostępną dla starszych profili.
  • Zaostrzenie — reguła, która w 1.7 była opcjonalna lub dozwolona, a w 2.0 jest oczekiwana lub wymagana, zmieniająca zgodność bez zmiany wyglądu.