Почему текст в PDF нельзя просто отредактировать
PDF описывает не текст, а страницу. Внутри лежат команды вида «взять шрифт F1 кеглем 11, встать в точку с координатами 72 и 708, нарисовать такие-то глифы». Ни абзаца, ни строки, ни даже слова в файле нет — есть последовательность отрисовок с координатами. Поэтому «поставить курсор и печатать» невозможно в принципе: печатать некуда, каждая буква уже стоит в своей точке, а места под новую никто не резервировал.
Коротко о цифрах
- Что хранится в файле
- глифы с координатами, а не абзацы и слова
- Ширина пробела при извлечении
- принимается за 0,4 кегля
- Зазор меньше половины пробела
- считается стыком внутри слова, пробел не ставится
- Максимум подставленных пробелов
- 8; более широкий зазор трактуется как колонка
- Порог разреза на столбцы
- больше половины кегля или разница кеглей больше 2 pt
- Стандартные шрифты PDF
- 14 штук с кодировкой WinAnsi, кириллицы в ней нет
Пробелов в файле может не быть вообще
Слова разделяются не символом пробела, а расстоянием: следующий кусок текста просто рисуется правее. Извлечение восстанавливает пробелы арифметикой. У нас ширина пробела принимается за 0,4 кегля; зазор меньше половины этой ширины считается стыком внутри слова и пробела не даёт, а больший делится на ширину пробела и округляется.
Число подставленных пробелов ограничено восемью. Широкий зазор — это уже не пробел, а колонка таблицы, и полсотни пробелов подряд разъезжаются, стоит строке поменять длину. По той же причине разрыв больше половины кегля считается границей столбца, и строка разрезается на самостоятельные фрагменты, каждый со своими координатами.
Строки собираются похожим образом — по близости по вертикали, и порог тут адаптивный. У мелкого текста ниже десяти пикселей он равен четверти высоты: иначе плотная таблица склеилась бы в одну строку. У обычного — 0,4 высоты, чтобы межстрочный интервал полтора не разорвал абзац на части.
Шрифт лежит внутри файла, и он неполный
Чтобы документ выглядел одинаково везде, шрифт вкладывают в PDF. Вкладывают почти всегда подмножеством — только те глифы, которые встретились в тексте. В договоре, где ни разу не попалась буква «ъ», её в файле физически нет, и напечатать её этим шрифтом не сможет ни один редактор.
У кириллицы к этому добавляется вторая проблема. Четырнадцать стандартных шрифтов PDF, которые не нужно вкладывать, кодируются таблицей WinAnsi: латиница, цифры и знаки препинания. Русской буквы там нет вообще, и попытка нарисовать её такой гарнитурой заканчивается не квадратиками, а прямой ошибкой кодирования. Поэтому любой инструмент, дописывающий кириллицу в PDF, вынужден вложить собственный шрифт — и новый текст будет выглядеть его гарнитурой, а не исходной.
Взять чужой шрифт из открытого файла и дописать в него недостающие глифы браузер не может: в файле лежит подмножество без нужных контуров, а лицензия на встраивание не даёт права переиздавать гарнитуру.
Что ломается при замене одной буквы
- Ширина. У каждого глифа своя метрика: «ш» шире «і» вдвое. Замена буквы меняет длину строки, а координаты соседних фрагментов остались прежними.
- Кернинг. В аккуратной вёрстке смещения между парами букв прописаны отдельными числами прямо в потоке. Новая пара этих чисел не получает и печатается ровным шагом — на крупном кегле это заметно.
- Перенос. Строка в PDF уже разбита и зафиксирована. Слово, ставшее длиннее, не переедет на следующую строку само — оно вылезет за поле или наедет на соседний столбец.
- Абзац и страница. Раз строки зафиксированы, добавленное предложение не вытолкнет последнюю строку на следующую страницу: перевёрстки не происходит нигде и никогда.
Что из этого следует практически
Правка на месте работает как заплатка: старое место закрашивается, новое печатается поверх. Это честно решает задачу «исправить дату или номер счёта» и плохо решает задачу «переписать абзац» — с каждой правкой расхождение с исходной вёрсткой растёт.
Если менять надо много, дешевле восстановить документ в редактируемом формате, поправить его там и собрать PDF заново: тогда переносы, ширины строк и разбивка на страницы пересчитаются целиком. Платой будет точность восстановления макета — конвертер угадывает структуру по тем самым координатам, из которых она была потеряна при создании файла.
Частые вопросы
Почему при копировании текста из PDF пропадают пробелы?
Потому что их там не было: разделение слов задано расстоянием, и программа восстанавливает пробелы по зазорам. Если у шрифта нестандартные метрики или строка собрана из множества мелких фрагментов, арифметика ошибается.
Почему из PDF копируются кракозябры?
Значит, в шрифте нет таблицы соответствия между кодами глифов и символами Unicode. Нарисовать страницу это не мешает — рисуются контуры, а не буквы, — но извлечь из неё осмысленный текст уже нечем.
Почему конвертация в редактируемый формат даёт кривой макет?
Конвертер восстанавливает структуру по координатам: где абзац, где таблица, где колонтитул. Эта информация была потеряна при создании PDF, и любое восстановление остаётся угадыванием, которое чаще всего спотыкается на таблицах.
Тогда зачем вообще нужен PDF?
Затем же, почему его тяжело править: он фиксирует страницу. Документ откроется одинаково на любом устройстве независимо от установленных шрифтов и настроек, и именно эта жёсткость мешает редактированию.