PDF (Portable Document Format, «переносимый формат документа») — формат файла, который описывает не текст сам по себе, а готовую страницу: что нарисовать, каким шрифтом и в какой точке листа. Из-за этого он выглядит одинаково везде — и по той же причине его тяжело редактировать и тяжело извлекать из него данные.
История
Началось всё с PostScript. В 1982 году Джон Уорнок и Чак Гешке ушли из
исследовательского центра Xerox PARC и основали Adobe Systems. Их первым
продуктом стал язык описания страниц PostScript (1984): принтер получал не
картинку, а маленькую программу, которая рисовала страницу. Именно PostScript
вместе с лазерным принтером Apple LaserWriter и программой Aldus PageMaker
сделал в 1985 году настольную издательскую революцию.
Но у PostScript был изъян: это полноценный язык программирования. Чтобы узнать,
что нарисовано на 300-й странице, нужно выполнить программу с самого начала.
Перелистывать документ так нельзя.
В 1991 году Уорнок написал внутреннюю записку под названием «The Camelot
Project». Идея: взять из PostScript графическую модель, выкинуть
программируемость, добавить оглавление объектов — и получить формат, в котором
документ можно открыть на любой странице мгновенно. Проект получил название
Carousel, а формат — PDF.
Вехи:
- 1992, ноябрь — PDF 1.0 показан на выставке Comdex.
- 1993, июнь — вышел Acrobat 1.0. Стоил дорого, и читалка тоже была
платной; первые пару лет формат почти не взлетал. - 1994 — Adobe сделала Acrobat Reader бесплатным. Вот это и решило судьбу
формата: платишь за создание, читают все даром. Классическая стратегия
«раздай читалку — продавай редактор». - 2001, PDF 1.4 — прозрачность и слои, формат окончательно годится для
полиграфии. - 2008, 1 июля — Adobe передаёт спецификацию в ISO. PDF 1.7 становится
международным стандартом ISO 32000-1:2008. С этого момента формат больше
не принадлежит одной компании. - 2017, PDF 2.0 — ISO 32000-2 (редакция 2020 года). Выкинут LZW,
узаконено шифрование AES-256, наведён порядок в цифровых подписях.
Текущий статус: открытый международный стандарт. Adobe по-прежнему главный
игрок в инструментах (Acrobat), но не владелец формата. Развитие ведёт
комитет ISO TC 171/SC 2.
Что это такое
PDF — это контейнер с описанием готовых страниц. Внутри файла лежит набор
пронумерованных объектов: словари, массивы, числа, строки, имена и потоки
(streams) — куски сжатых данных. Один объект описывает страницу, другой —
шрифт, третий — встроенную картинку, четвёртый — последовательность команд
рисования.
Ключевое слово — готовых. В файле Word хранится смысл: «это заголовок
второго уровня, это абзац, это элемент списка». Как всё это ляжет на бумагу,
решит программа в момент показа — и решит по-разному, если у тебя нет нужного
шрифта. В PDF решение уже принято и зафиксировано: «глиф буквы Ж из шрифта
PT Sans, кегль 11, координаты 72.0 по X и 689.4 по Y». Шрифт при этом обычно
лежит внутри файла — поэтому и получается, что документ выглядит одинаково у
всех.
Отсюда все свойства формата, и хорошие, и плохие.
PDF vs DOCX. DOCX — исходник, PDF — результат. DOCX перетекает под ширину
окна, PDF — нет. DOCX правится легко, PDF — с мучениями. Отправлять контракт
клиенту нужно в PDF, а править у себя — в DOCX.
PDF vs HTML. HTML описывает структуру и отдаёт вёрстку браузеру:
подстраивается под экран, под размер шрифта, под слабовидящего с программой
чтения. PDF намертво фиксирует лист формата A4. В вебе HTML выигрывает всегда,
на печати — всегда PDF.
PDF vs картинка (JPEG/PNG/скан). Сканы — это растр: буквы там — просто
пиксели, искать по ним нельзя. В нормальном PDF текст остаётся текстом. Но
внимание: PDF может содержать скан — тогда это картинка в обёртке PDF, и
искать в ней нечего, пока не прогонишь OCR (распознавание текста).
PDF vs PostScript. Родитель и потомок. PostScript — программа, PDF —
структура данных с оглавлением. PostScript печатает, PDF ещё и хранит.
У формата есть официальные подмножества — урезанные профили под задачу:
- PDF/A (ISO 19005, с 2005) — для архивов. Запрещает всё, что может через
20 лет не открыться: внешние ссылки на шрифты, JavaScript, шифрование. - PDF/X (ISO 15930) — для типографий: обязательные цветовые профили,
вылеты под обрез. - PDF/UA (ISO 14289, с 2012) — доступность: обязательная разметка тегами,
чтобы программа чтения с экрана понимала порядок чтения. - PDF/E — инженерные чертежи, в том числе 3D-модели внутри документа.
Аналогии из жизни
Фотография документа против самого документа. PDF — как качественный
фотоснимок разложенной на столе бумаги: всё на месте, ничего не поедет.
Где работает: объясняет главное — вид зафиксирован, получатель видит ровно
то же, что отправитель.
Где ломается: фотография — плоская, а PDF нет. Внутри него живёт текст, его
можно выделить и скопировать; живут слои, поля форм, закладки, вложенные
файлы, иногда целые видеоролики. И — важное — в фотографии не остаётся того,
что ты замазал маркером, а в PDF остаётся: закрасил чёрным
прямоугольником — сам прямоугольник нарисовался поверх, а текст под ним никуда
не делся и прекрасно копируется.
Кухня: рецепт против сервированной тарелки. HTML — рецепт: подстроится под
четыре порции или под две. PDF — уже собранное и украшенное блюдо: ничего не
пересоберёшь, зато у всех гостей одинаковое.
Где работает: передаёт разницу между «описанием намерения» и «готовым
результатом», и почему результат нельзя отмотать назад дёшево.
Где ломается: блюдо нельзя разобрать на ингредиенты, а PDF — можно, пусть и
грязно: текст вытаскивается, картинки достаются, страницы режутся и
склеиваются. Плюс у блюда нет слоя метаданных, а у PDF есть — автор, дата,
программа-создатель, а иногда и путь к папке на чужом компьютере.
Театр: список реплик рабочему сцены. Внутри PDF страница описана командами
вроде «перейди в точку 72, 700», «возьми шрифт F1 размером 11», «напиши вот
эти буквы». Это не текст страницы, это инструкции постановщику.
Где работает: объясняет главную боль формата — почему извлечение текста
вечно ломается. Команды можно выдавать в любом порядке: сначала нижняя строка,
потом верхняя; пробел между словами часто не пишется вовсе, вместо него просто
сдвиг координаты. Программа-извлекатель вынуждена угадывать, где кончилось
слово.
Где ломается: в театре есть сценарий, по которому реплики выстроены в
осмысленном порядке. В PDF такого сценария по умолчанию нет — если только
автор не сделал «тегированный PDF» (tagged PDF), где структура прописана
отдельно. Большинство файлов в мире не тегированы.
PDF не знает, что такое абзац
В обычном PDF нет понятий «заголовок», «абзац», «таблица», «колонка». Есть только буквы в координатах. Всё, что ты видишь как таблицу, программа видит как набор чёрточек и текстовых фрагментов рядом. Поэтомулюбое извлечение таблиц из PDF — это эвристика, а не чтение, и оно всегда где-нибудь врёт.
Как это работает
Физически файл устроен так:
%PDF-1.7 <- заголовок, первые байты файла
1 0 obj ... endobj <- тело: пронумерованные объекты
2 0 obj ... endobj
...
xref <- таблица перекрёстных ссылок:
0000000017 00000 n смещение каждого объекта в байтах
...
trailer << /Root 1 0 R >> <- трейлер: где корень документа
startxref
116543 <- смещение таблицы xref
%%EOF
Разбор идёт с конца. Читалка прыгает в хвост файла, находит startxref,
по нему — таблицу xref, а в ней смещение любого объекта в байтах. Захотел
открыть страницу 300 — прыгнул прямо к ней, не читая предыдущие. Это и есть то
самое отличие от PostScript, ради которого формат затевали.
Дерево объектов примерно такое:
Catalog (корень)
└── Pages (дерево страниц)
├── Page 1
│ ├── Resources: шрифты, картинки, цветовые профили
│ └── Contents: поток команд рисования
└── Page 2 ...
Поток команд (content stream) — обратная польская запись, операнды идут перед
оператором:
BT % begin text - начали текстовый блок
/F1 11 Tf % шрифт F1, кегль 11
72 700 Td % встали в точку (72, 700) от левого нижнего угла
(Привет) Tj % нарисовали строку
ET % end text
Координаты — в пунктах (point), 1/72 дюйма. Лист A4 — 595 × 842 пункта.
Начало координат внизу слева, как в математике, а не вверху, как в вебе.
Дальше — сжатие. Каждый поток проходит через фильтр: FlateDecode (тот же
deflate, что в zip), DCTDecode (это JPEG внутри), CCITTFaxDecode (чёрно-белые
факсовые сканы), JBIG2Decode. Поэтому PDF в блокноте выглядит как каша из
бинарного мусора: читаемая только структура, а содержимое — сжатые потоки.
Шрифты встраиваются, обычно с сабсеттингом (subsetting): в файл кладут не
весь шрифт, а только реально использованные глифы. Поэтому имена шрифтов внутри
PDF часто выглядят как ABCDEF+PTSans-Bold — шесть случайных букв означают
«это огрызок, а не полный шрифт».
Отдельная механика — инкрементальные обновления. Когда ты правишь PDF
редактором, старые байты часто не переписываются: в конец файла дописывается
новая порция объектов и новая таблица xref, которая ссылается на предыдущую.
Файл растёт слоями, как годичные кольца. Плюс — правка мгновенная даже для
файла на 500 МБ, и цифровая подпись предыдущей версии не ломается. Минус —
предыдущие версии остаются внутри файла.
Замазанное чёрным — не удалённое
Два разных действия. Нарисовать поверх текста чёрный прямоугольник — косметика: текст остаётся в потоке и копируется мышкой. Настоящее удаление называется redaction (вымарывание) и требует пересборки содержимого страницы. На этом регулярно горят и юристы, и госорганы, и корпорации: опубликованный документ открывают текстовым поиском и читают «скрытое». Проверка простая: выдели закрашенное место, скопируй, вставь в блокнот.
Безопасность в PDF — это отдельная история. Формат поддерживает шифрование
(исторически RC4 40 и 128 бит — сегодня это несерьёзно, затем AES-128, в
PDF 2.0 — AES-256), причём паролей два: пользовательский (без него файл не
откроется) и владельческий (снимает ограничения на печать и копирование).
Ограничения на печать — договорённость, а не защита: файл расшифрован,
запрет лежит внутри него флажком, и любая непослушная читалка его
проигнорирует.
Ещё формат умеет выполнять JavaScript, открывать внешние файлы и показывать
формы. Отсюда вереница уязвимостей: примерно с 2008 по 2012 год Adobe Reader
стабильно входил в тройку самых атакуемых программ на десктопе, и «просто
открыть PDF» было реальным способом поймать заражение. Сегодня читалки
запускают разбор в песочнице и по умолчанию глушат скрипты.
Где встречается в обычной жизни
- Посадочный талон и электронный билет. Авиакомпания не может
предположить, чем ты его откроешь и на каком принтере распечатаешь, — ей
нужен штрихкод ровно того размера, который считает сканер. Только
фиксированная вёрстка. - Выписка из банка и чек. Банк обязан отдать документ, который через три
года выглядит идентично и годится как доказательство. Часто такие выписки
ещё и подписаны цифровой подписью прямо внутри файла. - Договор на подпись. Формат посылают именно потому, что получателю трудно
незаметно поменять сумму — и легко заметить, если дата создания файла
изменилась. - Инструкция к технике и школьный учебник. Производителю дешевле выложить
ту же вёрстку, что ушла в типографию, чем верстать отдельную веб-версию. - Научная статья. Почти вся мировая наука обменивается PDF: arXiv,
журналы, препринты. Там важно, чтобы формула и номер страницы совпадали у
всех, кто на неё ссылается. - Справка из госуслуг. Обычно PDF/A — архивный профиль, чтобы файл открылся
и через 15 лет.
Где встречается в IT и бизнесе
- Генерация документов на сервере. Счета, акты, отчёты, коммерческие
предложения. Типовой путь: шаблон в HTML → headless-браузер (wkhtmltopdf,
Puppeteer/Chrome) → PDF. Второй путь — библиотеки прямой отрисовки
(ReportLab в Python, iText в Java). - Полиграфия. Единственный общепринятый способ отдать макет в типографию —
PDF/X с вылетами и CMYK-профилем. Отправить типографии DOCX — почти гарантия
брака. - Юридически значимый документооборот. Подпись внутри файла:
международный стандарт PAdES, в России — квалифицированная подпись через
КриптоПро PDF и ГОСТ-алгоритмы. Ценность в том, что подпись «живёт» в самом
документе, а не в отдельном файле рядом. - Архивное хранение. Бухгалтерия, медкарты, проектная документация.
Требование обычно формулируется прямо: «PDF/A-2b, не ниже». - Извлечение данных. Огромный класс задач: вытащить таблицы из отчётов,
разобрать счета поставщиков, распарсить прайсы. Инструменты — pdftotext,
pdfplumber, Camelot, Tabula, а поверх всё чаще LLM. Работает всегда
«примерно», и на это надо закладывать процент ручной проверки. - Приём файлов от пользователей. Внешне простая задача — загрузка PDF в
админку — на деле требует проверки содержимого, а не только расширения:
под именемdogovor.pdfможет лежать что угодно.
Кто пользуется
Практически все. Несколько ориентиров:
- Adobe публично называет масштаб в триллионах существующих PDF-файлов;
точную цифру проверить невозможно, но порядок — сотни миллиардов и выше. - arXiv — свыше 2 миллионов научных препринтов, и основной формат выдачи
там PDF. - Google индексирует PDF с 2001 года; поисковый оператор
filetype:pdfдо
сих пор один из самых полезных приёмов, когда ищешь методичку или отчёт. - Chrome показывает PDF встроенным движком PDFium — Google открыла его
код в 2014 году, до этого он был коммерческим движком Foxit. То есть PDF
читает каждый пользователь Chrome, даже не устанавливая ничего. - DocuSign и подобные сервисы электронной подписи построены вокруг PDF;
DocuSign — это около миллиарда пользовательских аккаунтов по их собственным
заявлениям. - Госсектор почти любой страны: налоговые декларации, формы, выписки.
Альтернативы и конкуренты
HTML (+ CSS Paged Media)
Плюсы: живой, доступный, подстраивается под экран, легко генерируется,
индексируется поисковиками, бесплатен для всех.
Минусы: нет понятия «страница» в исходном виде, печать выглядит по-разному в
разных браузерах, не подписывается юридически, не годится для типографии.
DjVu
Плюсы: для сканов чёрно-белых книг сжимает в разы лучше PDF за счёт словаря
повторяющихся форм букв.
Минусы: практически умер — нет поддержки в браузерах и телефонах, экосистема
инструментов заброшена. Живёт в основном в библиотеках старых сканов.
EPUB
Плюсы: перетекающий текст, книга читается на телефоне человечно, внутри по
сути HTML.
Минусы: вёрстка не фиксирована, поэтому не годится ни для договора, ни для
печати, ни для документа со сложной вёрсткой.
XPS / OpenXPS (Microsoft, ECMA-388)
Плюсы: технически аккуратный формат, задумывался как прямой ответ PDF.
Минусы: проиграл всухую. Microsoft сама фактически свернула продвижение.
Хороший пример того, что победа формата — вопрос экосистемы, а не качества
спецификации.
TIFF (многостраничный)
Плюсы: индустриальный стандарт сканирования, прост как палка, не содержит
исполняемого кода.
Минусы: чистый растр — никакого текста, огромный размер, никакой интерактивности.
Когда НЕ стоит использовать
- Когда нужны данные, а не документ. Отдавать отчёт с цифрами в PDF —
значит заставлять получателя вытаскивать их обратно вручную. Есть расхожая
фраза: «PDF — это место, где данные умирают». Если на том конце цифры будут
считать — отдавай CSV, JSON или ссылку на таблицу, а PDF добавляй как
красивую обложку. - Когда читают с телефона. Лист A4 на экране 6 дюймов — это либо мелко,
либо бесконечное горизонтальное перетаскивание. Текст в PDF не перетекает.
Лонгрид, инструкция, справка для сотрудников — лучше веб-страницей. - Когда документ правят вдвоём и часто. PDF — формат результата, а не
процесса. Комментарии и правки в нём есть, но совместная работа в Google Docs
или Notion быстрее на порядок. Переводить в PDF стоит в самом конце. - Когда важна доступность. Нетегированный PDF для незрячего пользователя —
почти нечитаемая каша: программа чтения не знает порядок колонок. Если
документ публичный и обязан быть доступным, либо делай PDF/UA с разметкой,
либо публикуй HTML.
Связанные понятия
- PostScript — язык описания страниц Adobe (1984), прямой предок PDF;
полноценная программа, исполняемая принтером. - PDF/A — архивный профиль PDF (ISO 19005): запрещено всё, что может
перестать открываться со временем. - Tagged PDF — PDF с добавленным деревом структуры (заголовки, абзацы,
таблицы); основа доступности и вменяемого извлечения текста. - OCR (optical character recognition, оптическое распознавание символов) —
превращение картинки с буквами в настоящий текст; нужен для сканов в
PDF-обёртке. - Redaction (вымарывание) — настоящее удаление содержимого из документа, в
отличие от рисования чёрного прямоугольника сверху. - PAdES (PDF Advanced Electronic Signatures) — европейский стандарт ETSI,
описывающий, как правильно встраивать долгосрочную цифровую подпись в PDF. - Сабсеттинг шрифта (font subsetting) — встраивание в файл только реально
использованных глифов вместо целого шрифта.
Литература и источники
- ISO 32000-2 — действующий стандарт PDF 2.0. Adobe и PDF Association
выкладывают ознакомительные редакции; искать «PDF 2.0 specification
ISO 32000-2». - PDF Association — https://pdfa.org — отраслевая ассоциация, ведёт
разъяснения по профилям PDF/A, PDF/UA и по подписям. Самый вменяемый
неакадемический источник. - Wikipedia: PDF — https://ru.wikipedia.org/wiki/PDF и
https://en.wikipedia.org/wiki/PDF — английская версия заметно подробнее по
истории версий и структуре файла. - «The Camelot Project», John Warnock, 1991 — та самая записка на несколько
страниц, с которой всё началось. Легко находится по названию; читается за
десять минут и отлично показывает, как формулируют идею продукта. - Документация pdfplumber и pypdf (Python) — лучший способ понять формат
руками: открыть файл, вывести объекты, посмотреть координаты слов. - qpdf — утилита командной строки, умеет разворачивать PDF в читаемый вид
(qpdf --qdf --object-streams=disable in.pdf out.pdf). После этого файл
можно открыть текстовым редактором и увидеть структуру своими глазами.
Где встретилось у меня
Вчера в проекте клиентского сайта доделывали админку: раздел с документами
нужно было передать клиенту, чтобы он сам менял файлы, не возвращаясь к нам
за каждой заменой. Развилка была бытовая — подложить файл руками за пятнадцать
минут или потратить час-полтора и научить медиатеку принимать PDF с проверкой
содержимого и ограничением размера. Выбрали второе: разовая подкладка файла
сводит на нет весь смысл передачи раздела клиенту.
Краткое резюме
- PDF описывает не смысл документа, а готовую отрисованную страницу:
глифы в координатах, шрифты внутри файла. Отсюда и главное достоинство
(выглядит одинаково везде), и главные недостатки. - Родился из PostScript в 1991–1993 годах в Adobe; взлетел после того, как в
1994-м читалку сделали бесплатной; с 2008 года — открытый стандарт ISO 32000,
Adobe им больше не владеет. - Внутри — пронумерованные объекты плюс таблица
xrefв конце файла, которая
позволяет прыгнуть на любую страницу мгновенно. Правки часто дописываются
слоями в хвост, поэтому старое содержимое может оставаться внутри. - Извлечение текста и таблиц из PDF — всегда угадывание, потому что в файле нет
ни абзацев, ни таблиц, ни даже гарантированных пробелов. Закладывай процент
ошибок. - Не отдавай PDF, если на том конце будут считать цифры или читать с телефона.
Отдавай, когда важна фиксированная вёрстка, печать, подпись или архив.