Skip to content

Repository files navigation

bpdf — Быстрая и легкая утилита для работы с PDF и документами

Версия Rust Платформа Language

bpdf — это консольный инструмент (CLI) на языке Rust для комплексной обработки PDF-файлов, изображений, текстовых документов и файлов Microsoft Office (Word, Excel, PowerPoint). Утилита ориентирована на высокую скорость, минимальный размер, надежность операций (атомарная запись) и гибкую автоматизацию (поддержка NDJSON, списков файлов и переменных окружения).


Возможности

  • Объединение (Merge): Склеивание PDF, обычных изображений, комиксов (CBZ), JPEG 2000/JPEG-LS/JPEG XR, HEIC/AVIF/PSD, RAW-снимков камер, электронных книг (EPUB, FB2, FB2.ZIP, HTMLZ), документов Word/Excel/PowerPoint/OpenDocument и текстовых файлов в единый PDF или текстовый файл.
  • Многостраничные изображения и комиксы: Все страницы TIFF, архивы CBZ (с естественной сортировкой страниц) и все кадры GIF/APNG/анимированного WebP становятся отдельными страницами PDF при merge.
  • Распознавание текста (OCR) и создание Searchable PDF: Извлечение текста со сканов, картинок и PDF в Markdown или создание PDF с невидимым текстовым слоем (-o searchable.pdf) через облачный Groq Vision (Qwen / Llama) или нативный локальный Windows Media OCR (без API-ключей и интернета).
  • Оглавление и закладки (Bookmarks): Автоматическое построение дерева закладок PDF Outlines при объединении файлов (merge --bookmarks).
  • Умное кеширование OCR: Content-addressed кеш на диске (SHA-256 хэш изображения + модель/движок + промпт). Повторные вызовы и параллельные потоки выполняются мгновенно без обращения к сети.
  • Поддержка сетевых прокси: Работа через HTTP и SOCKS5 прокси для обхода блокировок или корпоративных ограничений.
  • Печати и штампы: Наложение прозрачных PNG (или JPEG) изображений с точной позиционировкой (br, center, координаты в мм), настройкой масштаба, прозрачности и выбором слоя (over, under, auto).
  • Форматирование и приведение страниц: Приведение к стандартам A4/Letter, центрирование содержимого, единая ориентация по большинству страниц и сохранение исходных размеров страниц PDF (none/original/keep).
  • Очистка метаданных (Strip): Удаление EXIF-метаданных из JPEG/PNG без перекодирования пикселей, очистка метаданных PDF Info / XMP и конвертация внешних FFmpeg-форматов и RAW-снимков в чистое JPEG.
  • Редактирование PDF: Разбиение на страницы (split), извлечение диапазонов (extract), поворот (rotate), изменение размера (resize), оптимизация структуры и изображений по DPI (optimize), в том числе с подгонкой под заданный размер файла (--max-size).
  • Нумерация и водяные знаки: Номера страниц по шаблону (number) и текстовые водяные знаки вроде «КОПИЯ» (watermark); текст остаётся горизонтальным и на повёрнутых страницах.
  • Фотографии с телефона: Ориентация из EXIF учитывается при сборке PDF, конвертации и OCR; снимки не ложатся набок.
  • Скорость: Файлы в пакетных командах и картинки внутри PDF обрабатываются параллельно на всех ядрах (до 8 потоков).
  • Безопасное изменение in-place: Атомарная запись через временный файл; правила перезаписи исходников описаны в разделе Правила перезаписи файлов.
  • Метаданные PDF Info: Просмотр (metadata show) и редактирование (metadata set) полей Title, Author, Subject, Keywords, Creator.
  • Диагностика (doctor): Проверка конфигурации, доступности внешних утилит (ffmpeg, powershell, MS Office) и проверка API Groq без расхода лимитов OCR.
  • Автоматизация и Total Commander: Полная оптимизация для работы с Total Commander (готовая панель кнопок bpdf.bar, встроенные иконки под каждое действие, поддержка списков файлов @"%UL" и %P%N). Поддержка тихих пакетных скриптов (--quiet), потокового вывода NDJSON (--json), шаблонов (globs *.jpg), естественной сортировки (scan_1.jpg, scan_2.jpg, scan_10.jpg) и файловых манифестов (@list.txt).

Требования и внешние зависимости

  • ОС: Windows 10 / 11 (x64) или Linux / macOS.
  • Внешние форматы изображений: Для HEIC/HEIF, AVIF, PSD, JPEG 2000/JPEG-LS, DDS, EXR, HDR, QOI, TGA, PCX, PNM, SGI, XBM, DPX, FITS и других редких растров требуется установленный ffmpeg в системном PATH либо параметр --ffmpeg C:\path\to\ffmpeg.exe. Фактический набор декодеров зависит от сборки FFmpeg.
  • Системные форматы Windows: JPEG XR/HD Photo (.jxr, .wdp, .hdp) и ICO декодируются через встроенные кодеки Windows Imaging Component.
  • RAW-снимки камер: По умолчанию снимки .cr2, .cr3, .nef, .arw, .dng, .raf, .orf, .rw2 и другие мгновенно обрабатываются в Pure Rust путём извлечения полноразмерного встроенного превью от процессора камеры (кроссплатформенно: Windows, Linux, macOS). Полная проявка сенсора через Windows Imaging Component включается опцией raw_develop = true в config.toml (требует Microsoft Raw Image Extension: winget install --id 9NCTDW2W1BH8 -s msstore).
  • Конвертация Office/OpenDocument: Для точного рендеринга DOC/DOCX/RTF/ODT, XLS/XLSX/ODS и PPT/PPTX/PPS/PPSX/ODP в Windows используется MS Office через COM-автоматизацию. Если MS Office не установлен или запуск на Linux/macOS, автоматически срабатывает встроенный Pure-Rust fallback, который извлекает форматированный текст и заглавия из XML-структур документов без сторонних зависимостей.
  • Groq Vision OCR: Groq API Key требуется только для распознавания изображений; извлечение готового текстового слоя PDF работает без ключа. Ключ задаётся в config.toml, в том числе через %GROQ_API_KEY%.

Сборка и установка

Сборка через Cargo

cargo build --release
cargo test --all-targets

На Windows сборка не требует C/C++ компилятора (TLS — системный SChannel). На Linux/macOS для TLS используется rustls с ring, которому нужен C-компилятор (cc/clang).

Готовая сборка под Windows (релизный скрипт)

Для создания оптимизированного EXE со встроенными ресурсами Windows (иконка, манифест длинных путей, версии):

.\build.bat

Скрипт выполнит:

  1. Подготовку и проверку многослойной иконки (16x16 – 256x256 px; готовые ресурсы переиспользуются).
  2. Считывание версии из Cargo.toml.
  3. Компиляцию манифеста, версии и иконки через rc.exe (Windows SDK).
  4. Оптимизированную сборку cargo build --release --locked.
  5. Упаковку бинарного файла, файла конфигурации и документации в директорию dist.

Глобальные флаги

Глобальные ключи могут передаваться перед любой подкомандой:

  • --config <PATH> — Путь к файлу конфигурации (по умолчанию ищется config.toml в текущем каталоге или рядом с bpdf.exe).
  • --quiet — Тихий режим. Подавляет вывод прогресса и информационных сообщений (конфликтует с --json).
  • --json — Потоковый режим вывода NDJSON (выводит события и результаты в формате JSON, по одному объекту на строку).
  • --fail-fast — Остановить пакетную команду после первой ошибки. Без этого флага остальные файлы обрабатываются, выводится итоговая сводка, а при наличии ошибок процесс завершается с ненулевым кодом.
  • -h, --help — Вывести справочную информацию.
  • -V, --version — Вывести версию программы.

Команды и параметры

1. bpdf merge

Объединяет PDF-файлы, изображения, документы Office и текстовые файлы в один документ.

bpdf merge <INPUTS>... [OPTIONS]

Параметры:

  • <INPUTS>... — Список входных файлов, папок, масок (*.jpg), диапазонов (doc.pdf:1-5) или файлов-списков (@list.txt). (Обязательный).
  • -o, --out <PATH> — Путь к выходному файлу. Если не указан, имя генерируется автоматически (например, document_merged.pdf).
  • -s, --size <SIZE> — Размер страницы PDF. Значения: A4, Letter, либо none/original/keep, чтобы не менять размеры страниц входных PDF.
  • --auto-rotate[=true|false] — Поворачивать страницы к ориентации большинства страниц документа. При равенстве используется ориентация первой страницы; без ключа действует значение auto_rotate из конфигурации.
  • --no-rotate — Не поворачивать страницы и сохранять книжную или альбомную ориентацию каждой страницы даже при приведении к A4/Letter. Переопределяет auto_rotate из конфигурации и не может использоваться одновременно с --auto-rotate.
  • --stamp <PATH> — Путь к PNG-изображению для наложения штампа/печати.
  • --stamp-pos <POS> — Позиция штампа: br (bottom-right), bl, tr, tl, c (center), tc, bc, l, r или смещение X,Y в миллиметрах от правого нижнего угла (для отрицательных значений используйте --stamp-pos="-X,Y").
  • --stamp-dpi <DPI> — Физическое разрешение штампа в DPI (автоматически считывается из PNG-файла, если сохранено сканером/Photoshop; по умолчанию 96.0).
  • --stamp-scale <SCALE> — Множитель масштаба штампа (по умолчанию 1.0 при известном/указанном DPI; 0.0 — автоподбор до 25% страницы).
  • --stamp-op <OPACITY> — Прозрачность штампа от 0.0 (прозрачный) до 1.0 (непрозрачный).
  • --stamp-pages <PAGES> — Страницы для штампа (all, first, last, 1-5, even, odd).
  • --stamp-mode <MODE> — Режим наложения штампа: auto (под текст, если есть шрифты), over (поверх содержимого), under (под содержимым).
  • --stamp-blend <MODE> — Режим наложения цвета (normal, multiply, screen, overlay и др.; multiply для реалистичных чернил).
  • --keep-icc[=true|false] — Сохранять цветовые профили ICC у изображений (по умолчанию false для уменьшения размера).
  • --optimize[=true|false] — Оптимизировать структуру PDF и уменьшать слишком большие встроенные изображения до image_dpi из конфигурации; JPEG кодируется с jpeg_quality.
  • --strip-meta[=true|false] — Удалять метаданные из итогового документа.
  • --max-size <SIZE> — Максимальный размер итогового PDF (10MB, 500KB, 1.5МБ). Разрешение и качество картинок понижаются ступенями, пока файл не уложится; если это невозможно, выводится ошибка с достижимым минимумом и файл не создаётся.
  • --bookmarks[=true|false] — Создавать оглавление/закладки (PDF Outlines) для каждого объединяемого файла.
  • --author <STRING> — Указать имя автора в свойствах PDF.
  • --creator <STRING> — Указать программу-создателя в свойствах PDF.
  • --ffmpeg <PATH> — Путь к FFmpeg для внешних форматов изображений и резервного декодирования.

2. bpdf ocr

Распознает текст с документов и изображений с помощью облачного Groq Vision OCR или встроенного локального Windows Media OCR. При сохранении в .pdf автоматически создаёт Searchable (Sandwich) PDF с невидимым текстовым слоем поверх сканов.

bpdf ocr <INPUTS>... [OPTIONS]

Параметры:

  • <INPUTS>... — Входные файлы (JPG, PNG, PDF, RAW и др., включая диапазоны страниц для PDF: doc.pdf:1-5), папки или маски. (Обязательный).
  • -o, --out <PATH> — Путь к итоговому файлу:
    • Если расширение .pdf (например -o searchable.pdf) — создаётся Searchable PDF с текстовым слоем.
    • С любым другим расширением (например -o all.md) — один общий Markdown-файл по всем входам.
    • Без -o — отдельный .md рядом с каждым входным файлом.
  • --in-place — Встроить распознанный текстовый слой (Searchable PDF) прямо в исходный PDF-файл на месте (перезаписывает файл, конфликтует с -o/--out, применимо только к PDF).
  • --engine <ENGINE> — Движок распознавания: groq, windows (или winocr), auto.
  • --lang <LANG> — Языковой тег для Windows OCR (например, ru, en-US).
  • --proxy <URL> — Прокси-сервер (http://... или socks5://...).
  • --model <NAME> — Модель Groq Vision (по умолчанию qwen/qwen3.6-27b).
  • --prompt <TEXT> — Кастомный текстовый промпт для модели.
  • --endpoint <URL> — URL конечной точки Groq API.
  • --force-ocr — Принудительно выполнять OCR через нейросеть, даже если у PDF есть извлекаемый текстовый слой.
  • --jobs <NUM> — Количество параллельных запросов OCR (от 1 до 64; по умолчанию — ocr_jobs из конфигурации, без конфигурации 1).
  • --no-cache — Отключить дисковый кеш OCR.
  • --cache-dir <PATH> — Путь к каталогу кеша OCR.
  • --ffmpeg <PATH> — Путь к FFmpeg для внешних форматов изображений и резервного декодирования.

3. bpdf split

Разбивает многостраничный PDF на отдельные одностраничные PDF-файлы.

bpdf split <INPUT> [OUTPUT_DIR]

Параметры:

  • <INPUT> — Исходный PDF-файл.
  • [OUTPUT_DIR] — Директория для сохранения страниц. По умолчанию — папка исходного файла. Файлы называются <имя>_01.pdf, <имя>_02.pdf, … (число цифр зависит от количества страниц).

4. bpdf extract

Извлекает указанные страницы из PDF в новый PDF-файл.

bpdf extract <INPUT> <PAGES> [OUTPUT]

Параметры:

  • <INPUT> — Исходный PDF-файл.
  • <PAGES> — Диапазон страниц (например: 1-5,8, first, last, even, odd).
  • [OUTPUT] — Имя нового файла (по умолчанию doc_extracted.pdf). Не может совпадать с исходным файлом.

5. bpdf inspect

Показывает диагностическую информацию о PDF (версия, количество страниц, шрифты, изображения).

bpdf inspect <INPUT> [--text]

Параметры:

  • <INPUT> — Исходный PDF-файл.
  • --text — Дополнительно извлечь и выдать текстовый слой.

6. bpdf strip

Удаляет метаданные из JPEG, PNG и PDF (in-place по умолчанию). Неподдерживаемые форматы автоматически пропускаются без ошибки.

bpdf strip <INPUTS>... [OPTIONS]

Параметры:

  • <INPUTS>... — Файлы или папки для очистки (JPEG, PNG, PDF; остальные пропускаются).
  • -o, --out <PATH> — Выходной файл или папка (допустимо только при одном входном файле). Если -o не указан, очистка выполняется in-place.
  • --keep-icc[=true|false] — Сохранять цветовой профиль ICC.
  • --ffmpeg <PATH> — Принимается для совместимости; strip не декодирует изображения и FFmpeg не использует.

7. bpdf rotate

Поворачивает страницы PDF или изображения JPEG на угол, кратный 90 градусам, либо приводит их к указанной ориентации (portrait или landscape). Неподдерживаемые форматы в папках пропускаются.

bpdf rotate <INPUTS>... <DEGREES> [-p <PAGES>] [-o <OUT>]
bpdf rotate <INPUTS>... --orient <landscape|portrait> [-p <PAGES>] [-o <OUT>]

Параметры:

  • <INPUTS>... — Исходные PDF-файлы или картинки JPEG.
  • <DEGREES> — Угол поворота по часовой стрелке в градусах (90, 180, 270, -90 и т.д., обязателен, если не указан --orient).
  • --orient <MODE> — Целевая ориентация (portrait или landscape, конфликтует с <DEGREES>).
  • -p, --pages <PAGES> — Страницы для поворота (по умолчанию all, применимо только к PDF).
  • -o, --out <PATH> — Выходной файл или папка (перезапись на месте по умолчанию, если не указано).

8. bpdf resize

Масштабирует и центрирует страницы PDF на листе формата A4 или Letter, либо изменяет размер изображений JPEG по --long-edge / --short-edge / формату листа. Неподдерживаемые форматы в папках пропускаются.

bpdf resize <INPUTS>... [-s <SIZE>] [--long-edge <PX>] [--short-edge <PX>] [-o <OUT>]

Параметры:

  • <INPUTS>... — Исходные PDF-файлы или картинки JPEG.
  • -s, --size <SIZE> — Целевой формат страницы PDF (A4 или Letter, по умолчанию A4).
  • --long-edge <PX> — Изменить размер картинки так, чтобы длинная сторона была не больше указанного значения в пикселях.
  • --short-edge <PX> — Изменить размер картинки так, чтобы короткая сторона была не меньше указанного значения в пикселях.
  • -p, --pages <PAGES> — Выбранные страницы PDF (по умолчанию all).
  • -o, --out <PATH> — Выходной файл или папка (перезапись на месте по умолчанию).

9. bpdf text

Быстро извлекает текстовый слой из PDF без использования сторонних сервисов и сети.

bpdf text <INPUT> [-o <OUT>]

Параметры:

  • <INPUT> — Исходный PDF-файл.
  • -o, --out <PATH> — Сохранить результат в файл вместо вывода в стандартный поток (stdout).

10. bpdf stamp

Накладывает штамп (PNG с прозрачностью или JPEG) на существующий PDF-документ.

bpdf stamp <INPUT> <STAMP> [OPTIONS]

Параметры:

  • <INPUT> — Исходный PDF-файл.
  • <STAMP> — Путь к изображению штампа (PNG, JPEG, BMP, GIF, WebP).
  • -o, --out <PATH> — Выходной PDF (укажите -o input.pdf для перезаписи на месте).
  • --position <POS> — Позиционирование: br, bl, tr, tl, c, tc, bc, l, r или смещение X,Y в мм от правого нижнего угла (для отрицательных значений используйте --position="-X,Y").
  • --dpi <DPI> — Физическое разрешение штампа в DPI (автоматически считывается из PNG pHYs или JPEG JFIF/EXIF, если сохранено сканером/Photoshop; по умолчанию 96.0).
  • --scale <SCALE> — Множитель масштаба (по умолчанию 1.0 при известном/указанном DPI; 0.0 — автоподбор до 25% страницы).
  • --opacity <OPACITY> — Прозрачность от 0.0 до 1.0 (по умолчанию 1.0).
  • --pages <PAGES> — Диапазон страниц (по умолчанию all).
  • --mode <MODE> — Режим слоев (auto, over, under).
  • --blend <MODE> — Режим наложения цвета (normal, multiply, screen, overlay и др.; multiply идеален для реалистичных печатей поверх документов).

Примеры:

# Наложение печати на последнюю страницу в левый нижний угол с реалистичным смешиванием чернил
bpdf stamp "Доверенность.pdf" "stamp.png" --position="-130,30" --mode over --blend multiply --pages last -o "Доверенность_с_печатью.pdf"

# Наложение штампа на все страницы поверх документов из 1C/Word (не перекрывая черный текст)
bpdf stamp invoice.pdf stamp.png --position br --blend multiply -o invoice.pdf

11. bpdf optimize

Выполняет структурную оптимизацию PDF (удаление мусорных объектов, сжатие потоков) и уменьшает встроенные растровые изображения до разрешения image_dpi из конфигурации относительно размера страницы. Для merge и optimize используется один расчёт размера. JPEG перекодируется с качеством jpeg_quality; значение image_dpi = 0 отключает уменьшение картинок, но оставляет структурную оптимизацию.

bpdf optimize <INPUT> [-o <OUT>] [--max-size <SIZE>]

Параметры:

  • <INPUT> — Исходный PDF-файл.
  • -o, --out <PATH> — Выходной файл (укажите -o input.pdf для изменения на месте).
  • --max-size <SIZE> — Уложить файл в заданный размер (10MB, 500KB): разрешение и качество JPEG понижаются ступенями (от 300 DPI / 85 до 72 DPI / 35), картинки пережимаются, только если становятся меньше. Удобно для порталов с ограничением размера вложений.

Изображения, которые фактически серые (сканы чёрно-белых документов в RGB), кодируются как одноканальные DeviceGray. Изображение с цветной печатью или подписью остаётся цветным.

12. bpdf metadata

Управление метаданными PDF Info (Title, Author, Subject, Keywords, Creator).

Просмотр метаданных (metadata show):

bpdf metadata show <INPUT>

Изменение метаданных (metadata set):

bpdf metadata set <INPUT> [OPTIONS]
  • -o, --out <PATH> — Выходной файл (укажите -o input.pdf для изменения на месте).
  • --title <STRING> — Название документа.
  • --author <STRING> — Автор.
  • --subject <STRING> — Тема.
  • --keywords <STRING> — Ключевые слова.
  • --creator <STRING> — Программа-создатель.

13. bpdf convert

Конвертирует изображения (включая многостраничные TIFF, JPEG 2000/JPEG-LS/JPEG XR/ICO и редкие FFmpeg-форматы) в JPEG. Многостраничные TIFF-документы автоматически распаковываются на отдельные JPEG-файлы для каждой страницы. Для анимаций (GIF, WebP) берется только первый кадр.

При передаче PDF-файлов команда по умолчанию извлекает с каждой страницы самое крупное встроенное изображение (идеально для сканов); JPEG-картинки сохраняются без перекодирования. Если на страницах есть шрифты (текстовые документы), программа автоматически переключается на рендер страниц в JPEG. Рендер доступен только на Windows (встроенный рендерер PDF).

bpdf convert <INPUTS>... [OPTIONS]

Параметры:

  • <INPUTS>... — Исходные изображения или PDF-файлы (включая диапазоны страниц для PDF: doc.pdf:1-5).
  • -o, --out <PATH> — Директория назначения для сохранённых JPEG-файлов.
  • --render — Для PDF: принудительно рендерить страницы в JPEG вместо извлечения встроенных картинок (полезно для принудительного рендера сканов). Диапазон страниц во входе (doc.pdf:2-4) учитывается и при рендере; файлы называются по номерам страниц.
  • --long-edge <PX> — Максимальный размер длинной стороны изображения.
  • --short-edge <PX> — Минимальный размер короткой стороны изображения.
  • --orient <MODE> — Принудительная ориентация (landscape или portrait).
  • -q, --quality <0-100> — Качество JPEG (переопределяет глобальный конфиг).
  • --keep-icc[=true|false] — Сохранять цветовые профили ICC.
  • --ffmpeg <PATH> — Путь к FFmpeg для внешних форматов изображений и резервного декодирования.
  • --force — Разрешить замену уже существующих выходных файлов, включая конвертацию на месте. Коллизии, при которых два входных файла дают один выходной путь, запрещены даже с --force.

14. bpdf doctor

Проверяет окружение, валидность конфигурации, доступность утилит, декодеров RAW (Pure Rust / WIC) и ключей API.

bpdf doctor

Проверка API Groq выполняется безопасным запросом списка моделей без отправки изображений и списания OCR-лимитов. Ключи API и учетные данные в выводе маскируются.

15. bpdf number

Проставляет номера страниц. Текст всегда горизонтален относительно отображаемой страницы, в том числе на повёрнутых (/Rotate) страницах; шрифт встраивается подмножеством.

bpdf number <INPUT> [OPTIONS]

Параметры:

  • -o, --out <PATH> — Выходной PDF (по умолчанию <имя>_numbered.pdf; -o input.pdf — на месте).
  • --format <TEXT> — Шаблон: {n} — номер страницы, {total} — последний номер (по умолчанию {n}).
  • --position <POS> — Позиция, как у штампа (по умолчанию bc — по центру снизу).
  • --size <PT> — Размер шрифта (по умолчанию 10).
  • --start <N> — Номер первой страницы (по умолчанию 1).
  • --pages <PAGES> — Какие страницы нумеровать (по умолчанию all).
  • --color <COLOR> — black, gray, red, blue, green, white или #RRGGBB.
  • --opacity <0-1> — Непрозрачность (по умолчанию 1).

16. bpdf watermark

Накладывает текстовый водяной знак (например, «КОПИЯ»).

bpdf watermark <INPUT> <TEXT> [OPTIONS]

Параметры:

  • -o, --out <PATH> — Выходной PDF (по умолчанию <имя>_watermarked.pdf).
  • --size <PT> — Размер шрифта; 0 (по умолчанию) — подобрать под страницу.
  • --angle <DEG> — Угол против часовой стрелки (по умолчанию 45).
  • --position <POS> — Позиция (по умолчанию c).
  • --color <COLOR> — Цвет (по умолчанию gray).
  • --opacity <0-1> — Непрозрачность (по умолчанию 0.3).
  • --pages <PAGES> — Страницы (по умолчанию all).
  • --under — Рисовать под содержимым страницы.

Примеры:

bpdf number report.pdf --format "Стр. {n} из {total}" -o report.pdf
bpdf watermark contract.pdf "КОПИЯ" --color red --opacity 0.25 -o contract_copy.pdf

Форматы входа и селекторы страниц

Форматы изображений

  • Встроенный Rust-декодер используется для JPEG, PNG, BMP, GIF, WebP и APNG. TIFF на Windows декодируется через Windows Imaging Component, на остальных ОС — встроенным декодером. Для BMP/GIF/WebP/APNG при ошибке встроенного декодера автоматически пробуется FFmpeg.
  • Текстовые файлы и FB2 читаются с учётом BOM и XML-декларации кодировки; файлы без неё, не являющиеся UTF-8, читаются как Windows-1251.
  • Через FFmpeg обрабатываются HEIC/HEIF, AVIF, PSD, JPEG 2000 (.jp2, .j2k, .j2c, .jpc, .jpf, .jpx), JPEG-LS (.jls), DDS, EXR, HDR, QOI, TGA, PCX, PNM (.pnm, .ppm, .pgm, .pbm, .pam), SGI, XBM, DPX, FITS (.fits, .fit, .fts), PGX, Sun Raster, XWD и PIX. Берётся первый видеопоток и первый кадр.
  • Ориентация фотографий из EXIF учитывается: в PDF снимок встраивается без перекодирования и разворачивается матрицей отрисовки, при конвертации в JPEG сохраняется только тег ориентации (остальной EXIF удаляется), при перекодировании пиксели поворачиваются.
  • Через встроенные кодеки Windows Imaging Component обрабатываются JPEG XR/HD Photo (.jxr, .wdp, .hdp) и ICO. Для ICO выбирается изображение с наибольшим разрешением.
  • Снимки фотокамер .3fr, .arw, .bay, .cr2, .cr3, .crw, .dcr, .dng, .erf, .fff, .gpr, .iiq, .k25, .kdc, .mef, .mos, .mrw, .nef, .nrw, .orf, .pef, .raf, .raw, .rw2, .rwl, .sr2, .srf, .srw и .x3f по умолчанию декодируются в Pure Rust без внешних утилит и кодеков через извлечение полноразмерного аппаратного JPEG-превью камеры. При необходимости полной проявки сенсора на Windows через WIC используется опция raw_develop = true в config.toml.
  • При merge все логические страницы TIFF и все кадры GIF/APNG/анимированного WebP добавляются в PDF по порядку. Ограничение безопасности — не более 10 000 кадров из одного файла. convert раскладывает многостраничный TIFF на отдельные JPEG, а для анимаций, как и ocr, берёт первый кадр.
  • JPEG XL не заявлен как поддерживаемый: декодер JXL отсутствует во многих сборках FFmpeg.

Электронные книги и текстовые форматы

  • Электронные книги: .epub, .fb2, .fb2.zip, .htmlz (распаковка архивов, автоизвлечение структуры глав, заголовков и метаданных Title/Author при конвертации в PDF). .zip распознаётся по содержимому: EPUB, FB2, HTMLZ или архив изображений (как .cbz).
  • Word: .doc, .docx, .rtf, .odt.
  • Excel: .xls, .xlsx, .ods.
  • PowerPoint: .ppt, .pptx, .pps, .ppsx, .odp.
  • Текст: .md, .txt, .json, .jsonc, .xml, .yaml, .yml, .log, .ini, .cfg, .csv, .tsv, а также любые другие текстовые файлы и файлы исходного кода (.rs, .py, .c, .cpp, .js, .sql, LICENSE, .env и т.д.), автоопределяемые по содержимому (UTF-8 или однобайтовая кодировка без управляющих символов).
  • Если все входы текстовые, по умолчанию они объединяются как текст. Явный выход -o result.pdf включает рендеринг текста в PDF.

Синтаксис диапазонов страниц

В командах extract, rotate, resize, stamp, number, watermark, а также непосредственно во входных путях (doc.pdf:1-3 для merge, ocr, convert, rotate, resize) поддерживается следующий синтаксис:

  • all — все страницы;
  • first — первая страница;
  • last (или l) — последняя страница;
  • even — четные страницы (2, 4, 6...);
  • odd — нечетные страницы (1, 3, 5...);
  • 1-5,8,last — комбинация одиночных страниц и диапазонов.

Указание страниц прямо во входе (Input Spec)

При объединении документов можно выбирать конкретные страницы отдельного PDF прямо в командной строке:

bpdf merge scan.jpg report.pdf:1-3,last notes.txt -o result.pdf

Списки файлов (Манифесты @list.txt)

Вы можете передавать текстовые файлы со списком входов, предваряя путь символом @:

bpdf merge @files.txt -o output.pdf

Формат файла files.txt:

# Комментарии игнорируются
C:\docs\cover.jpg
C:\docs\report.pdf:1-10
C:\docs\appendix.pdf:even

Шаблоны (Globs) и директории

Утилита автоматически расширяет маски файлов (*.png, scans/*.pdf) и сортирует файлы по естественному алфавитно-цифровому порядку (Natural Sort: page1.jpg, page2.jpg, page10.jpg). При передаче каталога обрабатываются только файлы непосредственно в нём; вложенные каталоги автоматически не обходятся.

Интеграция с Total Commander

Утилита bpdf полностью адаптирована для удобной работы в Total Commander:

  • Готовая панель кнопок (bpdf.bar): Файл панели входит в поставку/дистрибутив и содержит предустановленные кнопки для основных операций (объединение, OCR, OCR на месте, очистка метаданных, разделение, извлечение страниц, инспекция, поворот, изменение размера, извлечение текста, оптимизация, штамп, конвертация в JPEG).
  • Списки выделенных файлов: Полная совместимость с параметром списка файлов Total Commander @"%UL" (передача списка выделенных файлов в UTF-8 без ограничений на длину командной строки) и одиночными файлами %P%N.
  • Встроенные иконки: Исполняемый файл bpdf.exe содержит отдельные многослойные иконки для каждого действия на панели кнопок.

Правила перезаписи файлов (In-place)

Во избежание случайной потери данных утилита придерживается следующих правил:

  1. PDF-модификаторы (optimize, stamp, number, watermark, metadata set): Без -o создается новый файл с суффиксом (doc_optimized.pdf, doc_stamped.pdf, doc_numbered.pdf, doc_watermarked.pdf, doc_metadata.pdf). Чтобы перезаписать исходный файл, передайте его путь явно: -o doc.pdf.
  2. rotate, resize и strip: По умолчанию работают in-place (на месте); -o задаёт другой файл или папку (только для одного входа).
  3. Конвертация (convert): Любая замена существующего файла, включая исходник (например, bpdf convert photo.jpg), требует --force. Если несколько входов дают одинаковый выходной путь, команда завершится ошибкой, чтобы не потерять ранее созданный результат.
  4. Команда extract: Категорически запрещает перезапись исходного PDF.
  5. ocr --in-place: Встраивает текстовый слой прямо в исходные PDF.

Конфигурация (config.toml)

Параметры по умолчанию можно настроить в файле config.toml. Файл ищется в следующей последовательности:

  1. Путь из флага --config <PATH>;
  2. config.toml в текущем рабочем каталоге;
  3. config.toml в папке с исполняемым файлом bpdf.exe.

Пример файла конфигурации

# API Ключ Groq для OCR
groq_api_key = "%GROQ_API_KEY%"

# Прокси-сервер (HTTP или SOCKS5)
proxy = ""
# proxy = "socks5://127.0.0.1:10808"

# Метаданные по умолчанию
author = "My Company"
creator = "bpdf toolkit"

# Параметры обработки PDF
auto_rotate = false
keep_icc = false
optimize = false
strip_metadata = false
bookmarks = false
page_size = "A4"
jpeg_quality = 95 # качество JPEG при merge и optimize
image_dpi = 150   # целевой DPI при merge и optimize; 0 отключает уменьшение
raw_develop = false # false = быстрое Pure-Rust превью, true = полная проявка WIC

# Настройки OCR
ocr_engine = "groq" # "groq" (облачный Vision), "windows" (локальный WinOCR) или "auto"
ocr_model = "qwen/qwen3.6-27b"
# ocr_prompt = '''Extract all text exactly as it appears...'''
ocr_endpoint = "https://api.groq.com/openai/v1/chat/completions"
ocr_jobs = 1
ocr_cache = true
# ocr_cache_dir = 'D:\cache\bpdf-ocr'
ocr_timeout_seconds = 120
ocr_max_tokens = 4096

# Пути к сторонним утилитам
# FFmpeg нужен для HEIC/HEIF, AVIF, PSD, JPEG 2000 и других внешних форматов
ffmpeg = 'ffmpeg'
powershell = 'powershell.exe'
# font_path = '%WINDIR%\Fonts\arial.ttf'
office_timeout_seconds = 120

Полный образец с комментариями и всеми необязательными полями находится в config.example.toml.

В файле конфигурации поддерживаются подстановки переменных окружения в формате %ИМЯ_ПЕРЕМЕННОЙ% (например, %GROQ_API_KEY% или %WINDIR%), а также стандартные комментарии #. Для путей в Windows рекомендуется использовать одинарные кавычки '...' во избежание экранирования обратных слэшей.


Примеры использования

# Объединение изображений, отсканированного PDF и заметок в единый PDF
bpdf merge scan.jpg invoice.pdf:1-3 notes.txt -o result.pdf

# Объединение всех картинок из папки с приведением к A4 и автоповоротом
bpdf merge *.jpg -s A4 --auto-rotate --optimize -o scans.pdf

# Объединение с сохранением исходной ориентации каждой страницы
bpdf merge *.pdf -s A4 --no-rotate -o mixed.pdf

# Наложение печати на документ в правый нижний угол с прозрачностью 60%
bpdf merge invoice.pdf --stamp seal.png --stamp-pos br --stamp-op 0.6 -o stamped.pdf

# Наложение печати с точным позиционированием (отступ 150 мм влево от правого нижнего угла)
bpdf merge invoice.pdf --stamp seal.png --stamp-pos="-150,0" -o stamped.pdf

# Распознавание текста со скана через Groq Vision в Markdown
bpdf ocr scan.jpg -o scan.md

# Параллельное распознавание файлов с использованием прокси и кастомной модели
bpdf ocr *.jpg --jobs 4 --proxy socks5://127.0.0.1:10808 --model qwen/qwen3.6-27b

# Конвертация AVIF и PSD в JPEG через FFmpeg
bpdf convert photo.avif design.psd --out converted

# Конвертация JPEG 2000, JPEG-LS, JPEG XR и ICO в JPEG
bpdf convert scan.jp2 medical.jls photo.jxr icon.ico --out converted

# Конвертация RAW-снимков фотоаппаратов в JPEG (быстрое превью без кодеков)
bpdf convert photo.cr3 photo.nef photo.arw --out converted

# Все страницы TIFF и кадры анимации становятся страницами PDF
bpdf merge multipage.tiff animation.apng animation.webp -o pages.pdf

# PowerPoint и OpenDocument в PDF
bpdf merge slides.pptx report.odt table.ods -o office.pdf

# Конвертация электронных книг (EPUB, FB2, FB2.ZIP) в PDF
bpdf merge book.epub -o book.pdf
bpdf merge story.fb2.zip -o story.pdf

# JSON/XML/YAML как текстовый PDF
bpdf merge data.json settings.xml config.yaml -o data.pdf

# Наложение печати поверх документа с реалистичным смешиванием чернил (multiply)
bpdf stamp document.pdf stamp.png --position="-130,30" --mode over --blend multiply

# Очистка EXIF метаданных у всех фото в папке на месте (in-place)
bpdf strip photos/*.jpg

# Разбиение PDF на отдельные страницы
bpdf split document.pdf output_pages/

# Извлечение первых 5 страниц и последней страницы
bpdf extract document.pdf 1-5,last selected.pdf

# Поворот всех четных страниц PDF на 90 градусов на месте
bpdf rotate document.pdf 90 --pages even -o document.pdf

# Приведение страниц PDF к формату Letter
bpdf resize document.pdf --size Letter -o document_letter.pdf

# Извлечение встроенного текстового слоя в файл
bpdf text document.pdf -o text_layer.txt

# Установка свойств документа PDF
bpdf metadata set document.pdf --title "Отчет 2026" --author "Иван Иванов" -o document.pdf

# Извлечение картинки/конвертация изображений в JPEG
bpdf convert photo.png document.pdf -o converted_jpegs/

# Проверка работоспособности системы и интеграций
bpdf doctor

# Интеграция со скриптами в режиме NDJSON
bpdf --json merge *.jpg -o result.pdf

About

Быстрая и легкая CLI-утилита на Rust для работы с PDF, изображениями, RAW и офисными документами (объединение, OCR, печати, оптимизация), адаптированная для работы с Total Commander

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Contributors

Languages