pdf-parser: функции, ограничения и сценарии анализа PDF

pdf-parser — специализированный консольный инструмент Дидье Стивенса для разбора внутренней структуры PDF. Он не показывает страницы как обычная читалка и не редактирует текст в визуальном режиме: его задача — пройти по синтаксису документа, показать косвенные объекты, словари, ссылки, потоки, таблицы xref и трейлеры, а затем помочь найти, извлечь или проверить интересующие фрагменты. Такой подход особенно полезен при анализе подозрительных PDF, диагностике повреждённых документов и автоматизированном исследовании низкоуровневого содержимого.

ПараметрАктуальное состояние
Официальное имяpdf-parser.py; в справке программа называет себя pdf-parser
РазработчикDidier Stevens
Актуальная версия0.7.14; код датирован 7 марта 2026 года, релиз опубликован 13 марта 2026 года
ТипPython-скрипт командной строки для структурного анализа PDF
Основной вводPDF-файл, ZIP-файл с первым вложением, URL HTTP/HTTPS
Выводтекст в терминал, дамп потока, JSON со stream-объектами, генерируемый Python-код
Распространениеисходный код помещён автором в public domain; активации, подписки и пробного периода нет
Интерфейсанглоязычная командная строка
Обязательная средасовместимый Python; в исходнике указаны границы 2.5.1–3.13.9 как диапазон проверки версии
Опциональные зависимостиyara-python для YARA-проверок; pyzipper для AES ZIP; mPDF нужен только для запуска сгенерированных программ

Скачать pdf-parser

Бесплатно
В реестре российского ПО
Чистая установка

Новейшая версия для Виндовс, macOS и Линукс. Удобный редактор PDF под российские реалии.

⬇ Скачать PDF Commander бесплатно

⬇ Скачать pdf-parser

Безопаснее всего получать pdf-parser из официального репозитория DidierStevensSuite на GitHub либо через релизную запись автора и сверять версию внутри самого файла. На дату подготовки обзора актуальный исходник содержит номер 0.7.14 и дату 2026/03/07. Авторская запись о релизе 0.7.14 опубликована 13 марта 2026 года и содержит контрольные суммы архива: SHA-256 6A60223D52B75F8AFF8C8CF19A58699A20829AC758C251B405B08EC734EF6A4A и MD5 EB3808ACE5497B428138594AFDC5205F. Для проверки подлинности предпочтительнее использовать SHA-256.

У программы нет отдельного магазина приложений, мастера установки или официального пакета, который следовало бы искать по общему имени «pdf-parser». Это важно: одинаковое название встречается у сторонних библиотек и компонентов, поэтому установка случайного одноимённого пакета через менеджер зависимостей не равнозначна установке инструмента Дидье Стивенса. Надёжный ориентир — файл pdf-parser.py в официальном DidierStevensSuite, где автором указан Didier Stevens, а описание сформулировано как разбор PDF-документа.

Отдельных сборок для Windows, macOS и Linux автор не публикует: распространяется один pdf-parser.py. Поэтому платформа определяется совместимой средой Python и нужными опциональными модулями, а не отдельной редакцией программы.

Что такое pdf-parser

pdf-parser.py входит в набор инструментов DidierStevensSuite и предназначен для низкоуровневого разбора PDF. Это не SDK для встраивания в приложение, не веб-сервис и не настольный просмотрщик. Скрипт читает токены PDF, выделяет структурные элементы и выводит их в удобном для анализа виде. Он различает комментарии, секции xref, trailer, startxref и косвенные объекты, а для объектов показывает тип, ссылки и наличие stream.

Текущий статус — поддерживаемый автором инструмент. История в исходнике продолжается с 2008 года, а выпуск 0.7.14 в 2026 году исправляет совместимость вывода YARA-строк с актуальным API yara.StringMatch. Это важнее, чем внешний вид возраста проекта: продукт не заморожен и получает точечные исправления под современные версии Python и зависимостей.

Не следует смешивать pdf-parser с PDFiD того же автора. PDFiD делает быстрый инвентаризационный проход по потенциально значимым именам и статистике PDF, а pdf-parser даёт объектный разбор, поиск, извлечение и декодирование потоков. Эти инструменты дополняют друг друга, но не являются разными режимами одной программы.

Основные функции pdf-parser

Разбор объектов и навигация по структуре

Базовый запуск с одним PDF печатает структурные элементы документа: комментарии, xref, trailer, startxref и косвенные объекты. Для косвенного объекта выводятся его номер и поколение, тип, ссылки на другие объекты и словарь. Выбор конкретного объекта выполняется параметром -o; можно перечислить несколько идентификаторов через запятую. Параметр -r отбирает объекты, которые ссылаются на заданный идентификатор, а -t фильтрует по типу косвенного объекта.

Поиск по словарям, объектам и потокам

Параметр -s ищет строку в косвенных объектах вне stream-данных. Для поиска по ключам словарей есть -k. Отдельный режим —searchstream работает по потокам; к нему можно добавить —casesensitive для учёта регистра и —regex для регулярного выражения. По умолчанию поиск в stream пытается работать по декодированному содержимому, а —unfiltered переключает проверку на исходные байты потока.

Декодирование PDF-фильтров

Опция -f пропускает stream через поддерживаемые фильтры. В текущем исходнике явно перечислены FlateDecode, ASCIIHexDecode, ASCII85Decode, LZWDecode и RunLengthDecode, включая распространённые сокращённые имена. Если встречается другой фильтр, скрипт возвращает сообщение об unsupported filter, а не имитирует успешное декодирование. В коде CCITTFaxDecode и DCTDecode присутствуют лишь как закомментированные направления и не реализованы как рабочие декодеры.

Статистика и индикаторы интереса

Режим -a собирает статистику по документу: количество структурных элементов, типы косвенных объектов, идентификаторы объектов с потоками и список непривязанных объектов. Начиная с версии 0.7.8 статистика включает unreferenced objects. Также скрипт проверяет набор характерных PDF-имён: /JS, /JavaScript, /AA, /OpenAction, /AcroForm, /RichMedia, /Launch, /EmbeddedFile, /XFA и /URI. Дополнительные ключевые слова можно подмешивать через файл pdfid.ini рядом со скриптом.

Object Streams и современная упаковка объектов

Ключ -O включает разбор объектов, упакованных в /ObjStm. Скрипт извлекает stream объектного контейнера, строит синтетическое представление вложенных объектов и прогоняет его через собственный парсер. В авторской встроенной справке этот режим всё ещё помечен как экспериментальный, а в истории есть отдельное исправление /ObjStm в версии 0.7.10. Поэтому для современных PDF разумно сравнивать результат с запуском без -O и учитывать ошибки индекса у повреждённых или намеренно нестандартных файлов.

Хеши, дампы и сырой вывод

-H выводит хеши объектов, а при разборе выбранного stream показывает характеристики как нефильтрованного, так и фильтрованного содержимого. По умолчанию используется MD5, но переменная окружения DSS_DEFAULT_HASH_ALGORITHMS позволяет назначить другой алгоритм, например sha256. Для новых рабочих процессов SHA-256 практичнее использовать как основной идентификатор артефактов.

-d сохраняет содержимое stream в файл; значение «-» направляет бинарные данные в стандартный вывод. -w переключает вывод на raw-представление, -c показывает содержимое объектов, а -D добавляет диагностические данные. Параметр -x связан с извлечением malformed content — то есть фрагмента, который парсер не смог классифицировать нормальным образом.

YARA, декодеры и автоматизация

Параметр -y запускает YARA-правило по потокам; можно передать файл, каталог с правилами или список через @file. —yarastrings печатает совпавшие строки, а —unfiltered позволяет сканировать нераспакованный stream. Для этого требуется Python-модуль YARA; если он недоступен, скрипт прямо сообщает, что опция требует YARA Python module.

Механизм —decoders расширяет обработку пользовательскими Python-декодерами. Это мощная функция, но она имеет прямое последствие для безопасности: выбранный decoder-файл исполняется как Python-код через exec. Поэтому декодеры нельзя считать пассивными сигнатурами; подключать следует только доверенные файлы, происхождение которых проверено.

Опция -j или —jsonoutput создаёт JSON версии 2 в формате didierstevens.com. В элементы попадают объекты, содержащие streams, а содержимое кодируется base64. Опции -f и —overridingfilters влияют на то, попадёт ли в JSON декодированный или исходный поток. Это не полный универсальный JSON-снимок всей структуры PDF: для представления каждого объекта, trailer и семантики документа qpdf предоставляет более богатую JSON-модель.

-g генерирует Python-программу, способную создать разобранный PDF через модуль mPDF, а —generateembedded формирует программу, которая встраивает выбранный объект как файл. Эти режимы полезны для лабораторной реконструкции, но не являются редактором PDF: результатом становится исходный код, который затем требуется отдельно проверить и запустить в контролируемой среде.

Интерфейс и удобство использования

Интерфейс pdf-parser полностью терминальный. Основная рабочая зона — командная строка и поток текста stdout; отдельных панелей, вкладок, дерева объектов и визуального предпросмотра страниц нет. Встроенный -m выводит набор параметров и короткое руководство, причём сам автор отмечает, что manual остаётся work in progress. Интерфейс и справочные формулировки англоязычные.

Логика освоения строится от общего к частному: сначала статистика, затем номер интересного объекта, потом просмотр его словаря, декодирование stream и, если нужно, дамп в отдельный файл. Такой подход предсказуем для аналитика, привыкшего к shell, но порог входа выше, чем у графического PDF-инструмента. Пользователь должен понимать разницу между косвенным объектом, ссылкой, stream, фильтром, trailer и /ObjStm, иначе вывод будет выглядеть как набор служебных токенов.

Поддерживаемые форматы и совместимость

Фактический формат анализа один — PDF. В синтаксисе запуска также разрешены ZIP и URL, но это способы доставки PDF-входа, а не дополнительные документные форматы. Для ZIP скрипт открывает первый элемент архива и пытается применить пароль infected, распространённый в обмене образцами вредоносных файлов. После добавления поддержки pyzipper инструмент способен использовать AESZipFile, если соответствующий модуль установлен; без него применяется стандартный zipfile.

Экспортные формы ограничены задачей анализа. Текстовый stdout подходит для журнала и фильтрации shell-инструментами. Дамп stream сохраняет байты конкретного объекта. JSON упаковывает stream-объекты в base64. Генерируемый Python-код нужен для реконструкции. Нет экспорта в DOCX, XLSX, изображения страниц или OCR-текст; pdf-parser не пытается заменить конвертер или редактор.

Совместимость с PDF-фильтрами частичная: встроенное декодирование покрывает FlateDecode, ASCIIHexDecode, ASCII85Decode, LZWDecode и RunLengthDecode. Потоки с DCTDecode, CCITTFaxDecode и другими неподдерживаемыми цепочками могут быть показаны в сыром виде, но не обязаны декодироваться средствами самого скрипта. Аналогично отсутствует опция ввода пользовательского пароля PDF, поэтому зашифрованный документ не следует считать полноценно поддерживаемым для извлечения защищённого содержимого.

На уровне операционной системы формат поставки максимально переносим: это Python-файл. Однако именно исходник задаёт проверенный максимум Python 3.13.9. На более новой версии интерпретатора функция TestPythonVersion печатает предупреждение о том, что программа с такой версией не тестировалась, но не блокирует запуск, поскольку строгая проверка максимума по умолчанию не включена.

Производительность и стабильность

Автор не публикует официальных бенчмарков скорости, объёма RAM или предельного размера PDF, поэтому корректно оценивать можно архитектуру, а не выдуманные цифры. Парсер последовательно токенизирует документ и обрабатывает элементы в Python. Это означает, что параметры выбора объекта или типа главным образом уменьшают количество вывода; они не превращают разбор в произвольный доступ, который мгновенно перескакивает к объекту по таблице xref.

Ресурсоёмкость заметно зависит от операции. Обычный структурный проход работает постепенно, но декодирование stream требует держать данные потока в памяти. Режим -O создаёт синтетическую строку из содержимого /ObjStm и повторно парсит её. JSON-режим собирает элементы в список и затем сериализует все выбранные stream-данные, причём base64 увеличивает текстовый объём относительно исходных байтов. YARA-сканирование и пользовательские декодеры добавляют собственную стоимость к каждому проверяемому потоку.

Стабильность подтверждается длительной историей исправлений: в исходнике отмечены Python 3 fixes, обработка ошибок FlateDecode, корректировки /ObjStm, исправление регулярных выражений для Python 3.12 и изменения под yara.StringMatch. Одновременно список Todo и экспериментальная пометка -O показывают, что инструмент не следует воспринимать как безошибочный валидатор всей спецификации PDF. Повреждённые и намеренно обфусцированные файлы остаются сложным входом.

Лицензирование и версии

В исходном файле автор прямо указывает: source code put in public domain by Didier Stevens, no Copyright. У pdf-parser нет коммерческой редакции, тарифа, пробного периода, обязательной регистрации или активации. Цена как отдельная лицензия отсутствует: инструмент распространяется как исходный код и архив релиза.

Номер версии находится внутри скрипта. Текущая 0.7.14 — единая ветка продукта, а не «Free» и «Pro». Функции YARA или AES ZIP не открываются оплатой; они зависят от установленных сторонних Python-модулей. Это важно отличать от коммерческих PDF-редакторов, где OCR, пакетная обработка или расширенный экспорт могут быть частью платного плана.

Системные требования

Python и операционная система

В коде версии 0.7.14 указаны __minimum_python_version__ = 2.5.1 и __maximum_python_version__ = 3.13.9. Это встроенные границы проверки, а не рекомендация возвращаться к Python 2. Практический выбор для нового окружения — поддерживаемый Python 3 в пределах протестированного диапазона, прежде всего ветка 3.13.x. На версии выше 3.13.9 скрипт предупреждает, что она не тестировалась.

Отдельных минимальных требований к Windows, macOS, Linux, процессору, объёму RAM или диска автор для pdf-parser не публикует. Скрипт использует стандартные модули Python и содержит лишь точечную Windows-ветку для перевода stdout в бинарный режим при дампе. Поэтому аппаратные требования определяются размером анализируемого документа, режимом декодирования и выбранными зависимостями, а не официальной фиксированной цифрой.

Опциональные модули

Для YARA-режима нужен модуль yara-python. Актуальная публикация yara-python на PyPI описывает установку через pip и предоставляет сборки для современных Windows, Linux и macOS. Для AES-зашифрованных ZIP скрипт пробует импортировать pyzipper; актуальная ветка pyzipper 0.4.0 требует Python 3.4 или новее и позиционируется как совместимая замена zipfile с AES.

Для обычного парсинга PDF оба модуля необязательны. Если pyzipper не установлен, скрипт откатывается на стандартный zipfile. Если yara-python отсутствует, базовый анализ работает, но попытка задействовать -y завершится понятным сообщением о недостающем модуле. Для запуска кода, сгенерированного -g или —generateembedded, потребуется mPDF из экосистемы инструментов автора.

Карта критических зависимостей

ЗависимостьКогда нужнаЧто произойдёт без неё
Pythonвсегдаскрипт не запускается
yara-pythonопции -y и —yarastringsобычный разбор работает, YARA-режим недоступен
pyzipperAES ZIPиспользуется стандартный zipfile, AES-возможности pyzipper отсутствуют
mPDFзапуск программы, выведенной -g или —generateembeddedсам pdf-parser продолжает работать, но сгенерированный код не выполнится
pdfid.iniдобавочные ключевые слова статистикииспользуется встроенный набор /JS, /OpenAction и других имён
PDFPARSER_OPTIONSпостоянные ключи командной строкикаждый параметр приходится указывать явно
DSS_DEFAULT_HASH_ALGORITHMSсмена алгоритма для -Hпо умолчанию применяется MD5
Интернеттолько когда вход задан URLлокальные PDF и ZIP анализируются без сетевого доступа

Хронология развития и поддержки

2008–2010. Формируются базовый токенизатор, разбор stream, поиск, извлечение, хеширование и декодеры ASCIIHex, ASCII85, LZW и RunLength. Уже ранняя история показывает фокус не на визуальном отображении, а на внутренней структуре.

2013. Версия 0.4.0 добавляет HTTP/HTTPS-вход и ZIP с паролем infected; затем появляется поиск внутри stream с управлением регистром и регулярными выражениями. Это превращает утилиту из простого парсера в инструмент практического triage.

2014–2015. Добавляются генерация Python-кода, YARA, пользовательские decoders, —yarastrings и generateembedded. Начиная с этого периода pdf-parser становится заметно ближе к лабораторному анализатору подозрительных документов.

2018–2019. Появляются overridingfilters, статистика ключевых слов и поддержка /ObjStm через -O. В 0.7.3 можно выбирать несколько объектов через -o, появляется встроенная man-справка и переменная PDFPARSER_OPTIONS.

2022–2024. DSS_DEFAULT_HASH_ALGORITHMS позволяет изменить алгоритм хеширования; статистика начинает показывать непривязанные объекты. Версия 0.7.9 добавляет JSON output, а в 0.7.10 исправляется обработка /ObjStm. В код добавляется pyzipper для AES ZIP.

2025–2026. Следуют исправления регулярных выражений под Python 3.12 и YARACompile. Версия 0.7.14 обновляет работу —yarastrings под yara.StringMatch. Таким образом, проект поддерживает совместимость точечными правками, а не регулярными крупными релизами с новым UI.

Паспорт обратимости операций

Основной режим pdf-parser обратим по своей природе: скрипт читает входной PDF и пишет анализ в stdout, не перезаписывая исходный документ. Поиск, статистика, выбор объектов, YARA и печать словарей не создают изменений внутри PDF. Это важное преимущество для форензики, где исходный образец желательно сохранять неизменным.

Опция -d создаёт отдельный файл с содержимым stream. Откат в этом случае означает удалить созданный дамп; исходный PDF остаётся прежним. JSON через перенаправление shell и сгенерированный Python-код также являются отдельными артефактами. Однако команда пользователя может указать существующее имя выходного файла, а -d открывает его на запись, поэтому имя назначения нужно выбирать осознанно.

Преимущества и недостатки pdf-parser

Плюсы и минусы

• Точный объектный уровень. Видны косвенные объекты, ссылки, словари, xref, trailer и stream, а не только отрисованная страница.

• Гибкий поиск. Отдельные режимы для обычных объектов, словарей и потоков; есть регулярные выражения, raw-поиск и управление регистром.

• Извлечение без модификации оригинала. Дамп stream, хеши и JSON создают отдельные результаты.

• Поддержка аналитических сценариев. Статистика подозрительных PDF-имён, YARA и пользовательские декодеры полезны для malware analysis.

• Прозрачная модель распространения. Исходный код открыт и помещён автором в public domain, нет учётной записи и активации.

Минусы

• Нет графического просмотра. Нельзя визуально читать страницу, видеть миниатюры или править текст как в редакторе.

• Нужны знания PDF. Без понимания объектов, ссылок, фильтров и streams вывод легко интерпретировать неверно.

• Неполное декодирование фильтров. Поддерживаются пять основных семейств; другие цепочки могут остаться сырыми.

• Нет опции пароля PDF. Инструмент не позиционируется как средство дешифрования защищённых документов.

• -O остаётся экспериментальным. /ObjStm поддерживается, но сама встроенная manual-справка предупреждает об экспериментальном статусе.

• Пользовательские декодеры исполняют код. Нельзя безопасно подключать неизвестные .py только потому, что они названы decoder.

Сравнение с аналогами

ИнструментГлавная рольСильная сторонаОграничение относительно pdf-parser
pdf-parserфорензический разбор PDFобъекты, streams, поиск, статистика, YARA, дампынет визуального рендеринга и полноценного редактирования
PDFiDбыстрый triageкомпактная инвентаризация характерных PDF-имённе заменяет подробный просмотр и извлечение конкретных объектов
qpdfструктурная обработка и преобразование PDFполная JSON-модель, декриптование при наличии прав и пароля, нормализация структурыменее сфокусирован на YARA и малварном triage из коробки
mutool showинспекция объектов через MuPDFпечать объектов, stream, trailer, xref, страниц и JavaScript; есть repairдругой workflow, без встроенного набора YARA-проверок pdf-parser
Sumatra PDFграфический просмотр документовбыстрое чтение PDF и других форматов в Windowsне предназначен для низкоуровневого анализа объектов и извлечения stream

qpdf сильнее там, где анализ нужно связать с нормализацией, дешифрованием разрешённого документа, преобразованием структуры и полным JSON-представлением. Его JSON может описывать PDF-объекты и stream-данные настолько полно, что документ можно представить альтернативным синтаксисом и затем собрать обратно. pdf-parser JSON заметно уже, зато его CLI непосредственно ориентирован на объектный поиск, YARA и forensic triage.

mutool show — близкий по низкоуровневой инспекции конкурент: он умеет печатать выбранные объекты и потоки, trailer, xref, список страниц, document-level JavaScript и при необходимости принудительно ремонтировать документ перед показом. Если pdf-parser упирается в неподдерживаемый фильтр или повреждённую структуру, mutool нередко логично использовать для независимого второго чтения.

С Sumatra PDF прямое сравнение корректно только по цели пользователя. Sumatra — Windows-просмотрщик, который показывает страницы; pdf-parser — консольный анализатор, который показывает внутренние объекты. Для чтения книги, инструкции или отчёта Sumatra значительно уместнее. Для ответа на вопрос «какой объект содержит /OpenAction и что лежит в его stream» нужен pdf-parser. Если требуется уже не чтение и не форензика, а полноценное изменение документа, стоит смотреть в сторону PDF-XChange Editor или Adobe Acrobat Pro.

Инструкция по установке

Windows

Шаг 1. Получите pdf-parser.py из официального DidierStevensSuite или официального релиза автора. Не подменяйте его одноимённым случайным пакетом.

Шаг 2. Установите поддерживаемый Python 3. Для нового окружения предпочтительна ветка 3.13.x, поскольку исходник 0.7.14 указывает 3.13.9 как максимальную протестированную версию.

Шаг 3. В терминале проверьте интерпретатор командой py -3 —version или python —version.

Шаг 4. Перейдите в каталог со скриптом и выполните py -3 pdf-parser.py —version. Ожидаемый номер для рассматриваемой редакции — 0.7.14.

Шаг 5. Выведите встроенную справку командой py -3 pdf-parser.py -m. Это одновременно проверяет запуск и показывает доступные параметры.

Шаг 6. Если нужен YARA-режим, установите модуль в тот же интерпретатор: py -3 -m pip install yara-python. Для AES ZIP при необходимости добавьте py -3 -m pip install pyzipper.

macOS и Linux

Шаг 1. Сохраните официальный pdf-parser.py в рабочий каталог.

Шаг 2. Убедитесь, что доступен Python 3, командой python3 —version.

Шаг 3. Запустите python3 pdf-parser.py —version, затем python3 pdf-parser.py -m.

Шаг 4. Для YARA при необходимости используйте python3 -m pip install yara-python; для AES ZIP — python3 -m pip install pyzipper, желательно внутри virtualenv.

Шаг 5. Не требуется копировать скрипт в системные каталоги. Если нужно вызывать его из любого места, безопаснее настроить собственный каталог инструментов в PATH, чем менять системные Python-файлы.

Специального деинсталлятора нет: для удаления достаточно убрать pdf-parser.py из выбранного каталога. Опциональные yara-python и pyzipper удаляйте из окружения только если они не нужны другим Python-инструментам; отдельно проверьте пользовательские переменные PDFPARSER_OPTIONS и DSS_DEFAULT_HASH_ALGORITHMS.

Практические кейсы

Первичный triage подозрительного PDF

Цель. Найти объекты, которые заслуживают ручного анализа, не открывая документ в графическом просмотрщике. Подготовка. Работайте с копией файла в изолированной папке и зафиксируйте его внешний SHA-256 штатным системным средством. Шаги. Запустите python pdf-parser.py -a sample.pdf. Если документ использует object streams, повторите с -O и сравните список типов и ключевых слов. Обратите внимание на /JS, /JavaScript, /OpenAction, /Launch, /EmbeddedFile, /RichMedia и непривязанные объекты. Затем откройте конкретные номера через -o.

Проверка результата. Статистика должна указывать номера объектов, а повторный вызов -o — показывать их словарь и ссылки. Ограничение. Наличие подозрительного имени не доказывает вредоносность, а его отсутствие не гарантирует безопасность. Это навигация, а не антивирусный вердикт.

Извлечение и проверка stream

Цель. Сохранить содержимое интересующего потока в отдельный файл. Подготовка. Сначала просмотрите объект через python pdf-parser.py -o 12 sample.pdf и убедитесь, что он действительно содержит stream. Шаги. Для декодированного варианта используйте python pdf-parser.py -o 12 -f -d object12.bin sample.pdf. Для исходного представления уберите -f. При необходимости выполните тот же выбор с -H, чтобы получить характеристики потока.

Проверка результата. Сравните длину и хеш, зафиксируйте, был ли stream filtered или unfiltered. Ограничение. Если фильтр не поддерживается, -f вернёт диагностическое сообщение; в таком случае сохраняйте raw и декодируйте подходящим внешним инструментом. Не открывайте извлечённый бинарный файл двойным щелчком: он может оказаться исполняемым или иным опасным содержимым.

Поиск строки внутри сжатых потоков

Цель. Найти объекты по строке, которой нет в явном виде в PDF-файле. Подготовка. Определите строку или регулярное выражение и решите, нужен ли поиск после декодирования. Шаги. Выполните python pdf-parser.py —searchstream JavaScript sample.pdf. Для регулярного выражения добавьте —regex, для чувствительности к регистру — —casesensitive. Если нужно проверить сырые байты, добавьте —unfiltered.

Проверка результата. Скрипт печатает совпавшие объекты; каждый можно повторно запросить по -o и при необходимости дампить. Ограничение. Результат зависит от доступности декодера фильтра и от того, ищется ли filtered или raw-представление.

YARA-проверка потоков

Цель. Найти известные сигнатуры в содержимом stream. Подготовка. Установите yara-python и используйте только доверенный набор правил. Шаги. Запустите python pdf-parser.py -y rules.yar sample.pdf; при необходимости добавьте —yarastrings для позиций и значений совпадений. Для raw-потоков используйте —unfiltered. Пользовательские decoders добавляйте только тогда, когда их исходник проверен.

Проверка результата. Для совпадения выводятся имя YARA-правила, namespace и объект. Ограничение. Сигнатура зависит от представления потока и качества правил; отсутствие совпадения не означает, что документ безопасен.

Навигатор по сбоям

• Сообщение о непроверенной версии Python. Причина — интерпретатор выше 3.13.9. Для контролируемого анализа повторите запуск на Python 3.13.x и сравните результат.

• Option yara requires the YARA Python module. Установите yara-python именно в тот интерпретатор, которым запускается скрипт, затем проверьте импорт.

• Unsupported filter. Сохраните raw-stream без -f, установите тип фильтра из словаря и используйте qpdf, mutool либо специализированный декодер.

• Ошибка при -O. Повторите без object-stream parsing. Если документ повреждён, используйте mutool с repair или qpdf как независимый парсер, затем сравните структуру.

• Зашифрованный PDF. У pdf-parser нет опции ввода PDF-пароля. Если у вас есть право и пароль, предварительно создайте расшифрованную рабочую копию инструментом, который это поддерживает, и анализируйте уже её.

Контроль перед сохранением и передачей

• зафиксируйте хеш исходного PDF и не перезаписывайте образец;

• в имени дампа укажите номер объекта и признак filtered или raw;

• для -d выбирайте новый файл: скрипт открывает путь на запись и может перезаписать существующий;

• при JSON запишите, использовались ли -f, -O и overridingfilters;

• не считайте base64 обезвреживанием: JSON способен переносить реальный payload;

• если использовался custom decoder, приложите его хеш и источник, поскольку decoder выполняет Python-код;

Часто задаваемые вопросы

pdf-parser открывает PDF как обычная программа для чтения?

Нет. Он не рендерит страницы и не показывает документ как книгу или форму. Результат — структурные данные PDF в терминале. Для чтения нужен просмотрщик, например Sumatra PDF.

Нужно ли устанавливать pdf-parser через pip?

Нет. Официальный инструмент Дидье Стивенса распространяется как pdf-parser.py и в составе DidierStevensSuite. Команда pip install с общим именем может относиться к другому проекту. pip нужен только для отдельных зависимостей вроде yara-python или pyzipper.

Может ли программа распознать текст со скана?

Нет. OCR в функции pdf-parser не входит. Скрипт исследует PDF-синтаксис и streams, но не выполняет распознавание изображений страниц. Для OCR нужен отдельный продукт; визуальный редактор или OCR-пакет решает другую задачу.

Безопасно ли запускать pdf-parser на вредоносном PDF?

Он не является PDF-рендерером и не запускает документный JavaScript как сценарий страницы, но обрабатывает недоверенные бинарные данные, распаковывает streams и может подключать сторонние модули. Поэтому анализ образцов разумно выполнять в изолированной среде. Особенно критично не подключать неизвестные decoder.py: они исполняются как Python-код.

Чем jsonoutput отличается от qpdf JSON?

pdf-parser складывает в JSON stream-содержимое объектов и кодирует его base64, с учётом -f и overridingfilters. qpdf JSON описывает PDF существенно полнее, включая объектное представление и режимы, рассчитанные на обратное преобразование. Для передачи извлечённых потоков проще pdf-parser; для структурной сериализации сильнее qpdf.

Вывод

pdf-parser 0.7.14 — узкоспециализированный, но всё ещё актуально поддерживаемый инструмент для тех, кому нужно видеть PDF изнутри. Его сильная сторона — сочетание простого исходного Python-файла с объектным разбором, поиском по streams, декодированием основных фильтров, статистикой характерных PDF-имён, YARA и точечным экспортом. Для исследователя вредоносных документов, специалиста DFIR или разработчика, который разбирает странную структуру PDF, этот набор функций хорошо соответствует задаче.

Для обычного пользователя pdf-parser почти всегда будет неправильным выбором. Он не показывает страницы, не выполняет OCR, не редактирует текст и не предлагает мастер операций. Для чтения лучше Sumatra PDF или другой просмотрщик; для визуального изменения документа — Master PDF Editor или другой редактор; для полного JSON-представления и структурных преобразований — qpdf; для альтернативного просмотра объектов и repair — mutool.

Главные ограничения нужно учитывать заранее: -O экспериментален, набор встроенных PDF-фильтров ограничен, пароль PDF не принимается, а JSON не равен полной модели документа. Если эти границы совпадают с вашим сценарием, pdf-parser остаётся практичным инструментом точечного анализа. Если задача требует рендеринга, массового редактирования или гарантированного покрытия всей современной спецификации PDF, разумнее выбрать специализированную альтернативу и использовать pdf-parser как диагностический второй инструмент.


Ваш адрес email не будет опубликован. Обязательные поля помечены *