← Voltar ao site

API de Manipulação de PDF

Serviço HTTP para outros sistemas manipularem PDFs (unir, dividir, OCR, comprimir, converter, PDF→imagem, desbloquear, reparar, remoção real). Integração server-to-server, autenticada por API key. Tudo em /api/v1.

OpenAPI 3.1 (openapi.json)·llms.txt (para agentes de IA)

Início rápido

Toda operação é POST multipart/form-data e responde com o arquivo binário resultante. Exemplo — unir 2 PDFs:

curl -X POST https://pdfdoc.com.br/api/v1/merge \
  -H "Authorization: Bearer $PDFI_KEY" \
  -F "files=@a.pdf" -F "files=@b.pdf" \
  -o merged.pdf

Autenticação

Envie a API key (emitida pelo administrador, por serviço) no header:

Authorization: Bearer pdfi_live_xxxxxxxx...

A chave é guardada com hash — o valor em claro aparece uma única vez na criação. Trate-a como segredo (variável de ambiente, nunca no front-end). Use uma chave por serviço para poder revogar isoladamente.

Convenções e erros

StatusSignificado
200OK — corpo é o arquivo resultante
400Entrada inválida (parâmetro/arquivo ausente)
401Token ausente ou inválido
403Sem permissão (escopo) ou chave revogada
413Arquivo acima do limite — use o worker
500Erro interno
502Falha no worker (operação pesada)

Limites e arquivos grandes

O servidor de app aceita ~4,5 MB por requisição. Para arquivos grandes, chame o mesmo endpoint no worker (síncrono, sem limite) ou use o fluxo assíncrono (abaixo).

use PdfInteligente\Laravel\Pdfi;

// síncrono no worker (sem limite de tamanho)
$bytes = Pdfi::callLarge('compress', ['file' => [storage_path('app/grande.pdf')]], ['level' => 'ebook']);

Assíncrono e webhooks

Operações longas (OCR, arquivos grandes): submeta um job e acompanhe por polling ou webhook. O resultado fica em URL temporária assinada (TTL) e depois é apagado.

use PdfInteligente\Laravel\Pdfi;

// submete + aguarda (polling automático)
$pdf = Pdfi::process('ocr', ['file' => [storage_path('app/scan.pdf')]], ['lang' => 'por']);

// ou só submete com webhook (não bloqueia)
$job = Pdfi::submit('ocr', ['file' => [storage_path('app/scan.pdf')]], [], 'https://seu-app/webhooks/pdfi');

O webhook chega como POST com header X-PDFI-Signature = HMAC-SHA256(corpo, segredo). Valide antes de confiar:

use PdfInteligente\PdfInteligente;

public function pdfiWebhook(\Illuminate\Http\Request $request)
{
    $ok = PdfInteligente::verifyWebhook(
        $request->getContent(),
        $request->header('X-PDFI-Signature', ''),
        config('pdf-inteligente.webhook_secret'),
    );
    abort_unless($ok, 401);

    $data = $request->json()->all();
    if (($data['status'] ?? '') === 'done') {
        $bytes = file_get_contents($data['downloadUrl']); // URL assinada (TTL)
        // ... persistir
    }
    return response()->noContent();
}

SDK PHP / Laravel

Pacote Composer com integração nativa do Laravel (ServiceProvider + Facade Pdfi auto-descobertos). Código em php-sdk/ no repositório.

# composer.json do seu app:
"repositories": [
  { "type": "vcs", "url": "https://github.com/ajbondstar/pdf-inteligente" }
]

composer require pdf-inteligente/php-sdk:dev-main
php artisan vendor:publish --tag=pdf-inteligente-config

No .env:

PDFI_API_KEY=pdfi_live_xxxxxxxx
PDFI_BASE_URL=https://pdfdoc.com.br
PDFI_WORKER_URL=https://pdf-inteligente-worker.onrender.com
PDFI_WEBHOOK_SECRET=...   # combine com o admin (para validar webhooks)

Recebendo uploads do request? Passe os caminhos: collect($request->file('docs'))->map->getRealPath()->all(). Para bytes em memória use PdfInteligente\Upload::fromString($bytes, 'a.pdf'). Detalhes no php-sdk/README.md.

Editor embutível (iframe)

Embuta o editor (preencher / editar / censura) no seu produto. Comunicação por postMessage:

<iframe id="pdfi" src="https://pdfdoc.com.br/embed/editor"
        style="width:100%;height:80vh;border:0"></iframe>
<script>
  const f = document.getElementById("pdfi");
  addEventListener("message", (e) => {
    if (e.data?.type === "pdfi:ready")
      f.contentWindow.postMessage({ type: "pdfi:load", pdf: arrayBuffer, fileName: "req.pdf" }, "*");
    if (e.data?.type === "pdfi:result")
      new Blob([e.data.pdf], { type: "application/pdf" }); // PDF final
  });
</script>

Operações

EndpointO que fazParâmetrosOnde
POST /api/v1/mergeUne vários PDFs em um, na ordem enviada.
files* (files) 2+ PDFs
servidor
POST /api/v1/splitExtrai páginas em um único PDF.
file* (file) PDF
ranges (string) Intervalos, ex.: "1-3,7,10-12"
pages (string) Páginas, ex.: "1,3,5" (1-based)
servidor
POST /api/v1/pagesEditor de páginas: remover, extrair, reordenar ou girar.
file* (file) PDF
action* (string) remove | extract | reorder | rotate | reverse
pages (string) 1-based; lista/permutação conforme a ação
rotation (int) graus (rotate), múltiplo de 90
servidor
POST /api/v1/batesNumeração Bates / foliação: carimba número sequencial nas páginas.
file* (file) PDF
prefix (string) Texto antes do número, ex.: "DOC-"
suffix (string) Texto depois do número
start (int) Primeiro número (padrão 1)
digits (int) Zeros à esquerda (ex.: 6 → 000001)
position (string) top/bottom-left/center/right (padrão bottom-right)
fontSize (int) Tamanho da fonte em pt (padrão 10)
servidor
POST /api/v1/watermarkMarca d'água de texto, diagonal, em todas as páginas.
file* (file) PDF
text* (string) Texto da marca d'água
opacity (string) 0..1 (padrão 0.2)
fontSize (int) Tamanho em pt (padrão 48)
rotation (int) Graus (padrão 45)
servidor
POST /api/v1/cropRecorta (define o CropBox) removendo margens de todas as páginas.
file* (file) PDF
topPct (string) Fração 0..0.49 a remover do topo
rightPct (string) Fração 0..0.49 da direita
bottomPct (string) Fração 0..0.49 de baixo
leftPct (string) Fração 0..0.49 da esquerda
servidor
POST /api/v1/editCarimba texto e tarjas visuais (preencher requerimento / editar).
file* (file) PDF
elements* (json) Array de elementos (text/rect) com coords relativas 0..1. Ver docs.
servidor
POST /api/v1/redactRemoção REAL: apaga o conteúdo sob as áreas (não recuperável).
file* (file) PDF
rects* (json) Array {page,leftPct,topPct,widthPct,heightPct,color}
worker
POST /api/v1/office-to-pdfConverte Office (docx/xlsx/pptx/odt…) em PDF.
file* (file) Arquivo Office
ext* (string) Extensão, ex.: "docx"
worker
POST /api/v1/pdf-to-officeConverte PDF em Word/Excel.
file* (file) PDF
target (string) docx (padrão) | xlsx
worker
POST /api/v1/image-to-pdfConverte uma ou mais imagens em um PDF.
files* (files) Imagens (jpg/png)
worker
POST /api/v1/ocrOCR: PDF escaneado → PDF/A pesquisável.
file* (file) PDF escaneado
lang (string) Idioma Tesseract, padrão "por"
worker
POST /api/v1/compressComprime/otimiza o PDF.
file* (file) PDF
level (string) screen | ebook (padrão) | printer | prepress
worker
POST /api/v1/unlockRemove senha/restrições do PDF.
file* (file) PDF
password (string) Senha (se houver)
worker
POST /api/v1/repairRepara PDF corrompido.
file* (file) PDF
worker
POST /api/v1/heic-to-jpgConverte foto HEIC em JPG.
file* (file) HEIC/HEIF
worker
POST /api/v1/heic-to-pdfConverte uma ou mais fotos HEIC em um PDF.
files* (files) HEIC/HEIF
worker
POST /api/v1/pdf-to-imageConverte páginas do PDF em imagens (PNG/JPG). 1 página = imagem; várias = zip.
file* (file) PDF
format (string) png (padrão) | jpg
dpi (int) Resolução, padrão 150 (36–600)
pages (string) Intervalo "1-3,7" (1-based); vazio = todas
worker
POST /api/v1/protectProtege o PDF com senha (criptografia AES-256).
file* (file) PDF
userPassword* (string) Senha para abrir o documento
ownerPassword (string) Senha de permissões (padrão = userPassword)
allowPrint (string) "false" para proibir impressão
allowCopy (string) "false" para proibir cópia/extração
worker
POST /api/v1/pdfaConverte para PDF/A-2b (arquivamento de longo prazo).
file* (file) PDF
worker
POST /api/v1/grayscaleConverte para tons de cinza e, opcionalmente, reduz a resolução das imagens.
file* (file) PDF
dpi (int) Reduz imagens para este DPI (50–600); vazio = só cinza
worker
POST /api/v1/anonymizeAnonimiza: tarja PII detectada (CPF/CNPJ/e-mail/telefone) e remove metadados.
file* (file) PDF
types (string) Categorias: cpf,cnpj,email,phone,cep (padrão cpf,cnpj,email,phone)
stripMetadata (string) "false" para manter metadados
worker
POST /api/v1/html-to-pdfRenderiza uma URL pública ou um HTML em PDF (Chromium).
url (string) URL http(s) pública (informe url OU file)
file (file) Arquivo HTML (informe url OU file)
worker

* obrigatório