Один PDF, два читателя: люди видят страницы, машины получают чистый Markdown
Большинство PDF — это координатный суп, который LLM приходится реверс-инжинирить в заголовки и таблицы. Трюк Сартака Гауда прячет Markdown внутри 20-летней возможности PDF: страница выглядит для вас идентично, но экстрактор вытаскивает чистую структуру. Тред сразу спросил, что туда же может спрятать злоумышленник.
Адаптивные PDF прикрепляют замещающий текст в формате Markdown к содержимому PDF через последовательности marked-content — возможность в спецификации с PDF 1.4. Рендереры её игнорируют и показывают обычную страницу; экстракторы вроде PyMuPDF вместо этого получают чистые заголовки, списки и таблицы при накладных расходах размера ~до 10%.
Один Rust-разработчик мгновенно перевернул это: тот же слой, что кормит LLM чистой структурой, может скормить ей вредоносную инструкцию, которую человек никогда не увидит, — невидимый prompt injection в PDF вашего счёта за электричество.
PDF, который читается одним способом для вас и другим для машины

Пост Сартака Гауда исходит из знакомой боли: стандартные PDF не несут структуры. Экстрактору приходится реконструировать иерархию из сырых координат и размеров шрифта, а LLM, которой скармливают этот суп, угадывают, что заголовок, что таблица, что список. Лекарство Гауда — перестать заставлять их угадывать.
Трюк: замещающий текст из уголка спецификации 2001 года
Метод опирается на недоиспользуемую возможность PDF, доступную с PDF 1.4, — замещающий текст для маркированного содержимого. Гауд прикрепляет замещающий текст в формате Markdown к потоку содержимого через последовательности marked-content. Стандартные читалки этот слой игнорируют и рендерят страницу ровно как раньше; совместимый экстрактор (в посте демонстрируется PyMuPDF) вместо этого вытаскивает структурированную Markdown-версию. Один файл, два вывода, с накладными расходами размера обычно до 10%. Код — на github.com/iminoaru/adaptivepdf.
Местный завсегдатай-педант предложил поправку, которая на деле заостряет идею:
«PDF не будет выглядеть для меня иначе, чем для любого другого, кто на него смотрит… Просто извлечение текста… теперь вернёт структурированный (Markdown) текст. (Можно сказать, PDF меняется в зависимости от того, как вы его читаете.)» — комментатор, переосмысливший, что здесь значит „адаптивный“
Очевидное злоупотребление, найденное тредом за минуты
Где есть невидимый слой, там есть вектор инъекции. Rust-разработчик провёл черту прямо к нему:
«разве это также не значит, что в PDF легко вложить вредоносные инструкции специально для ИИ, которые обычный человек никогда не заметит?… Просто подумайте о PDF счёта за электричество, который вы даёте как подтверждение адреса компании, использующей LLM для извлечения этого адреса». — Rust-разработчик о риске скрытой инструкции
Читатели оспорили и посылку, что это новая земля. Тегированные PDF уже существуют и юридически обязательны для документов на госфинансировании в США по разделу 508 — просто соблюдение хромает. И одна поправка попала в фактическое утверждение:
«LaTeX — на самом деле один из лучших способов создавать тегированные PDF». — комментатор со ссылкой на проект тегирования в LaTeX
«Это имело значение и до ИИ»
Рамка, будто PDF понадобилось делать машиночитаемыми только сейчас, вызвала колкий отпор:
«это имело значение, и сильно. Формат PDF изначально был проприетарным и проектировался… чтобы препятствовать обычному извлечению текста». — fsckboy
Идея по-настоящему остроумна — обратно совместимый слой структуры, едущий на 20-летней возможности спецификации. Два открытых вопроса, всплывших в треде: будут ли экстракторы соблюдать её стабильно (Гауд признаёт, что поддержка неровная) и невидимый канал только-для-машины — это возможность или свежая поверхность атаки.
Получайте такие разборы каждый день
Главные истории Hacker News — на email, в Telegram или RSS.
Однострочный промпт, очищающий интерфейс от ИИ-шлака: „сделай как приложение на Qt“
Разработчик, называющий собственный вкус никаким, нашёл приём: попроси модель оформить страницу как десктопное приложение на Qt — и шлак почти испаряется. Тред объяснил, почему это работает, и поспорил, что Qt — просто шлак постарше.