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

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

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.

Единственное видимое отличие между файлом 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, меняя соответствие без изменения внешнего вида.