Перейти к основному содержимому
PPDF123

pdfx: командная строка PDF123

pdfx — это командная строка PDF123, опубликованная в npm как @pdf123/cli. Она запускает любой из 95 инструментов для PDF, например объединение, разделение, сжатие и OCR, для файлов на вашем диске: отправляет их в API PDF123 или на ваш собственный сервер и сохраняет результат локально.

@pdf123/cliNode 20.3 или новее, либо Bun

Установка

npm install -g @pdf123/cli
На этой странице

Как установить pdfx?

Установите пакет глобально, чтобы получить команду pdfx. Либо запустите её один раз без установки.

Установкаbash
npm install -g @pdf123/cli
pdfx --version
Запуск без установкиbash
npx @pdf123/cli merge a.pdf b.pdf -o merged.pdf
bunx @pdf123/cli merge a.pdf b.pdf -o merged.pdf

bun add -g @pdf123/cli и pnpm add -g @pdf123/cli тоже работают. Больше ничего устанавливать не нужно.

Как начать работу?

Эти шесть команд показывают типичные сценарии.

Быстрый стартbash
pdfx list                                          # every tool; --category security for one category
pdfx describe watermark                            # a tool's fields and defaults
pdfx merge a.pdf b.pdf -o merged.pdf
pdfx compress *.pdf -o compressed/                 # several files: one result per file
pdfx watermark in.pdf --watermarkText DRAFT
pdfx pipeline a.pdf b.pdf --step merge --step compress -o out.pdf

Как запустить любой инструмент?

Первый аргумент — идентификатор инструмента. Далее идут входные файлы и параметры инструмента. Каждый параметр инструмента — это флаг, записанный именем поля API (--pageNumbers) или в kebab-регистре (--page-numbers). Отрицательное число может следовать за флагом через пробел, как в --rotation -90, или после знака равенства.

Синтаксисtext
pdfx <tool> [files...] [--<field> <value>]...

Список инструментов покажет pdfx list. Команда принимает --category или --group, а также --query со словами для поиска. Команда pdfx describe <tool> показывает конечную точку, допустимые входные данные, работает ли инструмент как пакет, и каждое поле со значением по умолчанию и допустимыми значениями. При неизвестном идентификаторе инструмента выводятся подсказки, а опечатка завершает работу с кодом 2.

Какие команды соответствуют каким страницам инструментов?

КомандаСтраница инструментаЧто делает
pdfx merge a.pdf b.pdf -o merged.pdfОбъединитьСобирает несколько PDF в один
pdfx split report.pdf --pageNumbers 3,7 -o parts.zipРазделитьДелит PDF на отдельные файлы
pdfx compress in.pdf -o out/СжатьПересжимает потоки PDF, чтобы уменьшить размер
pdfx watermark in.pdf --watermarkText DRAFTВодяной знакДобавляет текстовый или графический водяной знак
pdfx protect in.pdf --password secret -o locked.pdfЗадать парольШифрует PDF паролем
pdfx unlock locked.pdf --password secretСнять парольСнимает защиту паролем
pdfx get-info in.pdfСведения о документеВыводит метаданные, разрешения и структуру в формате JSON
pdfx ocr scan.pdf -o out/OCRРаспознаёт отсканированный PDF и сохраняет Markdown
pdfx pdf-to-markdown in.pdf -o out/PDF в MarkdownПреобразует PDF в Markdown
pdfx rotate in.pdf --angle 90ПовернутьМеняет ориентацию страниц на 90, 180 или 270 градусов
pdfx repair broken.pdfИсправитьПерестраивает структуру повреждённого PDF

Как обработать сразу много файлов?

Передайте несколько файлов инструменту для одного файла, и pdfx запустит пакетную обработку. Используйте -o с каталогом, имя которого оканчивается косой чертой. Инструмент запускается по одному разу на файл, по умолчанию по два файла одновременно. Изменить это можно параметром --concurrency.

Пакетная обработкаbash
pdfx compress *.pdf -o compressed/
pdfx protect *.pdf --password secret --concurrency 4 -o locked/

По мере завершения каждого файла pdfx выводит одну строку вида input -> saved. О файле с ошибкой сообщается в стандартный поток ошибок, а остальные файлы всё равно обрабатываются до конца. Нажмите Ctrl-C один раз, чтобы прервать выполняющийся запрос; уже сохранённые файлы остаются. Второе нажатие Ctrl-C немедленно завершает работу с кодом 130. С --idempotency-key k каждый файл отправляет k:<index>, а повтор того же запроса в течение 24 часов возвращает первый результат.

Пакетная обработка инструмента, который возвращает отчёт, например get-info, без -o не записывает файлов. Она выводит отчёты, сгруппированные по входным файлам.

Как объединить инструменты в цепочку в одном запросе?

pdfx pipeline запускает несколько инструментов в одном запросе. Повторяйте --step для каждого инструмента. Чтобы задать параметры, передайте JSON-массив через --steps.

Конвейерыbash
pdfx pipeline a.pdf b.pdf --step merge --step compress -o out.pdf
pdfx pipeline in.pdf --steps '[{"tool":"watermark","params":{"watermarkText":"DRAFT"}},{"tool":"compress"}]' -o out.pdf

В шагах нельзя использовать инструменты, которым нужен второй файл.

Как открыть PDF, защищённые паролем?

--input-password сначала открывает все зашифрованные входные файлы. --password-for <file>=<password> задаёт пароль одного файла. Параметр можно повторять, а * вместо имени файла охватывает все остальные. Это удобно для пакета, где смешаны защищённые и открытые файлы. Для merge и images-to-pdf каждый названный файл открывается отдельно перед запуском инструмента.

Паролиbash
pdfx compress locked.pdf --input-password secret -o out.pdf
pdfx compress report.pdf --password-for report.pdf=secret -o out.pdf
pdfx merge a.pdf b.pdf --password-for a.pdf=secret -o merged.pdf

Те же параметры работают и в конвейере. Чтобы снять защиту навсегда, используйте инструмент Снять пароль с его собственным параметром --password.

Как работают ввод и вывод?

  • Вход - читает стандартный ввод, один раз за запуск. -o - записывает результат в стандартный вывод.
  • -o file.pdf записывает указанный файл. -o dir/ записывает в каталог. Если каталога ещё нет, нужна завершающая косая черта, потому что имя без неё записывается как файл.
  • Без -o результаты попадают в текущий каталог под именем файла, которое дал сервер.
  • В каталоге pdfx никогда не заменяет существующий файл, а выбирает новое имя. Явное -o file.pdf заменяет этот файл.
  • Имя файла в -o, расширение которого противоречит результату, например ZIP от split, сохраняемый как .pdf, отклоняется с кодом выхода 2 и code: output_mismatch. Ничего не записывается.
  • Вывод, который нельзя записать, — это ошибка использования, обнаруживаемая до любой загрузки.
Конвейер оболочкиbash
cat in.pdf | pdfx compress - -o - > out.pdf

Что выводит --json?

Для сохранённого результата --json выводит путь, тип содержимого и размер. Инструмент, возвращающий отчёт, выводит сам отчёт. Пакетная обработка выводит один отчёт со статусом по каждому файлу.

Один результатjson
{ "path": "one.pdf", "contentType": "application/pdf", "bytes": 1040 }
Отчёт о пакетеjson
{
  "processed": 2,
  "unmatched": 0,
  "failed": 0,
  "files": [
    { "input": "/abs/a.pdf", "ok": true, "path": "comp/a.pdf", "contentType": "application/pdf", "bytes": 1040 }
  ]
}

У файла с ошибкой вместо path и bytes есть error и reason. Инструмент-фильтр без совпадения выводит { "matched": false }. Команда pdfx list --json выводит строки с полями id, category, group, name, description, returns, files и filter.

Какие параметры действуют для всех инструментов?

ПараметрДействие
-o, --output <path>Файл для записи или каталог, в который писать. По умолчанию — текущий каталог. - означает стандартный вывод
--api-base <url>Адрес API. Переменная окружения PDFX_API_BASE, по умолчанию https://pdf123.xyz
--api-key <key>Отправляется как X-API-KEY. Переменная окружения PDFX_API_KEY. Необязателен
--input-password <pw>Сначала открывает все входные файлы, защищённые паролем
--password-for <file>=<pw>Пароль для одного файла. Можно повторять
--concurrency <n>Число файлов пакета, обрабатываемых одновременно. По умолчанию 2
--timeout <ms>Тайм-аут каждого запроса. По умолчанию 300000
--idempotency-key <k>Возвращает первый результат в течение 24 часов
--jsonВывод для машинной обработки

Какие бывают коды выхода?

КодЗначение
0Успех. Инструмент-фильтр без совпадения тоже завершается с кодом 0 и выводит no match
1Запрос завершился ошибкой. В пакете хотя бы один файл не обработан; остальные всё равно завершаются
2Ошибка использования. Ничего не загружено
130Прервано нажатием Ctrl-C. Выполняющийся запрос прерывается

При сбоях выводятся строки reason:, code: и hint:, если сервер их передал, поэтому скрипт может ветвить логику, не сопоставляя текст. Инструмент, которому нечего вернуть, например pdf-to-csv для PDF без таблиц, завершается с кодом 1 и code: no_content, а не записывает пустой файл. Коды перечислены на странице Коды ошибок.

Как направить pdfx на собственный сервер?

Задайте PDFX_API_BASE или передайте --api-base с адресом собственного pdfx-server. Добавьте PDFX_API_KEY, если серверу нужен ключ. См. Self-host.

Собственный серверbash
export PDFX_API_BASE=http://localhost:8080
export PDFX_API_KEY=<your-key>
pdfx compress in.pdf

Как вызвать конечную точку, которой нет в CLI?

pdfx call отправляет «сырой» запрос по идентификатору операции или пути /api/.... Для полей формы используйте --field name=value, для дополнительных файлов — --file field=path. Команда отправляет ровно один запрос и ничего не проверяет локально, поэтому пароли и пакетная обработка отклоняются.

Сырые запросыbash
pdfx call general/merge-pdfs a.pdf b.pdf -o merged.pdf
pdfx call /api/v1/misc/flatten in.pdf --field flattenOnlyForms=true -o flat.pdf

Вопросы и ответы

Работает ли pdfx без подключения к сети?

Нет. pdfx загружает каждый файл в API PDF123 или на ваш собственный сервер и сохраняет результат локально, поэтому базовый адрес API должен быть доступен.

Нужен ли pdfx ключ API?

Нет. Анонимное использование работает. Задайте PDFX_API_KEY или передайте --api-key, если ваш сервер требует ключ. Ключ отправляется в заголовке X-API-KEY.

Какая версия Node нужна pdfx?

Node 20.3 или новее, либо Bun.

Перезапишет ли pdfx мои файлы?

При записи в каталог — нет: существующий файл никогда не заменяется. Если вы сами задаёте имя выходного файла через -o file.pdf, этот файл заменяется, поэтому выберите новое имя, если хотите сохранить оригинал.

Что происходит, когда инструмент-фильтр не находит совпадения?

Инструменты-фильтры, идентификаторы которых начинаются с filter-, пропускают файл дальше, если их условие выполнено. Если нет, pdfx выводит no match и завершается с кодом 0. В пакете такой файл считается не совпавшим, а не завершившимся ошибкой.