$ pdfservices --init

HTML entra. PDF sai.

API para converter HTML em PDF

Uma API HTTP simples que transforma o seu HTML em PDF com o motor iText pdfHTML. Você paga só pelas conversões bem-sucedidas, seus documentos nunca são armazenados e todo o código é aberto.

  • Sem mensalidade
  • Nada fica armazenado
  • Código aberto (AGPL v3)
  • Só para empresas (CNPJ)
Exemplo: envio de um arquivo HTML com cURL e os headers da resposta da API.
bash — gerar-nota.sh
$ curl -X POST https://api.pdfservices.sistema.site/v1/html2pdf/html \
    -H "X-Api-Key: pdfs_••••••••••••" \
    -H "Content-Type: text/html; charset=utf-8" \
    --data-binary @nota.html -o nota.pdf -D -

HTTP/1.1 200 OK
Content-Type: application/pdf
X-Transaction-Id: 9f3c2a7e5b1d4c08a6e2f0b7d91c3a54
X-Charged-Amount: 0.001
X-Balance: 49.999
por conversão bem-sucedida
R$ 0,001
do seu HTML armazenados
0 bytes
por requisição
1 MB
código aberto (AGPL v3)
100%
// como funciona

Do cadastro ao primeiro PDF em três passos

Sem SDK obrigatório e sem fila: uma requisição HTTP com o seu HTML devolve o PDF pronto na resposta.

  1. 01

    Crie a conta da empresa

    Cadastre-se com o CNPJ da empresa e confirme o e-mail pelo link que enviamos. O acesso ao painel é liberado após a confirmação.

    pdfservices.sistema.site/cadastro
  2. 02

    Gere uma chave de API

    No painel, crie uma chave: ela aparece uma única vez e é guardada por nós só como hash. Para converter, a conta precisa de saldo em créditos.

    X-Api-Key: pdfs_••••••••••••
  3. 03

    Envie HTML, receba PDF

    Faça um POST com o HTML e receba o PDF como resposta. Cada conversão bem-sucedida debita o preço vigente do seu saldo.

    POST /v1/html2pdf/html → application/pdf
// integração

Integre em minutos, em qualquer linguagem

Dois formatos de envio, a mesma resposta: o PDF em application/pdf. Base: https://api.pdfservices.sistema.site

  • POST/v1/html2pdf/htmlCorpo: o próprio HTML, com Content-Type: text/html; charset=utf-8
  • POST/v1/html2pdf/jsonCorpo: {"html": "..."}, com Content-Type: application/json

Autenticação

Envie sua chave no header X-Api-Key: pdfs_.... Use a chave só no seu servidor, nunca no navegador.

Headers da resposta

  • X-Transaction-Id identifica a conversão no seu relatório de consumo.
  • X-Charged-Amount é o valor cobrado, em R$.
  • X-Balance é o saldo restante depois da cobrança.

Erros (JSON: { "error", "message" })

HTTPCódigoQuando
401invalid_api_keyChave ausente, inválida ou revogada.
402insufficient_balanceSaldo insuficiente para a conversão.
413payload_too_largeRequisição acima de 1 MB.
422conversion_failedO HTML não pôde ser convertido. Não é cobrado.
# HTML direto no corpo da requisição
curl -X POST https://api.pdfservices.sistema.site/v1/html2pdf/html \
  -H "X-Api-Key: $PDFSERVICES_API_KEY" \
  -H "Content-Type: text/html; charset=utf-8" \
  --data-binary @documento.html \
  -o documento.pdf

# Ou em JSON
curl -X POST https://api.pdfservices.sistema.site/v1/html2pdf/json \
  -H "X-Api-Key: $PDFSERVICES_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"html": "<h1>Olá, PDF!</h1>"}' \
  -o documento.pdf
using System.Text;

using var http = new HttpClient();
http.DefaultRequestHeaders.Add("X-Api-Key", Environment.GetEnvironmentVariable("PDFSERVICES_API_KEY"));

var html = "<h1>Olá, PDF!</h1><p>Gerado com PDF Services.</p>";
using var content = new StringContent(html, Encoding.UTF8, "text/html");
using var response = await http.PostAsync(
    "https://api.pdfservices.sistema.site/v1/html2pdf/html", content);

if (!response.IsSuccessStatusCode)
    throw new Exception(await response.Content.ReadAsStringAsync());

await File.WriteAllBytesAsync("documento.pdf", await response.Content.ReadAsByteArrayAsync());
var saldo = response.Headers.GetValues("X-Balance").First();
Console.WriteLine($"PDF gerado. Saldo: R$ {saldo}");
import { writeFile } from 'node:fs/promises';

const response = await fetch('https://api.pdfservices.sistema.site/v1/html2pdf/json', {
  method: 'POST',
  headers: {
    'X-Api-Key': process.env.PDFSERVICES_API_KEY,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ html: '<h1>Olá, PDF!</h1>' })
});

if (!response.ok) {
  const { error, message } = await response.json();
  throw new Error(`${error}: ${message}`);
}

await writeFile('documento.pdf', Buffer.from(await response.arrayBuffer()));
console.log('Saldo:', response.headers.get('X-Balance'));
import os
import requests

response = requests.post(
    "https://api.pdfservices.sistema.site/v1/html2pdf/json",
    headers={"X-Api-Key": os.environ["PDFSERVICES_API_KEY"]},
    json={"html": "<h1>Olá, PDF!</h1>"},
    timeout=60,
)

if response.status_code != 200:
    erro = response.json()
    raise RuntimeError(f"{erro['error']}: {erro['message']}")

with open("documento.pdf", "wb") as arquivo:
    arquivo.write(response.content)

print("Saldo:", response.headers["X-Balance"])
<?php
$html = '<h1>Olá, PDF!</h1>';

$ch = curl_init('https://api.pdfservices.sistema.site/v1/html2pdf/html');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => $html,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        'X-Api-Key: ' . getenv('PDFSERVICES_API_KEY'),
        'Content-Type: text/html; charset=utf-8',
    ],
]);

$body   = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($status !== 200) {
    $erro = json_decode($body, true);
    throw new RuntimeException($erro['error'] . ': ' . $erro['message']);
}

file_put_contents('documento.pdf', $body);
Chave na variável de ambiente PDFSERVICES_API_KEY {{ copied ? 'Código copiado para a área de transferência.' : '' }}
// preço

Pague só pelo que converter

Sem mensalidade, sem plano mínimo, sem fidelidade. Créditos pré-pagos em reais, debitados a cada conversão bem-sucedida.

Pague por uso · html2pdf

R$ 0,001por conversão bem-sucedida

R$ 1,00 rende 1.000 PDFs.

  • Créditos pré-pagos em R$, sem mensalidade nem fidelidade
  • Cobrança só quando o PDF é gerado: conversões com erro não são cobradas
  • Saldo e consumo detalhado por chave de API no painel
  • Alterações de preço avisadas com antecedência no site
Criar conta

Novas contas não recebem créditos gratuitos.

// simulador

Quanto vou gastar?

Conversões10.000
Custo estimadoR$ 10,00

Como adicionar créditos: por enquanto, fale com a CODECYCLE para carregar o saldo da sua conta. A compra online de créditos chega em breve.

Falar com a CODECYCLE

// privacidade por padrão

Seu documento passa por aqui. Não fica aqui.

O HTML enviado e o PDF gerado são processados apenas em memória, durante a requisição, e nunca são armazenados nem registrados em logs. Entregue a resposta, eles deixam de existir no serviço.

O que nunca guardamos

  • O HTML que você envia
  • O PDF que geramos
  • As imagens baixadas para compor o PDF
  • Qualquer trecho do conteúdo em logs ou telemetria

O que registramos

  • Metadados de cada transação: data/hora, capacidade, chave usada, valor cobrado, saldo, tamanhos em bytes e duração.
  • Registros de acesso (IP e data/hora), guardados por 6 meses por exigência do Marco Civil da Internet.
  • Dados de cadastro da conta: nome, razão social, CNPJ, e-mail e o hash da senha.

Consequência prática: como não guardamos o conteúdo, não conseguimos recuperar um documento já convertido. Mantenha suas próprias cópias.

Ler a Política de Privacidade
// o que suporta

HTML e CSS de verdade, com o motor iText pdfHTML

Escreva o documento com as tecnologias que você já conhece e controle a paginação com CSS.

HTML + CSS

O pdfHTML suporta boa parte do CSS 2.1 e do CSS 3: tipografia, cores, bordas, margens, fundos, posicionamento e muito mais.

@page e paginação

Defina tamanho, margens e orientação da página com @page e controle quebras com page-break-before, -after e -inside.

Tabelas

Tabelas longas quebram entre páginas, ideais para relatórios, extratos, notas e faturas.

Fontes padrão embutidas

As fontes padrão do mecanismo estão prontas para uso e cobrem acentos e símbolos comuns. Fontes próprias podem ser embutidas via @font-face com data: URI. Fontes referenciadas por URL (como Google Fonts) não são baixadas.

Imagens

Embutidas no HTML como data: URI ou por URL https pública, nos formatos JPG e PNG.

Seguro por padrão

JavaScript não é executado e endereços internos ou privados são bloqueados no download de imagens.

Limites e o que não é suportado

  • Requisições de no máximo 1 MB (HTML e imagens embutidas).
  • JavaScript não é executado.
  • CSS, fontes e scripts externos por URL não são baixados.
  • Imagens por URL: só https, só JPG/PNG, só endereços públicos, com limites de tamanho e de tempo.

Dica para resultados previsíveis

Coloque o CSS numa tag <style> no próprio documento, embuta imagens pequenas como data: URI e monte o HTML final no seu servidor, com o template engine que você já usa, antes de enviar.

// código aberto

100% código aberto, sob a GNU AGPL v3

O código que processa os seus documentos está publicado no GitHub. Você não precisa confiar só na nossa palavra: pode ler, auditar e verificar como o PDF Services funciona.

  • Aberto e auditável

    Veja como o HTML é tratado, o que é registrado e como a cobrança funciona. O código-fonte do serviço é público.

  • Construído sobre o iText

    A conversão usa a biblioteca iText (pdfHTML), também licenciada sob a AGPL.

  • Identificado em cada PDF

    Os PDFs gerados trazem no metadado “Producer” o texto CodeCycle AGPL PDF Services (https://pdfservices.sistema.site), seguido da identificação da versão AGPL do iText.

Código-fonte completo do serviço: API de conversão, painel do cliente e este site.

AGPL-3.0 iText pdfHTML Público
Exemplo dos metadados de um PDF gerado pelo serviço.
pdfinfo documento.pdf
$ pdfinfo documento.pdf
Producer:  CodeCycle AGPL PDF Services (https://pdfservices.sistema.site)
           # ...seguido da identificação da versão AGPL do iText
Pages:     1
// perguntas frequentes

Perguntas frequentes

Quanto custa usar o PDF Services?

R$ 0,001 por conversão bem-sucedida, debitado de créditos pré-pagos em reais. Não há mensalidade, plano mínimo nem créditos gratuitos para novas contas. Conversões que falham, como um HTML que não pode ser convertido, não são cobradas.

Como adiciono créditos à minha conta?

Nesta fase, os créditos são adicionados pela CODECYCLE: fale conosco informando a sua conta. A compra online de créditos estará disponível em breve. Saldo e consumo ficam visíveis no painel. O saldo serve só para pagar conversões e não é resgatável em dinheiro.

Qual o tamanho máximo de um documento?

Cada requisição pode ter até 1 MB, incluindo o HTML e as imagens embutidas como data: URI. Acima disso, a API responde 413 payload_too_large. Imagens referenciadas por URL são baixadas pelo serviço e têm limites próprios de tamanho e de tempo.

Como incluo imagens no PDF?

De duas formas: embutidas no HTML como data: URI, ou referenciadas por URL https pública, nos formatos JPG ou PNG. Endereços internos ou privados são bloqueados, e imagens que não atendam a essas condições podem não aparecer no PDF.

Posso usar CSS externo e minhas próprias fontes?

Folhas de estilo, fontes e scripts referenciados por URL não são baixados. Coloque o CSS numa tag <style> ou em atributos style. Fontes por URL (como Google Fonts) são ignoradas e o texto usa as fontes padrão do mecanismo, que já cobrem acentos e símbolos comuns. Para usar uma fonte própria, embuta-a com @font-face e src: url(data:font/ttf;base64,...). O arquivo da fonte conta no limite de 1 MB da requisição.

O JavaScript da página é executado?

Não. O conteúdo gerado por JavaScript (gráficos, tabelas montadas no navegador) não aparece no PDF. Monte o HTML final no seu servidor antes de enviar; para gráficos, envie-os como imagem PNG.

Vocês guardam o HTML ou o PDF?

Não. Os dois são processados só em memória e nunca são armazenados nem registrados em logs. Guardamos apenas metadados da transação (data/hora, capacidade, chave usada, valor, saldo, tamanhos em bytes e duração) e registros de acesso (IP e data/hora) por 6 meses, como exige o Marco Civil da Internet. Por isso, não conseguimos recuperar um documento já convertido. Detalhes na Política de Privacidade.

O que a licença AGPL significa para a minha empresa?

O código do PDF Services e a biblioteca iText são licenciados sob a GNU AGPL v3. A licença rege o código-fonte do software (uso, modificação e redistribuição), e a contratação do serviço hospedado é regida pelos Termos de Uso. Os PDFs gerados trazem essa identificação no metadado “Producer”. Não prestamos aconselhamento jurídico: recomendamos que sua empresa avalie as implicações da AGPL com a assessoria jurídica.

Como excluo minha conta?

Pelo painel, a qualquer momento, confirmando a senha. A exclusão é irreversível: nome, e-mail e hash da senha são apagados e todas as chaves de API são revogadas. O saldo remanescente é perdido. Razão social, CNPJ e histórico de transações são mantidos de forma anonimizada pelo prazo exigido por lei, conforme o art. 16 da LGPD.

Como falo com o suporte?

Fale com a CODECYCLE pelo e-mail produtos@codecycle.com.br. Encontrou um bug ou quer sugerir uma melhoria no código? Abra uma issue no repositório no GitHub.

$ pdfservices --init

Pronto para gerar seu primeiro PDF?

Crie a conta da sua empresa, gere uma chave de API e converta HTML em PDF com uma única requisição.