Перейти к содержимому

PDF 2.0: что изменилось

Evidence: Standard-backed

PDF 2.0 — это ISO 32000-2. Это первая спецификация PDF, полностью принадлежащая ISO, а не Adobe. По сути, это консолидация и упорядочивание 1.7, а не радикальное переосмысление. На этой странице описано, что изменилось на самом деле, какие из этих изменений заметны на практике и как NextPDF по умолчанию ориентируется на базовый уровень 2.0, сохраняя возможность записывать более старую структуру файла, когда этого требует профиль.

“PDF 2.0” звучит так, будто речь о другом формате. Это не так. Файл 2.0 использует ту же объектную модель, тот же xref и тот же трейлер, что и 1.7, поэтому реальные изменения легко недооценить. Проблемы вызывают не громкие новые возможности, а ужесточения: правила, которые в 1.7 были необязательными, а теперь ожидаются, и возможности, которые незаметно удалили. Документ, который был полностью корректным файлом 1.7, может оказаться несоответствующим файлом 2.0 без единого видимого отличия.

Вторая причина — направление развития. NextPDF — это движок PDF 2.0. Когда вы понимаете, чего ожидает 2.0 и чем он намеренно отличается от 1.7, проще объяснить, почему движок отказывается от некоторых вещей, строже встраивает шрифты и по умолчанию использует поток перекрёстных ссылок вместо таблицы.

  • PDF 2.0 = ISO 32000-2; принадлежит ISO, развивает (а не заменяет) 1.7.
  • Заголовок становится %PDF-2.0; генератор, соответствующий стандарту, указывает версию как 2.0 в заголовке или в каталоге /Version.
  • Большая часть структуры файла не изменилась — те же косвенные объекты, тот же трейлер, та же дисциплина startxref/%%EOF.
  • Перекрёстный поток ссылок — это естественное значение по умолчанию для 2.0; классическая 20-байтовая таблица по-прежнему допустима и по-прежнему требуется некоторыми профилями PDF/A.
  • 2.0 добавляет возможности (например, более развитую структуру связанных файлов и частей документа, более стойкое шифрование через расширение AES-256-GCM) и удаляет возможности (некоторые теги структуры; ужесточённые требования к встраиванию шрифтов; устаревшие наборы символов CJK).
  • NextPDF по умолчанию ориентируется на 2.0 и может сериализовать структуру 1.7/1.4, когда этого требует профиль соответствия.

Версия — это решение, выраженное в одном месте: стратегии сериализации.

Pdf20StreamStrategy (src/Writer/Pdf20StreamStrategy.php) записывает заголовок %PDF-2.0, указывает /2.0 как версию в каталоге и выдаёт сжатый перекрёстный поток ссылок. В ней также прямо учтено ужесточение требований к шрифтам в 2.0. В профиле 2.0 она может принудительно отклонять невстроенный стандартный шрифт Type 1, а не просто предупреждать о нём, поскольку стандарт теперь ожидает, что эти шрифты будут встроены. Две табличные стратегии (Pdf17TableStrategy, Pdf14TableStrategy) существуют именно потому, что некоторым профилям нужна более старая форма. PDF/A-2/-3 предписывают традиционную таблицу перекрёстных ссылок, а PDF/A-1 дополнительно запрещает объектные потоки и потоки перекрёстных ссылок. Все три стратегии реализуют один интерфейс PdfSerializationStrategy, поэтому выше этой точки генератор работает одинаково. Меняется только форма trailer/xref.

Более стойкое шифрование подключено по тому же принципу. PdfXrefWriter (src/Writer/PdfXrefWriter.php) переносит включение AES-256-GCM (расширение ISO/TS 32003 к 2.0) в словарь шифрования, чтобы записи о версии обработчика и режиме шифра в выходном файле соответствовали фактически создаваемым байтам. Движок не заявляет один шифр и не записывает другой.

Общий принцип такой. 2.0 — это значение по умолчанию. Более старая структура доступна намеренно, никогда случайно. А там, где 2.0 ужесточает правило, NextPDF может удержать эту планку, а не молча её ослабить.

  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
Линия версий PDF, о которой рассуждает NextPDF: PDF 1.7 стал основой ISO, ISO 32000-2 — это PDF 2.0, а ISO/TS 32003 расширяет 2.0 шифрованием AES-256-GCM.

Указание версии является нормативным. Spec: ISO 32000-2, §7.5.2 устанавливает, что обработчик, записывающий соответствующий стандарту файл, должен указывать версию как 2.0 — либо в заголовке, либо в записи каталога /Version, — и что заголовок имеет вид %PDF-1.n или %PDF-2.n с последующим одиночным маркером конца строки. Spec: ISO 32000-2, §7.7.2 добавляет, что каталог /Version переопределяет более раннюю версию из заголовка, что как раз и делает возможным инкрементное повышение версии. Evidence: Standard-backed

То, что 2.0 — это консолидация, а не переписывание, видно из того, что он сохраняет: перекрёстный поток ссылок (/Type /XRef) — это тот же механизм, что был введён в PDF 1.5 и перенесён как значение по умолчанию для 2.0 ( Spec: ISO 32000-2, §7.5.8 ). Структура косвенного объекта, трейлера и startxref не изменилась по сравнению с описанием на предыдущей странице.

Практически важные изменения — это удаления и ужесточения. Стандарт фиксирует, что шесть стандартных элементов структуры, присутствующих в пространстве имён стандартной структуры PDF 1.7, не входят в пространство имён PDF 2.0 — Art, BlockQuote, TOC, Reference, BibEntry и Code ( Spec: ISO 32000-2, Annex L.3 , при этом различия пространств имён определены в соответствии с Spec: ISO 32000-2, §14.8.6 ). Он также ужесточает требования к четырнадцати стандартным шрифтам Type 1: там, где 1.0–1.7 позволяли их словарям опускать записи метрик, 2.0 закрывает это послабление ( Spec: ISO 32000-2, §9.6.2.1 ). Кроме того, он пересматривает предопределённые наборы символов CJK. Например, Adobe-Korea1 объявлен устаревшим в 2.0. Adobe-KR добавлен. Ничто из этого не меняет того, как выглядит существующая страница. Всё это может изменить то, соответствует ли она стандарту.

КатегорияПримеры (2.0 против 1.7)Меняет ли это внешний вид?Почему это важно
Без измененийКосвенные объекты, трейлер, startxref/%%EOF, потоки xref2.0 — это та же объектная модель; большинство инструментов переносится
ДобавленоБолее развитая структура связанных файлов / частей документа; шифрование AES-256-GCM (ISO/TS 32003)НетНовые возможности, которые вы включаете по желанию; старые читатели безопасно их игнорируют
УжесточеноСтандартные 14 шрифтов ожидаются встроенными; метрики больше нельзя опускатьНетКорректный файл 1.7 может быть несоответствующим файлом 2.0
УдаленоШесть элементов структуры из пространства имён 1.7 (Art, BlockQuote, TOC, Reference, BibEntry, Code); устаревшие наборы CJK (например, Adobe-Korea1)НетНезаметно: ничто видимое не сигнализирует об утраченном соответствии

Изменения PDF 2.0, которые важны, в подавляющем большинстве невидимы: дополнения, которые вы включаете по желанию, и ужесточения/удаления, которые меняют соответствие, не меняя ни единого отрисованного пикселя.

Единственное видимое отличие между файлом 2.0 и файлом 1.7 часто сводится к двум строкам: заголовку и версии каталога, — хотя правила соответствия за ними существенно различаются.

%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

Читатель видит %PDF-2.0 и /Version /2.0. Чего он не видит, но видит средство проверки соответствия, — того, что от этого файла теперь ожидается встраивание стандартных шрифтов и что он не должен использовать теги структуры, которые удалил 2.0. Байтов, которые различаются, немного. С правилами — не так.

Ловушка — в мысли “мы выводим PDF 2.0, значит, мы соответствуем стандарту лучше, чем раньше”. Запись %PDF-2.0 — это заявление, а не гарантия. Файл может нести заголовок 2.0 и всё равно нарушать 2.0 — ссылаясь на невстроенный стандартный шрифт или используя возможность, которую 2.0 удалил, — так же, как это допускалось в 1.7. Маркер версии поднимает планку, по которой оценивается файл. Он не доводит файл до этой планки. Зеркальная ошибка — предполагать, что файл 1.7 работает как 2.0 после смены заголовка: обычно он отрисовывается идентично и не проходит проверку соответствия, потому что ужесточения реальны, хотя и невидимы.

Ориентация на базовый уровень 2.0 означает, что NextPDF по умолчанию использует структуру файла 2.0 и может удерживать ужесточённые правила 2.0. Это не означает, что реализована каждая необязательная возможность 2.0, и не означает, что вывод заголовка 2.0 удостоверяет документ как соответствующий PDF/A, PDF/UA или любому другому профилю. Это отдельные, более строгие цели соответствия, которые накладываются поверх базовой спецификации, и у каждой есть собственная проверка.

Эта страница — практический ориентир по различиям версий, а не исчерпывающий журнал изменений ISO 32000-2 против 32000-1. Там, где конкретная возможность или устаревание 2.0 управляет поведением движка, это поведение привязано к своему пункту стандарта. Здесь описана общая картина, а не каждое отличие на уровне пунктов.

Обратно совместим ли PDF 2.0 с читателями 1.7? В значительной мере — если структура не изменилась. Новые возможности 2.0 обычно спроектированы так, что более старый читатель может игнорировать то, чего он не понимает. Но возможность, доступная только в 2.0, не будет учтена читателем 1.7.

Что имеет приоритет — заголовок или каталог /Version? Каталог /Version имеет приоритет, когда в нём указана более поздняя версия, чем в заголовке. Именно это позволяет инкрементному обновлению повысить версию файла без перезаписи заголовка.

Почему NextPDF по умолчанию использует перекрёстный поток ссылок, а не таблицу? Перекрёстный поток ссылок — это естественный механизм PDF 2.0: компактный и способный индексировать сжатые объекты. 20-байтовая таблица по-прежнему записывается, когда этого требует профиль (в частности, некоторые уровни PDF/A).

  • Что такое PDF на самом деле — объектная модель и xref, которые PDF 2.0 сохраняет из 1.7.
  • Ландшафт стандартов — какое место ISO 32000-2 занимает среди стандартов, которые отслеживает NextPDF, и как пункт стандарта становится поведением.
  • Шрифты: самое сложное — ужесточение встраивания шрифтов — одно из изменений 2.0, которое вы действительно ощущаете.
  • PDF 2.0 — спецификация PDF, стандартизированная как ISO 32000-2; первая редакция, принадлежащая ISO, а не Adobe.
  • ISO 32000-1 — стандартизированная ISO версия PDF 1.7 от Adobe; основа, на которой строится PDF 2.0.
  • ISO/TS 32003 — техническая спецификация, добавляющая в PDF 2.0 шифрование AES-256-GCM (AESV4).
  • Каталог /Version — запись каталога документа, указывающая версию PDF; переопределяет заголовок, когда указывает более позднюю версию.
  • Перекрёстный поток ссылок — механизм перекрёстных ссылок PDF 1.5+ / 2.0 (/Type /XRef); значение по умолчанию NextPDF, при этом классическая таблица по-прежнему доступна для более старых профилей.
  • Ужесточение — правило, которое было необязательным или допустимым в 1.7 и стало ожидаемым или обязательным в 2.0, меняя соответствие без изменения внешнего вида.