Ir para o conteúdo principal
PPDF123

pdfx: a linha de comando do PDF123

pdfx é a linha de comando do PDF123, publicada no npm como @pdf123/cli. Ela executa qualquer uma das 95 ferramentas de PDF, como juntar, dividir, comprimir e OCR, em arquivos do seu disco: envia-os para a API do PDF123 ou para o seu próprio servidor e salva o resultado localmente.

@pdf123/cliNode 20.3 ou mais recente, ou Bun

Instalação

npm install -g @pdf123/cli
Nesta página

Como instalo o pdfx?

Instale o pacote globalmente para ter o comando pdfx. Ou execute-o uma vez, sem instalar.

Instalaçãobash
npm install -g @pdf123/cli
pdfx --version
Executar sem instalarbash
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 e pnpm add -g @pdf123/cli também funcionam. Não é preciso instalar mais nada.

Como começo?

Estes seis comandos mostram os padrões mais comuns.

Início rápidobash
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

Como executo qualquer ferramenta?

O primeiro argumento é o id da ferramenta. Os arquivos de entrada e as opções da ferramenta vêm depois. Toda opção de uma ferramenta é uma flag, escrita como o nome do campo da API (--pageNumbers) ou em kebab-case (--page-numbers). Um número negativo pode vir depois da flag, separado por espaço, como em --rotation -90, ou depois de um sinal de igual.

Sintaxetext
pdfx <tool> [files...] [--<field> <value>]...

Use pdfx list para ver as ferramentas. Ele aceita --category ou --group, e --query com palavras para buscar. Use pdfx describe <tool> para ver o endpoint, as entradas aceitas, se a ferramenta roda como lote e cada campo com seu valor padrão e os valores permitidos. Um id de ferramenta desconhecido recebe sugestões, e um id digitado errado termina com o código 2.

Quais comandos correspondem a quais páginas de ferramentas?

ComandoPágina da ferramentaO que faz
pdfx merge a.pdf b.pdf -o merged.pdfJuntarCombina vários PDFs em um só
pdfx split report.pdf --pageNumbers 3,7 -o parts.zipDividirDivide um PDF em arquivos separados
pdfx compress in.pdf -o out/ComprimirRecomprime os fluxos do PDF para reduzir o tamanho
pdfx watermark in.pdf --watermarkText DRAFTMarca d'águaAdiciona uma marca d'água de texto ou imagem
pdfx protect in.pdf --password secret -o locked.pdfProtegerCriptografa um PDF com senha
pdfx unlock locked.pdf --password secretDesbloquearRemove a proteção por senha
pdfx get-info in.pdfInformações do documentoImprime metadados, permissões e estrutura como JSON
pdfx ocr scan.pdf -o out/OCRLê um PDF digitalizado e salva Markdown
pdfx pdf-to-markdown in.pdf -o out/PDF para MarkdownConverte um PDF em Markdown
pdfx rotate in.pdf --angle 90GirarMuda a orientação das páginas em 90, 180 ou 270 graus
pdfx repair broken.pdfRepararReconstrói a estrutura de um PDF danificado

Como processo muitos arquivos de uma vez?

Passe vários arquivos para uma ferramenta de arquivo único e o pdfx executa um lote. Use -o com um diretório que termine em barra. A ferramenta roda uma vez por arquivo, dois arquivos por vez por padrão. Mude isso com --concurrency.

Lotebash
pdfx compress *.pdf -o compressed/
pdfx protect *.pdf --password secret --concurrency 4 -o locked/

O pdfx imprime uma linha, input -> saved, à medida que cada arquivo termina. Um arquivo com falha é informado na saída de erro padrão e os demais arquivos continuam até o fim. Pressione Ctrl-C uma vez para abortar a requisição em andamento; os arquivos já salvos são mantidos. Um segundo Ctrl-C sai imediatamente com o código 130. Com --idempotency-key k, cada arquivo envia k:<index>, e uma repetição da mesma requisição devolve o primeiro resultado por 24 horas.

Um lote de uma ferramenta que devolve um relatório, como get-info, não grava arquivos sem -o. Ele imprime os relatórios organizados por arquivo de entrada.

Como encadeio ferramentas em uma requisição?

pdfx pipeline executa várias ferramentas em uma única requisição. Repita --step para cada ferramenta. Para definir opções, passe um array JSON com --steps.

Pipelinesbash
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

As etapas não podem usar ferramentas que precisam de um segundo arquivo.

Como abro PDFs protegidos por senha?

--input-password abre antes todas as entradas criptografadas. --password-for <file>=<password> define a senha de um arquivo. Pode ser repetido, e * como nome de arquivo cobre os demais. Isso serve para um lote que mistura arquivos bloqueados e abertos. Para merge e images-to-pdf, cada arquivo indicado é desbloqueado separadamente antes de a ferramenta rodar.

Senhasbash
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

As mesmas opções funcionam em um pipeline. Para remover a proteção de forma permanente, use a ferramenta Desbloquear com a opção --password dela.

Como funcionam a entrada e a saída?

  • Uma entrada - lê a entrada padrão, uma vez por execução. -o - grava o resultado na saída padrão.
  • -o file.pdf grava esse arquivo. -o dir/ grava dentro de um diretório. Um diretório que ainda não existe precisa da barra final, pois um nome sem ela é gravado como arquivo.
  • Sem -o, os resultados vão para o diretório atual com o nome de arquivo dado pelo servidor.
  • Dentro de um diretório, o pdfx nunca substitui um arquivo existente; ele escolhe um nome novo. Um -o file.pdf explícito substitui esse arquivo.
  • Um nome de arquivo em -o cuja extensão contradiz o resultado, como um ZIP de split salvo como .pdf, é recusado com o código de saída 2 e code: output_mismatch. Nada é gravado.
  • Uma saída que não pode ser gravada é um erro de uso detectado antes de qualquer envio.
Pipe do shellbash
cat in.pdf | pdfx compress - -o - > out.pdf

O que o --json imprime?

Para um resultado salvo, --json imprime o caminho, o tipo de conteúdo e o tamanho. Uma ferramenta que devolve um relatório imprime o próprio relatório. Um lote imprime um relatório com um status por arquivo.

Resultado únicojson
{ "path": "one.pdf", "contentType": "application/pdf", "bytes": 1040 }
Relatório de lotejson
{
  "processed": 2,
  "unmatched": 0,
  "failed": 0,
  "files": [
    { "input": "/abs/a.pdf", "ok": true, "path": "comp/a.pdf", "contentType": "application/pdf", "bytes": 1040 }
  ]
}

Um arquivo com falha tem error e reason no lugar de path e bytes. Uma ferramenta de filtro sem correspondência imprime { "matched": false }. pdfx list --json imprime linhas com id, category, group, name, description, returns, files e filter.

Quais opções valem para todas as ferramentas?

OpçãoEfeito
-o, --output <path>Arquivo a gravar, ou diretório onde gravar. O padrão é o diretório atual. - é a saída padrão
--api-base <url>Origem da API. Variável de ambiente PDFX_API_BASE, padrão https://pdf123.xyz
--api-key <key>Enviada como X-API-KEY. Variável de ambiente PDFX_API_KEY. Opcional
--input-password <pw>Abre antes todas as entradas protegidas por senha
--password-for <file>=<pw>Senha de um arquivo. Pode ser repetida
--concurrency <n>Arquivos de um lote processados ao mesmo tempo. Padrão 2
--timeout <ms>Tempo limite de cada requisição. Padrão 300000
--idempotency-key <k>Devolve o primeiro resultado por 24 horas
--jsonSaída legível por máquina

Quais são os códigos de saída?

CódigoSignificado
0Sucesso. Uma ferramenta de filtro sem correspondência também sai com 0 e imprime no match
1Uma requisição falhou. Em um lote, pelo menos um arquivo falhou; os demais continuam até o fim
2Erro de uso. Nada foi enviado
130Interrompido com Ctrl-C. A requisição em andamento é abortada

As falhas imprimem linhas reason:, code: e hint: quando o servidor as fornece, para que um script possa ramificar sem comparar texto. Uma ferramenta que não encontra nada para devolver, como pdf-to-csv em um PDF sem tabelas, sai com 1 e code: no_content em vez de gravar um arquivo vazio. Os códigos estão em Códigos de erro.

Como aponto o pdfx para o meu próprio servidor?

Defina PDFX_API_BASE, ou passe --api-base, com o endereço de um pdfx-server próprio. Acrescente PDFX_API_KEY se o seu servidor exigir uma chave. Veja Self-host.

Servidor própriobash
export PDFX_API_BASE=http://localhost:8080
export PDFX_API_KEY=<your-key>
pdfx compress in.pdf

Como executo um endpoint que a CLI não conhece?

pdfx call envia uma requisição bruta para um id de operação ou um caminho /api/.... Use --field name=value para campos de formulário e --file field=path para arquivos extras. Ele envia exatamente uma requisição e não valida nada localmente, então senhas e lotes são recusados.

Requisições brutasbash
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

FAQ

O pdfx funciona offline?

Não. O pdfx envia cada arquivo para a API do PDF123 ou para o seu próprio servidor e salva o resultado localmente, então a base da API precisa estar acessível.

O pdfx precisa de uma chave de API?

Não. O uso anônimo funciona. Defina PDFX_API_KEY ou passe --api-key se o seu servidor exigir uma. A chave é enviada no cabeçalho X-API-KEY.

Qual versão do Node o pdfx exige?

Node 20.3 ou mais recente, ou Bun.

O pdfx vai sobrescrever meus arquivos?

Não quando grava dentro de um diretório: um arquivo existente nunca é substituído. Se você mesmo der o nome do arquivo de saída com -o file.pdf, esse arquivo é substituído, então escolha um nome novo quando quiser manter o original.

O que acontece quando uma ferramenta de filtro não encontra correspondência?

As ferramentas de filtro, cujos ids começam com filter-, deixam o arquivo passar quando a condição delas é atendida. Quando não é, o pdfx imprime no match e sai com o código 0. Em um lote, esse arquivo conta como sem correspondência, não como falha.