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.
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.pdfEnvie 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.
Content-Disposition: attachment).{ "error": { "message", "status", "detail?" } }.| Status | Significado |
|---|---|
| 200 | OK — corpo é o arquivo resultante |
| 400 | Entrada inválida (parâmetro/arquivo ausente) |
| 401 | Token ausente ou inválido |
| 403 | Sem permissão (escopo) ou chave revogada |
| 413 | Arquivo acima do limite — use o worker |
| 500 | Erro interno |
| 502 | Falha no worker (operação pesada) |
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']);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();
}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-configNo .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.
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>| Endpoint | O que faz | Parâmetros | Onde |
|---|---|---|---|
| POST /api/v1/merge | Une vários PDFs em um, na ordem enviada. | files* (files) 2+ PDFs | servidor |
| POST /api/v1/split | Extrai 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/pages | Editor 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/bates | Numeraçã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/watermark | Marca 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/crop | Recorta (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/edit | Carimba 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/redact | Remoçã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-pdf | Converte Office (docx/xlsx/pptx/odt…) em PDF. | file* (file) Arquivo Office ext* (string) Extensão, ex.: "docx" | worker |
| POST /api/v1/pdf-to-office | Converte PDF em Word/Excel. | file* (file) PDF target (string) docx (padrão) | xlsx | worker |
| POST /api/v1/image-to-pdf | Converte uma ou mais imagens em um PDF. | files* (files) Imagens (jpg/png) | worker |
| POST /api/v1/ocr | OCR: PDF escaneado → PDF/A pesquisável. | file* (file) PDF escaneado lang (string) Idioma Tesseract, padrão "por" | worker |
| POST /api/v1/compress | Comprime/otimiza o PDF. | file* (file) PDF level (string) screen | ebook (padrão) | printer | prepress | worker |
| POST /api/v1/unlock | Remove senha/restrições do PDF. | file* (file) PDF password (string) Senha (se houver) | worker |
| POST /api/v1/repair | Repara PDF corrompido. | file* (file) PDF | worker |
| POST /api/v1/heic-to-jpg | Converte foto HEIC em JPG. | file* (file) HEIC/HEIF | worker |
| POST /api/v1/heic-to-pdf | Converte uma ou mais fotos HEIC em um PDF. | files* (files) HEIC/HEIF | worker |
| POST /api/v1/pdf-to-image | Converte 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/protect | Protege 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/pdfa | Converte para PDF/A-2b (arquivamento de longo prazo). | file* (file) PDF | worker |
| POST /api/v1/grayscale | Converte 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/anonymize | Anonimiza: 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-pdf | Renderiza 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